我需要为我对某个 XML RPC 发出的每个请求生成唯一的、增量的、数字的事务 ID。这些数字只需要在我的域中是唯一的,但会在多台机器上生成。
我真的不想在数据库中跟踪这个数字并处理每个事务的行锁定等。我尝试使用微秒时间戳来破解它,但只有几个线程发生冲突——我的应用程序需要支持数百个线程。
任何想法,将不胜感激。
编辑:如果每个事务 id 必须比前一个请求的大怎么办?
我需要为我对某个 XML RPC 发出的每个请求生成唯一的、增量的、数字的事务 ID。这些数字只需要在我的域中是唯一的,但会在多台机器上生成。
我真的不想在数据库中跟踪这个数字并处理每个事务的行锁定等。我尝试使用微秒时间戳来破解它,但只有几个线程发生冲突——我的应用程序需要支持数百个线程。
任何想法,将不胜感激。
编辑:如果每个事务 id 必须比前一个请求的大怎么办?
如果您要从数百个线程中使用它,在多台机器上工作,并且需要一个增量 ID,那么您将需要一些集中的地方来存储和锁定最后生成的 ID 号。这不一定必须在数据库中,但这将是最常见的选择。一个只提供 ID 的中央服务器可以提供相同的功能,但这可能会破坏分发它的目的。
如果它们需要增量,任何形式的时间戳都不能保证是唯一的。
如果您不需要它们是增量的,则 GUID 可以工作。可能对每个系统上的时间戳和硬件 ID 进行某种类型的合并可以提供唯一的标识符,但 ID 号部分不一定是唯一的。
您可以使用一对硬件 ID + 增量时间戳吗?这将使每台特定机器的 ID 递增,但不一定在整个域中是唯一的。
- - 编辑 - - -
我认为使用任何形式的时间戳都不适合您,原因有两个。
首先,您永远无法保证不同机器上的 2 个线程不会尝试在完全相同的时间进行调度,无论您使用什么分辨率的计时器。在足够高的分辨率下,这是不可能的,但不能保证。
其次,要完成这项工作,即使您可以解决上面的冲突问题,您也必须让每个系统都具有完全相同的时钟,精度为微秒,这并不实际。
这是一个非常困难的问题,特别是如果您不想造成性能瓶颈。您说 ID 需要是“增量的”和“数字的”——这是具体的业务约束,还是出于其他目的而存在的约束?
如果这些不是必需的,您可以使用 UUID,大多数常见平台都有库。它们允许您在很短的时间内生成许多(数百万!)ID,并且在没有冲突的情况下非常舒适。维基百科上的相关文章声称:
换句话说,仅在接下来的 100 年每秒生成 10 亿个 UUID 之后,仅创建一个副本的概率约为 50%。
如果您从需求中删除“增量”,则可以使用GUID。
如果没有某种通用数据,我看不出如何跨多个进程实现增量。
如果您以 Windows 平台为目标,您是否尝试过Interlocked API?
谷歌为您正在寻找的任何语言提供 GUID 生成器,然后如果您真的需要它是数字,则将其转换为数字。虽然它不是增量的。
或者让每个线程“保留”一千个(或百万,或十亿个)事务 ID,并一次分发一个,并在用完时“保留”下一组。仍然不是真正的增量。
我是 GUID 人群,但如果这不可能,您可以考虑在重量级数据库上使用db4o或SQL Lite吗?
如果每个客户端都可以跟踪自己的“下一个 id”,那么您可以与 sentral 服务器通信并获取一系列 id,一次可能是 1000 个。一旦客户端的 id 用完,它将不得不再次与服务器通信。
这将使您的系统拥有 id 的中央来源,并且仍然避免必须为每个 id 与数据库对话。