我需要从多个线程生成一个唯一的序列号。我创建了下面的简单类,它似乎有效,但我不确定是否可以依赖序列号的唯一性。
此外,如果超过 999999,我需要能够让数字回到 0。我不希望它滚动很长时间,因为该方法每天调用的次数可能少于 100 次。我知道系统会在有机会达到 999999 之前定期关闭以进行维护。
GetSequenceNumber将从 BizTalk 映射中的 xslt 转换调用该方法,并且可以多次调用该方法(在同一个 BizTalk 主机实例中)。
在我的开发系统上,即使 BizTalk 同时多次调用该方法,它似乎也能正常工作并生成不同的值。开发系统只有一个 BizTalk 主机实例在运行。
然而,在生产系统上,有两台服务器。我是否认为这种方法不能保证跨服务器的唯一性,因为它们运行在不同的应用程序域中?
我无法使用 guid,因为序列号限制为 16 个字符。
public class HelperMethods
{
private static int sequenceNumber = 0;
public string GetSequenceNumber()
{
string result = null;
int seqNo = Interlocked.Increment(ref sequenceNumber);
result = string.Format("{0:MMddHHmmss}{1:000000}", DateTime.Now, seqNo);
return result;
}
}
Run Code Online (Sandbox Code Playgroud)
我认为我可以使用服务器计算机名称并添加一些任意字符,这样即使在一台服务器上生成的序列号与另一台服务器上生成的序列号相同,它仍然会有所不同,但我不确定它有多独特这将是。像这样的东西:
string seqNumber = (MachineName == "Blah" ? "A" : "B") + GetSequenceNumber();
Run Code Online (Sandbox Code Playgroud)
有没有人对我如何创建唯一的序列号有任何建议?它不必是完全独特的,我只需要不太可能发生碰撞。另外,如果以线程安全的方式达到 1000000,我如何将数字重置回 0?
如果服务器的数量预先已知并且不是很大,那么您可以将最高有效数字分配给“服务器 ID”,该数字在每个服务器的配置中设置。例如,在 10 台服务器中,其中一台只能处理 3000000-3999999 范围内的数字。对于 100 台服务器集合中的另一个实例,范围为 4200000-4299999。
最主要的是在配置中包含区分服务器的信息。
| 归档时间: |
|
| 查看次数: |
2149 次 |
| 最近记录: |