生成单调递增的整数(最大64位)

时间:2016-04-04 07:36:21

标签: java soa distributed-system datapersistance

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

  1. 服务不需要产生连续的整数,只要它产生单调递增的整数就应该没问题
  2. 它应该产生64位整数
  3. 服务应该高度可用
  4. 服务应该能够适应故障(或重新启动)
  5. 我计划使用redis(INCR)作为具有复制启用功能的后端存储,但问题是如果主服务器redis失败,那么服务可能会丢失一些整数(想想之前即使更新流向slave,master崩溃,服务也可能会丢失一些整数,即service可以生成一个小于已生成值的数字。)

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

2 个答案:

答案 0 :(得分:2)

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

例如,如果您有一个数据库服务器,那么Oracle数据库序列就可以完成。但是一旦你进入一组机器,就会在每个集群成员中配置批量的整数,并在成员被命中时按顺序分配它们。它们保证是独一无二的,但不会单调增加。

可能你可以建立一个基于时间的系统(如果可能的话,达到纳秒精度),以及检测和调整重复的逻辑。这不会高度可用......

就个人而言,我会重新审视推动这一需求的业务需求。这是真的吗?例如,在过去,如果所有销售人员使用相同的订单簿,则订单数量是连续的。但是,一旦旅行销售人员成为常态,如果没有一个通过电话发出订单号码的职员,这很难实现。高可用性?不是真的。

答案 1 :(得分:2)

你要的是一个时钟。

相对而言,这是不可能的

有关优秀的教程,请参阅此wikipedia article

  

根据狭义相对论,不可能说   从绝对意义上讲,两个不同的事件同时发生   如果那些事件在太空中分开例如,车祸中   伦敦和纽约的另一个似乎同样发生在纽约   时间到地球上的观察者,似乎已经发生在   与飞机之间飞行的观察者略有不同的时间   伦敦和纽约。事件是否存在的问题   同时是相对的:在静止地球参考系中   两起事故可能同时发生,但在其他情况下(在一起   相对于事件的不同运动状态)伦敦的崩溃   可能首先发生,而在其他框架中纽约崩溃可能会发生   首先发生。但是,如果这两个事件可能因果关系   (即事件A和事件B之间的时间大于   它们之间的距离除以光速),顺序是   保留(即"事件A在事件B&#34之前;)在所有帧中   参考

实际上它很简单

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

  • 所有参与者都是地球界限(共享相同的参照系),或者
  • 感兴趣的事件是因果关系。

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