我有一个Java服务,该服务使用yymmddhhmmssmsmsms格式使用当前时间生成一个16位唯一编号。并且它使用Atomic Long在同一毫秒内处理多个呼叫。 但是现在的问题是我需要在多台云计算机上使用此服务。如何在不同服务器上的同一微秒内处理呼叫,并为每个呼叫生成唯一的号码。 我不想为此使用数据库。
编辑: 我了解UUID可以解决。但是,UUID会生成一个随机编号。尽管碰撞的机会非常低,但每次都并非唯一。
我有一个Java服务,该服务使用yymmddhhmmssmsmsms格式使用当前时间生成一个16位唯一编号。并且它使用Atomic Long在同一毫秒内处理多个呼叫。 但是现在的问题是我需要在多台云计算机上使用此服务。如何在不同服务器上的同一微秒内处理呼叫,并为每个呼叫生成唯一的号码。 我不想为此使用数据库。
编辑: 我了解UUID可以解决。但是,UUID会生成一个随机编号。尽管碰撞的机会非常低,但每次都并非唯一。
想一想,您可以尝试使用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上的部分。