簡體   English   中英

如何使用無狀態服務跟蹤隨機數

[英]How do I track random numbers with stateless services

我有一個設計問題,我正在尋找一種有效的方法來解決:

我有運行單個服務的三個實例。 每個實例都是完全無狀態的,並公開一個端點/token 當客戶端調用/token端點時,會返回一個隨機數。 隨機數由非重復偽隨機數生成器生成,該生成器在前 n 次被調用時生成唯一的隨機整數,然后在接下來的 n 次被調用時重復相同的序列。 換句話說,它是 n 個值的重復循環。 所以說n = 20 ,它會在前 20 次被調用時返回 0 到 20 范圍內的唯一值。

這里的問題是:假設我運行了該服務的三個實例,我如何避免重復隨機整數,因為任何服務都不知道它們中的任何一個生成了什么隨機值。

這是我所做的:

  • 我已經作為環境變量傳遞了一個種子值,以確保所有服務都生成相同的隨機序列。

  • 我已經設置了一個數據庫,這些服務中的每一個都可以遠程訪問。 它有一個表,單列map設置為默認值0

  • 當客戶端調用服務的/token端點時,該服務會將map列中的值加 1 並獲取結果值。

  • 然后我返回這個結果值在隨機序列中映射到的隨機數

上述方法有效嗎? 服務在嘗試訪問數據庫行時是否會遇到競爭條件? 這個問題可以在沒有數據庫的情況下解決嗎?

建議將不勝感激。

提前致謝

聽起來可以用雪花——

而不是常規整數,它們將再次成為整數,但您需要在其中編碼一些信息,您可以構造它們以便它們按位對信息進行編碼。

因此,假設您的整數將是 64 位。 您可以為服務保留 x 位,可以為種子保留 y 位,為“真實”ID 保留 z 位。(例如日期時間刻度)。

這樣做,您將得到類似 0001 (serviceid) (x=4) 1010 (z=4) (您的 n=20) 0101....0 (日期時間刻度為 58 位)的內容。

所以現在你可以通過 serviceId 識別你生成的數字,給它們一些種子(也許是配置)和一些“真實”的部分。

你可以從這里找到更多關於雪花的信息

暫無
暫無

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

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