如何生成分散式唯一時間戳識別符號 - vanillajava
本文介紹了一個直接支援分散式識別符號生成的實現。
1. 分散式系統中的併發識別符號生成
每個主機都有一個預定義的唯一主機識別符號或hostId 。
TimeProvider[url=https://github.com/OpenHFT/Chronicle-Core/blob/ea/src/main/java/net/openhft/chronicle/core/time/TimeProvider.java] [/url]提供了同時最多100 個主機生成不同的主機識別符號。
2. 帶有主機識別符號的納秒時間戳
DistributedUniqueTimeProvider將主機識別符號儲存在時間戳的低兩位數字中,使其更易於閱讀。
這使您可以在多達 100 臺機器上生成有保證的唯一識別符號。
同一臺機器上的多個 JVM 共享一個 hostId。
時間戳在 hostId 為 28 的機器上看起來像這樣:
2021-12-28T14:07:02.9541001 28 |
前面是時間:日期/時間/微秒
最後兩位數字是主機識別符號
這樣更容易在時間戳中檢視來源。
這提供了十分之一微秒(數百納秒)的解析度。 無論如何,這通常是許多系統中可用掛鐘的限制。
預設情況下,可以在命令列上使用-DhostId= xx將hostId設定為系統屬性,或者通過呼叫
DistributedUniqueTimeProvider.INSTANCE.hostId(hostId) ; |
使用主機識別符號加速分配
通過預配置的主機識別符號並跟蹤共享記憶體中的最新識別符號,能夠實現跨機器快速併發生成識別符號,達到每秒十億的理論極限。
方法很簡單:取當前時間,去掉低兩位數字並新增hostId,只要這高於最後一個識別符號,就可以了。
如果機器發生故障,最後一個識別符號的資訊丟失,假設重新啟動服務的時間足以確保沒有重疊。
如果服務失敗了,但機器沒有,資訊就會被保留。
下面程式碼使用了開源庫Chronicle Bytes支援的共享記憶體中的 MappedFile :
@Override public long currentTimeNanos() throws IllegalStateException { long time provider.currentTimeNanos(); long timeo bytes.readVolatileLong(LAST_TIME); long timeN = time - time % HOST_IDS + hostid; if (timeN > timeo && bytes.compareAndSwapLong(LAST_TIME, timeo, timeN)) return timeN; return currentTimeNanosLoop(); |
使用 JMH測試:
On an i9-10980HK Benchmark Mode Cnt Score Error Units DistributedUniqueTimeProviderBenchmark.currentTimeNanos avgt 25 37.395 ± 0.391 ns/op DistributedUniqueTimeProviderBenchmark.randomUUID avgt 25 207.709 ± 1.586 ns/op On a Ryzen 9 5950X Benchmark Mode Cnt Score Error Units DistributedUniqueTimeProviderBenchmark.currentTimeNanos avgt 25 43.557 ± 0.801 ns/op DistributedUniqueTimeProviderBenchmark.randomUUID avgt 25 265.285 ± 2.690 ns/op |
這種方法比UUID快6倍
相關文章
- js如何生成唯一識別符號UUIDJS符號UI
- 分散式系統唯一主鍵識別符號ID生成機制比較 - Encore分散式符號
- 高併發下,php使用uniqid函式生成唯一識別符號的四種方案PHP函式符號
- Hibernate識別符號生成器符號
- python之uuid通用唯一識別符號模組PythonUI符號
- iOS怎樣獲取裝置唯一識別符號iOS符號
- JavaScript生成GUID統一識別符號JavaScriptGUI符號
- 分散式唯一id生成策略分散式
- 時間型別和時間戳型別時間戳
- 分散式唯一 ID 生成器分散式
- 分散式唯一ID生成服務分散式
- JavaScript 識別符號JavaScript符號
- 命令識別符號(轉)符號
- 探尋UUID的起源與奧秘:從時間戳到唯一標識UI時間戳
- AppID 的英文全稱是 Application Identifier AppID(應用程式識別符號)GUID(全域性唯一識別符號)APPIDE符號GUI
- python的識別符號Python符號
- 06:合法 C 識別符號符號
- 《Effective Go》--空白識別符號Go符號
- oracle 識別符號規範Oracle符號
- aix 系統識別符號AI符號
- 正規表示式g全域性匹配識別符號符號
- 轉換時間戳的函式時間戳函式
- Java資料型別、識別符號Java資料型別符號
- 分散式唯一ID的幾種生成方案分散式
- MySQL時間戳、時間MySql時間戳
- C語言-識別符號命名C語言符號
- 識別符號與關鍵字符號
- java基本無法-識別符號Java符號
- Oracle 12.2 長識別符號Oracle符號
- 標準HTML識別符號 (轉)HTML符號
- php時間戳函式mktime()PHP時間戳函式
- mysql資料庫時間戳函式MySql資料庫時間戳函式
- 研究分散式唯一ID生成,看完這篇就夠分散式
- PHP 實現 Snowflake 生成分散式唯一 IDPHP分散式
- 分散式系統中唯一 ID 的生成方法分散式
- JavaScript 時間戳JavaScript時間戳
- kafka時間戳Kafka時間戳
- 如何獲取Android唯一標識(唯一序列號)Android