簡體   English   中英

如何通過部署在沒有數據庫的多個服務器上的服務為每個呼叫生成一個 16 位唯一號碼?

[英]How to generate a 16 digit unique number for each call by a service deployed on multiple servers without database?

我有一個 Java 服務,它使用當前時間以 yymmddhhmmssmsms 格式生成一個 16 位唯一數字。 它使用 Atomic Long 在同一毫秒內處理多個調用。 但是現在的問題是我需要在多台雲機器上使用這個服務。 如何在不同的服務器上以相同的微秒處理呼叫並為每個呼叫生成一個唯一的號碼。 我不想為此使用數據庫。

編輯:我知道 UUID 可以是一個解決方案。 但是 UUID 會生成一個隨機編號。 每次都不是唯一的,盡管碰撞的機會非常低。

一想,可以嘗試使用 UUID.randomUUID() object

UUID v4 是分布式系統的正確選擇。

UUID v4 實現使用隨機數作為源。 Java 實現是 SecureRandom - 它使用不可預測的值作為種子來生成隨機數以減少沖突的機會。 來源: https://www.baeldung.com/java-uuid

安全隨機:此 class 提供加密強隨機數生成器 (RNG)。 資料來源: https://docs.oracle.com/javase/8/docs/api/java/security/SecureRandom.html

如何使用 UUID 的示例:

UUID uuid = UUID.randomUUID();

僅在以下情況下才應僅使用隨機數(例如隨機 UUID):

  • 您有辦法在所有呼叫中檢查號碼的唯一性,或者
  • 您可以容忍為不同的呼叫生成相同號碼的風險。

如果您認為合適,請嘗試為每個服務器分配一個唯一編號(例如,通過從中央數據庫請求一個唯一編號)。 然后,每個服務器可以通過在該唯一編號上附加一個隨機數來為其發出的每個調用生成一個唯一 ID; 這可能會很好,因為服務器現在可以更輕松地檢查它生成的 ID 的唯一性,因為不需要進一步聯系中央數據庫或其他服務器。

另請參閱我關於生成唯一隨機標識符的部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM