如何生成分散式唯一時間戳識別符號 - 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分散式符號
- python之uuid通用唯一識別符號模組PythonUI符號
- Android開發 - UUID 類通用唯一識別符號解析AndroidUI符號
- AppID 的英文全稱是 Application Identifier AppID(應用程式識別符號)GUID(全域性唯一識別符號)APPIDE符號GUI
- 識別符號符號
- 分散式唯一id生成策略分散式
- 時間型別和時間戳型別時間戳
- 分散式唯一 ID 生成器分散式
- vit中的生成分類識別符號介紹符號
- 探尋UUID的起源與奧秘:從時間戳到唯一標識UI時間戳
- python的識別符號Python符號
- 分散式唯一 ID 生成器 - IDGen分散式
- [MySQL] MySQL資料庫中唯一識別符號(ID)的梳理總結MySql資料庫符號
- 使用去中心化識別符號 (DID) 作為識別符號元系統中心化符號
- 正規表示式g全域性匹配識別符號符號
- Java資料型別、識別符號Java資料型別符號
- 時間戳和正規表示式時間戳
- PHP 實現 Snowflake 生成分散式唯一 IDPHP分散式
- 分散式唯一ID的幾種生成方案分散式
- 獲取時間戳,幾個時間點的時間戳時間戳
- MySQL時間戳、時間MySql時間戳
- C語言-識別符號命名C語言符號
- 識別符號與關鍵字符號
- java基本無法-識別符號Java符號
- 研究分散式唯一ID生成,看完這篇就夠分散式
- JavaScript 時間戳JavaScript時間戳
- kafka時間戳Kafka時間戳
- python:LEGB識別符號解析順序Python符號
- SCSS &父選擇器識別符號CSS符號
- URI(統一資源識別符號)符號
- go——識別符號的命名規範Go符號
- 字串切片識別符號是什麼字串符號
- JavaSE 關鍵字和識別符號Java符號
- 1413: C語言合法識別符號C語言符號
- 關鍵字、資料型別、識別符號資料型別符號
- C# 時間戳轉時間C#時間戳
- 生成分散式唯一ID的幾種解決方案分散式