java 分布式序列号_分布式序列号生成?
問題
我一般在過去使用數(shù)據(jù)庫序列實現(xiàn)了序列號生成。
我很好奇,因為如何為沒有數(shù)據(jù)庫的大型分布式系統(tǒng)生成序列號。對于多個客戶,a線程安全手冊中是否有任何實現(xiàn)序列號生成的最佳實踐經(jīng)驗或建議?
#1 熱門回答(105 贊)
好的,這是一個非常古老的問題,我現(xiàn)在第一次看到它。
你需要區(qū)分序列號和唯一ID,這些ID(可選)可以按特定條件(通常為生成時間)進(jìn)行松散排序。真正的序列號意味著知道所有其他工作者所做的事情,因此需要共享狀態(tài)。沒有簡單的方法以分布式,高規(guī)模的方式這樣做。你可以查看網(wǎng)絡(luò)廣播,每個工作人員的窗口范圍以及distributed hash tables for unique worker IDs等內(nèi)容,但這需要做很多工作。
唯一ID是另一個問題,有幾種以分散方式生成唯一ID的好方法:
a)你可以使用Twitter's Snowflake ID network service.Snowflake是:
網(wǎng)絡(luò)服務(wù),即你進(jìn)行網(wǎng)絡(luò)呼叫以獲取唯一ID;
產(chǎn)生按生成時間排序的64位唯一ID;
該服務(wù)具有高度可擴(kuò)展性和(可能)高度可用性;每個實例每秒可以生成數(shù)千個ID,你可以在LAN / WAN上運行多個實例;
用Scala編寫,在JVM上運行。
b)你可以使用從how UUIDs派生的方法在客戶端本身生成唯一ID,并制作Snowflake的ID。有多種選項,但有些內(nèi)容如下:
最重要的40位左右:時間戳; ID的生成時間。 (我們使用時間戳的最高位來按生成時間對ID進(jìn)行排序。)
接下來的14個位:每個發(fā)生器計數(shù)器,每個生成器為每個生成的新ID遞增1。這可確保在同一時刻生成的ID(相同時間戳)不重疊。
最后10位:每個發(fā)生器的唯一值。使用它,我們不需要在生成器之間進(jìn)行任何同步(這是非常困難的),因為所有生成器都會因為此值而生成非重疊的ID。
c)你可以使用a**時間戳和隨機(jī)值在客戶端上生成ID。**這樣就無需了解所有生成器,并為每個生成器分配一個唯一值。另一方面,這些ID不保證是全球唯一的,它們很可能是唯一的。 (要碰撞,一個或多個生成器必須在同一時間創(chuàng)建相同的隨機(jī)值。)以下內(nèi)容:
最重要的32位:時間戳,ID的生成時間。
最低有效32位:32位隨機(jī)性,為每個ID重新生成。
#2 熱門回答(15 贊)
你可以讓每個節(jié)點都有一個唯一的ID(無論如何都可以使用),然后將其添加到序列號中。
例如,節(jié)點1生成序列001-00001 001-00002 001-00003等,節(jié)點5生成005-00001 005-00002
獨特 :-)
或者,如果你想要某種集中式系統(tǒng),你可以考慮讓你的序列服務(wù)器以塊的形式給出。這顯著降低了開銷。例如,不是從中央服務(wù)器為每個必須分配的ID請求新ID,而是從中央服務(wù)器請求10,000個塊中的ID,然后在用完時只需要執(zhí)行另一個網(wǎng)絡(luò)請求。
#3 熱門回答(13 贊)
現(xiàn)在有更多的選擇。
你這個問題是"老",我來到這里,所以我認(rèn)為留下我所知道的選項(到目前為止)可能是有用的:
你可以試試Hazelcast。在它的1.9版本中,它包含了java.util.concurrent.AtomicLong的Distributed實現(xiàn)
你也可以使用Zookeeper。它提供了創(chuàng)建序列節(jié)點的方法(附加到znode名稱,我更喜歡使用節(jié)點的版本號)。你要小心這一點:如果你不想在你的序列中錯過數(shù)字,那可能不是你想要的。
干杯
總結(jié)
以上是生活随笔為你收集整理的java 分布式序列号_分布式序列号生成?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: macOS苹果电脑下载m3u8、ts视频
- 下一篇: mysql的数据备份及恢复