如何在没有数据库的情况下为部署在多个服务器上的服务为每个呼叫生成16位唯一号码?

我有一个Java服务,该服务使用yymmddhhmmssmsmsms格式使用当前时间生成一个16位唯一编号。并且它使用Atomic Long在同一毫秒内处理多个呼叫。 但是现在的问题是我需要在多台云计算机上使用此服务。如何在不同服务器上的同一微秒内处理呼叫,并为每个呼叫生成唯一的号码。 我不想为此使用数据库。

编辑: 我了解UUID可以解决。但是,UUID会生成一个随机编号。尽管碰撞的机会非常低,但每次都并非唯一。

wdd16617723 回答:如何在没有数据库的情况下为部署在多个服务器上的服务为每个呼叫生成16位唯一号码?

想一想,您可以尝试使用UUID.randomUUID()对象

,

UUID v4是分布式系统的正确选择。

  

UUID v4实现使用随机数作为源。 Java   实现是SecureRandom –使用不可预测的值作为   种子产生随机数,以减少   碰撞。   来源:https://www.baeldung.com/java-uuid

     

安全随机数:此类提供了加密强度高的随机数生成器(RNG)。来源:https://docs.oracle.com/javase/8/docs/api/java/security/SecureRandom.html

示例如何使用UUID:

UUID uuid = UUID.randomUUID();
,

仅在以下情况下才应单独使用随机数(例如随机UUID):

  • 您可以通过一种方法来检查所有呼叫中号码的唯一性,或者
  • 您可以容忍为不同的电话生成相同号码的风险。

如果发现合适,请尝试为每个服务器分配一个唯一编号(例如,通过从中央数据库请求一个唯一编号)。然后,每台服务器都可以通过在该唯一号码后附加一个随机数,为每个呼叫生成唯一的ID;这可能行之有效,因为服务器现在可以更轻松地检查其生成的ID的唯一性,因为不需要与中央数据库或其他服务器进行进一步的联系。

另请参阅我在generating unique random identifiers上的部分。

本文链接:https://www.f2er.com/3161170.html

大家都在问