5 大分散式 ID 生成器優缺點簡單對比
點選上方“業餘草”,選擇“置頂公眾號”
第一時間獲取技術乾貨和業界資訊!
首選,不管是不是分散式系統,都有 ID 唯一的使用場景。而在分散式場景下,對 ID 的唯一性要求更嚴格!
常見的,我們上淘寶買東西的訂單 ID,就是一種分散式 ID。淘寶,前期的訂單 id 好像是 14 位,現在好像已經是 16 位,或者 18 位了吧。
以我們公司的訂單 ID 為例,它有這幾個特點。
-
ID 全域性唯一,不會重複
-
ID 的增長支援分散式使用
-
ID 要方便好記,並且通過 ID 能大概看出是什麼時間建立的訂單
-
訂單 ID 最好還能追蹤到銷售員,或下單使用者的 ID 等
-
增長的訂單 ID 還不能讓競爭對手發現你每天的業務量
針對第五項,淺顯的問題就是不能讓非核心運營者知道每天的訂單量等資訊。如果 ID 是連續的,惡意使用者的扒取工作就非常容易做了,直接按照順序下載指定 URL 即可;如果是訂單號就更危險了,競對可以直接知道我們一天的訂單量。所以在一些應用場景下,會需要 ID 無規則、不規則。
所以,設計一個好的分散式 ID 生成器並不是那麼容易的。於是網上也有很多大公司開源這類分散式 ID 生成器。我今天就抽個時間,扯一扯它們之間的不同點吧。
說到,分散式 ID,我們首選想到的可能就是 UUID 了。
UUID
UUID (Universally Unique Identifier) 的標準型式包含 32 個 16 進位制數字,以連字號分為五段,形式為 8-4-4-4-12 的 36 個字元,示例:550e8400-e29b-41d4-a716-446655440000,到目前為止業界一共有 5 種方式生成 UUID。
UUID 的優點:效能非常高:本地生成,沒有網路消耗。
UUID 的缺點:
-
不易於儲存:UUID 太長,16 位元組 128 位,通常以 36 長度的字串表示,很多場景不適用。
-
資訊不安全:基於 MAC 地址生成 UUID 的演算法可能會造成 MAC 地址洩露,這個漏洞曾被用於尋找梅麗莎病毒的製作者位置。
-
ID 作為主鍵時在特定的環境會存在一些問題,比如做 DB 主鍵的場景下,UUID 就非常不適用。MySQL 官方有明確的建議主鍵要儘量越短越好,36 個字元長度的 UUID 不符合要求;UUID 還對 MySQL 索引不利,如果作為資料庫主鍵,在 InnoDB 引擎下,UUID 的無序性可能會引起資料位置頻繁變動,嚴重影響效能。
snowflake
snowflake 我就不在介紹了,我直接說它的優點:
-
毫秒數在高位,自增序列在低位,整個ID都是趨勢遞增的。
-
不依賴資料庫等第三方系統,以服務的方式部署,穩定性更高,生成ID的效能也是非常高的。
-
可以根據自身業務特性分配bit位,非常靈活。
缺點:
-
強依賴機器時鐘,如果機器上時鐘回撥,會導致發號重複或者服務會處於不可用狀態。
MongDB 的 ObjectID 可以算作是和snowflake類似方法,通過“時間+機器碼+pid+inc”共12個位元組,通過4+3+2+3的方式最終標識成一個24長度的十六進位制字元。
美團開源的Leaf
支援多種不同模式的生成策略
號段模式:該模式需要建 DB 表, 需要有專門的服務來提供獲取 id 的介面, 存在網路延遲
Snowflake 模式:為了追求更高的效能,需要通過 RPC Server 來部署 Leaf 服務,那僅需要引入 leaf-core 的包,把生成 ID 的 API 封裝到指定的 RPC 框架中即可
缺點,可能就是相對來說比較複雜。
sharding-jdbc
sharding-jdbc 是一個開源的主鍵生成元件。它的特點是簡單易用,可以指定 workerId 或者不指定, 直接通過 jar 的方式引入即可。看它的名字就知道,它需要 DB 支援。
uid-generator
uid-generator 是百度開源的一個分散式 ID 生成器。需要建 DB 表, 需要有專門的服務來提供獲取 id 的介面, 存在網路延遲。
原文連結:https://www.xttblog.com/?p=3975
10T技術資源大放送!包括但不限於:C/C++,Linux,Python,Java,PHP,人工智慧,GO等等。在公眾號內回覆對應關鍵字或框架名字,即可免費獲取!!
你再主動一點點 我們就有故事了
相關文章
- 雲堡壘機分散式叢集部署優缺點簡單說明分散式
- 五大 JAVA Web 框架的優缺點對比JavaWeb框架
- 分散式唯一 ID 生成器分散式
- 乾貨分享!三大Java框架的優缺點對比Java框架
- 各大程式語言優缺點對比
- 分散式唯一 ID 生成器 - IDGen分散式
- JavaScript 各種繼承方式優缺點對比JavaScript繼承
- 分散式全域性ID生成方案彙總和對比分散式
- memcached 和 redis 使用場景及優缺點對比Redis
- 什麼是分散式系統!以及分散式系統架構的優缺點!分散式架構
- Jtti分享分散式儲存伺服器的優缺點Jtti分散式伺服器
- 分散式ID生成器的解決方案總結分散式
- List中對比Contains, Exists, Any之間的優缺點AI
- python解決反爬蟲方法的優缺點對比Python爬蟲
- docker簡介以及優缺點Docker
- 分散式儲存 vs 傳統SAN、NAS 的優缺點分析分散式
- 詳細解讀:不同RAID級別的優缺點對比AI
- 分散式id分散式
- Java單例模式:缺點和優點Java單例模式
- Apache與Nginx的優缺點比較ApacheNginx
- 分散式ID系列(5)——Twitter的雪法演算法Snowflake適合做分散式ID嗎分散式演算法
- 分散式儲存的六大優點分散式
- Qt 介面美化教程 QSS QML Qt自繪方式優缺點對比QT
- 單頁應用的優缺點
- 開源JAVA單機爬蟲框架簡介,優缺點分析Java爬蟲框架
- 分散式ID系列(2)——UUID適合做分散式ID嗎分散式UI
- 知識點:id 和NSObject *對比,以及id <NSObject>介紹Object
- SQL、NoSQL和NewSQL的優缺點比較SQL
- 分散式註冊中心對比分散式
- 不能錯過的分散式ID生成器(Leaf ),好用的一批!分散式
- DHCP伺服器的優缺點簡介伺服器
- Hive 優缺點Hive
- MapReduce優缺點
- RabbitMQ優缺點MQ
- 分散式ID系列(3)——資料庫自增ID機制適合做分散式ID嗎分散式資料庫
- 簡單介紹SpringSecurity框架簡介及與shiro特點對比SpringGse框架
- Bilinguals-English-對於“multiple objects”的“優(advantages)缺(disadvantages)點”的對比的English template(英文模板)Object
- 大資料的優缺點有哪些?_光點科技大資料