日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java 分布式序列号_分布式序列号生成?

發布時間:2024/8/1 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 分布式序列号_分布式序列号生成? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

問題

我一般在過去使用數據庫序列實現了序列號生成。

我很好奇,因為如何為沒有數據庫的大型分布式系統生成序列號。對于多個客戶,a線程安全手冊中是否有任何實現序列號生成的最佳實踐經驗或建議?

#1 熱門回答(105 贊)

好的,這是一個非常古老的問題,我現在第一次看到它。

你需要區分序列號和唯一ID,這些ID(可選)可以按特定條件(通常為生成時間)進行松散排序。真正的序列號意味著知道所有其他工作者所做的事情,因此需要共享狀態。沒有簡單的方法以分布式,高規模的方式這樣做。你可以查看網絡廣播,每個工作人員的窗口范圍以及distributed hash tables for unique worker IDs等內容,但這需要做很多工作。

唯一ID是另一個問題,有幾種以分散方式生成唯一ID的好方法:

a)你可以使用Twitter's Snowflake ID network service.Snowflake是:

網絡服務,即你進行網絡呼叫以獲取唯一ID;

產生按生成時間排序的64位唯一ID;

該服務具有高度可擴展性和(可能)高度可用性;每個實例每秒可以生成數千個ID,你可以在LAN / WAN上運行多個實例;

用Scala編寫,在JVM上運行。

b)你可以使用從how UUIDs派生的方法在客戶端本身生成唯一ID,并制作Snowflake的ID。有多種選項,但有些內容如下:

最重要的40位左右:時間戳; ID的生成時間。 (我們使用時間戳的最高位來按生成時間對ID進行排序。)

接下來的14個位:每個發生器計數器,每個生成器為每個生成的新ID遞增1。這可確保在同一時刻生成的ID(相同時間戳)不重疊。

最后10位:每個發生器的唯一值。使用它,我們不需要在生成器之間進行任何同步(這是非常困難的),因為所有生成器都會因為此值而生成非重疊的ID。

c)你可以使用a**時間戳和隨機值在客戶端上生成ID。**這樣就無需了解所有生成器,并為每個生成器分配一個唯一值。另一方面,這些ID不保證是全球唯一的,它們很可能是唯一的。 (要碰撞,一個或多個生成器必須在同一時間創建相同的隨機值。)以下內容:

最重要的32位:時間戳,ID的生成時間。

最低有效32位:32位隨機性,為每個ID重新生成。

#2 熱門回答(15 贊)

你可以讓每個節點都有一個唯一的ID(無論如何都可以使用),然后將其添加到序列號中。

例如,節點1生成序列001-00001 001-00002 001-00003等,節點5生成005-00001 005-00002

獨特 :-)

或者,如果你想要某種集中式系統,你可以考慮讓你的序列服務器以塊的形式給出。這顯著降低了開銷。例如,不是從中央服務器為每個必須分配的ID請求新ID,而是從中央服務器請求10,000個塊中的ID,然后在用完時只需要執行另一個網絡請求。

#3 熱門回答(13 贊)

現在有更多的選擇。

你這個問題是"老",我來到這里,所以我認為留下我所知道的選項(到目前為止)可能是有用的:

你可以試試Hazelcast。在它的1.9版本中,它包含了java.util.concurrent.AtomicLong的Distributed實現

你也可以使用Zookeeper。它提供了創建序列節點的方法(附加到znode名稱,我更喜歡使用節點的版本號)。你要小心這一點:如果你不想在你的序列中錯過數字,那可能不是你想要的。

干杯

總結

以上是生活随笔為你收集整理的java 分布式序列号_分布式序列号生成?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。