3

我需要为我对某个 XML RPC 发出的每个请求生成唯一的、增量的、数字的事务 ID。这些数字只需要在我的域中是唯一的,但会在多台机器上生成。

我真的不想在数据库中跟踪这个数字并处理每个事务的行锁定等。我尝试使用微秒时间戳来破解它,但只有几个线程发生冲突——我的应用程序需要支持数百个线程。

任何想法,将不胜感激。

编辑:如果每个事务 id 必须比前一个请求的大怎么办?

4

7 回答 7

4

如果您要从数百个线程中使用它,在多台机器上工作,并且需要一个增量 ID,那么您将需要一些集中的地方来存储和锁定最后生成的 ID 号。这不一定必须在数据库中,但这将是最常见的选择。一个只提供 ID 的中央服务器可以提供相同的功能,但这可能会破坏分发它的目的。

如果它们需要增量,任何形式的时间戳都不能保证是唯一的。

如果您不需要它们是增量的,则 GUID 可以工作。可能对每个系统上的时间戳和硬件 ID 进行某种类型的合并可以提供唯一的标识符,但 ID 号部分不一定是唯一的。

您可以使用一对硬件 ID + 增量时间戳吗?这将使每台特定机器的 ID 递增,但不一定在整个域中是唯一的。

- - 编辑 - - -

我认为使用任何形式的时间戳都不适合您,原因有两个。

首先,您永远无法保证不同机器上的 2 个线程不会尝试在完全相同的时间进行调度,无论您使用什么分辨率的计时器。在足够高的分辨率下,这是不可能的,但不能保证。

其次,要完成这项工作,即使您可以解决上面的冲突问题,您也必须让每个系统都具有完全相同的时钟,精度为微秒,这并不实际。

于 2009-03-13T15:38:47.647 回答
1

这是一个非常困难的问题,特别是如果您不想造成性能瓶颈。您说 ID 需要是“增量的”和“数字的”——这是具体的业务约束,还是出于其他目的而存在的约束?

如果这些不是必需的,您可以使用 UUID,大多数常见平台都有库。它们允许您在很短的时间内生成许多(数百万!)ID,并且在没有冲突的情况下非常舒适。维基百科上的相关文章声称:

换句话说,仅在接下来的 100 年每秒生成 10 亿个 UUID 之后,仅创建一个副本的概率约为 50%。

于 2009-03-13T15:40:20.857 回答
0

如果您从需求中删除“增量”,则可以使用GUID

如果没有某种通用数据,我看不出如何跨多个进程实现增量。

于 2009-03-13T15:38:02.737 回答
0

如果您以 Windows 平台为目标,您是否尝试过Interlocked API

于 2009-03-13T15:42:20.727 回答
0

谷歌为您正在寻找的任何语言提供 GUID 生成器,然后如果您真的需要它是数字,则将其转换为数字。虽然它不是增量的。

或者让每个线程“保留”一千个(或百万,或十亿个)事务 ID,并一次分发一个,并在用完时“保留”下一组。仍然不是真正的增量。

于 2009-03-13T15:43:01.040 回答
0

我是 GUID 人群,但如果这不可能,您可以考虑在重量级数据库上使用db4oSQL Lite吗?

于 2009-03-13T15:56:38.057 回答
0

如果每个客户端都可以跟踪自己的“下一个 id”,那么您可以与 sentral 服务器通信并获取一系列 id,一次可能是 1000 个。一旦客户端的 id 用完,它将不得不再次与服务器通信。

这将使您的系统拥有 id 的中央来源,并且仍然避免必须为每个 id 与数据库对话。

于 2009-03-13T16:03:23.080 回答