3

作为新项目的一部分,我们需要一个可以生成单调递增整数的服务。对服务的要求是:

  1. 服务不需要产生连续的整数,只要它产生单调递增的整数就可以了
  2. 它应该产生 64 位整数
  3. 服务应该是高可用的
  4. 服务应该能够适应故障(或重新启动)

我打算使用 redis ( INCR) 作为支持复制的后端存储,但问题是如果主 redis 失败,那么服务可能会丢失一些整数(认为在更新流向从属之前,主崩溃然后服务可能会丢失一些整数,即服务可以生成一个小于已生成值的数字)。

有人可以帮我设计这样的系统/服务吗?

4

2 回答 2

2

你要一个时钟。

相对来说是不可能的

有关出色的教程,请参阅此wikipedia 文章

根据狭义相对论,如果两个不同的事件在空间上是分开的,就不可能在绝对意义上说两个不同的事件同时发生。例如,伦敦和纽约的一场车祸,对于地球上的观察者来说似乎是同时发生的,而对于在伦敦和纽约之间飞行的飞机上的观察者来说,发生的时间似乎略有不同. 事件是否同时发生的问题是相对的:在静止的地球参考坐标系中,两个事故可能同时发生,但在其他坐标系中(相对于事件处于不同的运动状态),伦敦的碰撞可能首先发生,在其他框架中,纽约崩溃可能首先发生。但是,如果这两个事件可以因果联系(即

实际上,这是微不足道的

最有可能的是,对您的业务需求的分析会表明,

  • 所有参与者都受地球约束(共享相同的参考系),或者
  • 感兴趣的事件是因果联系的。

在这种情况下,一个简单的 NTP 就足够了。政府已经提供了这项服务。 http://tf.nist.gov/tf-cgi/servers.cgi

于 2016-04-04T08:45:50.597 回答
2

你的要求1和3有些矛盾。单调增加的要求意味着单个服务必须提供值,而这不会是高度可用的。

例如,如果您只有一个数据库服务器,Oracle 数据库序列就可以解决问题。但是一旦你进入一个机器集群,成批的整数会被配置到每个集群成员中,并在成员被命中时按顺序分配。它们保证是唯一的,但不是单调递增的。

可能您可以构建一个基于时间的系统(如果可能,精确到纳秒),并使用逻辑来检测和调整重复项。这不会是高度可用的...

我个人会重新审视推动这种需求的业务需求。这是真的吗?例如,在过去,如果所有销售人员使用相同的订单簿,订单号是连续的。但是,一旦旅行销售人员成为常态,如果没有一个通过电话发布订单号的店员,就很难做到这一点。高可用性?并不真地。

于 2016-04-04T08:08:33.190 回答