作为新项目的一部分,我们需要一种可以生成单调递增整数的服务。服务要求如下:
我计划使用redis(INCR
)作为具有复制启用功能的后端存储,但问题是如果主服务器redis失败,那么服务可能会丢失一些整数(想想之前即使更新流向slave,master崩溃,服务也可能会丢失一些整数,即service可以生成一个小于已生成值的数字。)
有人可以帮我设计这样的系统/服务。
答案 0 :(得分:2)
您的要求1和3有些矛盾。单调增加的要求意味着单一服务必须提供价值,而且不会高度可用。
例如,如果您有一个数据库服务器,那么Oracle数据库序列就可以完成。但是一旦你进入一组机器,就会在每个集群成员中配置批量的整数,并在成员被命中时按顺序分配它们。它们保证是独一无二的,但不会单调增加。
可能你可以建立一个基于时间的系统(如果可能的话,达到纳秒精度),以及检测和调整重复的逻辑。这不会高度可用......
就个人而言,我会重新审视推动这一需求的业务需求。这是真的吗?例如,在过去,如果所有销售人员使用相同的订单簿,则订单数量是连续的。但是,一旦旅行销售人员成为常态,如果没有一个通过电话发出订单号码的职员,这很难实现。高可用性?不是真的。
答案 1 :(得分:2)
你要的是一个时钟。
相对而言,这是不可能的
有关优秀的教程,请参阅此wikipedia article。
根据狭义相对论,不可能说 从绝对意义上讲,两个不同的事件同时发生 如果那些事件在太空中分开例如,车祸中 伦敦和纽约的另一个似乎同样发生在纽约 时间到地球上的观察者,似乎已经发生在 与飞机之间飞行的观察者略有不同的时间 伦敦和纽约。事件是否存在的问题 同时是相对的:在静止地球参考系中 两起事故可能同时发生,但在其他情况下(在一起 相对于事件的不同运动状态)伦敦的崩溃 可能首先发生,而在其他框架中纽约崩溃可能会发生 首先发生。但是,如果这两个事件可能因果关系 (即事件A和事件B之间的时间大于 它们之间的距离除以光速),顺序是 保留(即"事件A在事件B&#34之前;)在所有帧中 参考
实际上它很简单
最有可能的是,对您的业务需求的分析会发现,
在这种情况下,简单的NTP就足够了。政府已经提供这项服务。 http://tf.nist.gov/tf-cgi/servers.cgi