我需要为每个对某个XML RPC发出的请求生成唯一的增量数字事务ID。这些数字只需要在我的域中唯一,但将在多台计算机上生成。
我真的不想在数据库中跟踪这个数字并在每个事务处理行锁定等。我尝试使用微秒时间戳来破解它,但只有几个线程发生冲突 - 我的应用程序需要支持数百个线程。
任何想法都会受到赞赏。
编辑:如果每个交易ID必须大于之前的请求,该怎么办?
答案 0 :(得分:4)
如果你要在数百个线程中使用它,在多台机器上工作,并且需要增量ID,那么你需要一些集中的地方来存储和锁定最后生成的ID号。这不一定必须在数据库中,但这是最常见的选择。除了提供ID之外什么都不做的中央服务器可以提供相同的功能,但这可能会破坏分发它的目的。
如果需要增量,则不保证任何形式的时间戳都是唯一的。
如果您不需要它们是增量的,GUID就可以工作。可能在每个系统上进行时间戳+硬件ID的某种类型的合并可以提供唯一标识符,但ID号部分不一定是唯一的。
您可以使用一对硬件ID +增量时间戳吗?这将使每个特定计算机的ID增量,但不一定在整个域中是唯一的。
----编辑-----
我认为使用任何形式的时间戳都不适合你,原因有两个。
首先,无论您使用何种分辨率的计时器,您都无法保证不同机器上的2个线程不会尝试在同一时间安排。在足够高的分辨率下,它不太可能,但不能保证。
第二,要做到这一点,即使你能解决上面的碰撞问题,你也必须让每个系统都具有完全相同的时钟,精确度为微秒,这实际上并不实用。
答案 1 :(得分:1)
这是一个非常棘手的问题,特别是如果您不想创建性能瓶颈。你说ID需要是'增量'和'数字' - 这是一个具体的业务约束,还是出于其他目的而存在的?
如果不需要这些,您可以使用UUID,大多数常见平台都有UUID。它们允许您在非常短的时间内生成许多(数百万!)的ID,并且在没有碰撞的情况下非常舒适。关于维基百科的相关文章声称:
换句话说,只有在生成之后 每秒10亿UUID用于 未来100年的概率 只创建一个副本就可以了 大约50%。
答案 2 :(得分:0)
如果您从要求中删除“增量”,则可以使用GUID。
我没有看到如何在没有某种常见数据的情况下在多个流程中实现增量。
答案 3 :(得分:0)
如果您定位到Windows平台,是否尝试Interlocked API?
答案 4 :(得分:0)
Google for GUID generators用于您正在寻找的任何语言,然后将其转换为数字,如果您确实需要它为数字。但它不是增量的。
或让每个线程“保留”一千(或百万或十亿)个交易ID并一次一个地交出,并在它用尽时“保留”下一个交易ID。仍然没有真正增量。
答案 5 :(得分:0)
答案 6 :(得分:0)
如果每个客户端都可以跟踪自己的“下一个ID”,那么您可以与一个发送服务器通信并获取一系列ID,一次可能是1000。一旦客户端用完了id,就必须再次与服务器通信。
这将使您的系统具有id的中心源,并且仍然避免与每个id的数据库通信。