摘要:為什么需要發號器在分布式系統中,經常需要對大量的數據消息請求等進行唯一標識,例如對于分布式系統,服務間相互調用需要唯一標識,調用鏈路分析,日志追蹤的時候需要使用這個唯一標識。
原文鏈接:何曉東 博客
文章起源于 康神交流群的 panda大佬和boss li關于發號器的一些交流,特此感謝讓我們學到了新知識。為什么需要發號器
在分布式系統中,經常需要對大量的數據、消息、http 請求等進行唯一標識,例如:對于分布式系統,服務間相互調用需要唯一標識,調用鏈路分析,日志追蹤的時候需要使用這個唯一標識。此時需要一個全局唯一的 ID。
需要什么樣子的發號器持久化
要滿足長期全局唯一,持久化是必須的,肯定不能讓已經使用的再次產生一遍,同時需要強一致性??捎眠x擇存儲在 Redis 或者 Etcd 中。
高可用
這個時候需要提供發號器服務的機器主從同步,能夠在主服務器宕機的時候,自動選擇從服務器,切換過程中,發號器生成的 ID 可能不連續,服務正常就可以。
其他特性
主要是看具體業務了,需要認證和權限控制都是可選的,可用在請求層限制來源 IP,只允許固定的 IP 訪問。發號器的幾種常用方案
UUID 是 Universally Unique Identifier 的縮寫,它是在一定的范圍內(從特定的名字空間到全球)唯一的機器生成的標識符,UUID 是16字節128位長的數字,通常以36字節的字符串表示,比如:3F2504E0-4F89-11D3-9A0C-0305E82C3301。
UUID經由一定的算法機器生成,為了保證 UUID 的唯一性,規范定義了包括網卡 MAC 地址、時間戳、名字空間(Namespace)、隨機或偽隨機數、時序等元素,以及從這些元素生成 UUID 的算法。UUID 的復雜特性在保證了其唯一性的同時,意味著只能由計算機生成。
優缺點: 本地生成,性能高,延遲低,位數長,不適用當作索引字段,同時是無序的,難以根據特征分析趨勢。
snowflake是twitter開源的分布式ID生成算法,其核心思想為,一個long型的ID:
41bit作為毫秒數 - 10bit作為機器編號 - 12bit作為毫秒內序列號
算法單機每秒內理論上最多可以生成1000*(2^12),也就是400W的ID,
優缺點: 整個 ID 都是自增的,這個非常適合查看趨勢,同時生成不依賴于第三方系統,可靠性很高,可調整性也很高。缺點就是嚴重依賴機器時鐘。
字段設置 auto_increment_increment 和 auto_increment_offset 來保證 ID 自增,每次業務使用下列 SQL 讀寫 MySQL 得到 ID。
begin; REPLACE INTO Tickets64 (stub) VALUES ("a"); SELECT LAST_INSERT_ID(); commit;
為了保證高可用,需要有多臺 MySQL 機器,也需要為每臺機器設置不同的自增起始值和步長,例如:
# TicketServer1: auto-increment-increment = 2 auto-increment-offset = 1 # TicketServer2: auto-increment-increment = 2 auto-increment-offset = 2
優缺點: 簡單可靠,成本很小,由專業 DBA 進行維護就可以的。ID 單調遞增,有合適的業務是最好的。缺點就是強依賴于數據庫,修改起點和步長優點困難,同時也需要額外保證數據庫的穩定可用。每次請求都去額外讀寫數據庫的情況下,造成數據庫壓力很大,需要消耗很多資源。
以上就是最常用的三種全局唯一 ID 生成方案,采用較多的是類 snowflake 的方案,如果請求數列不是很高,可以調低時間的精度等,靈活性很高。生成的 ID 時間趨勢自增,甚至可以用來做索引字段,占用空間較小。后期對數據進行分析的時候也很方便。生產環境唯一ID的使用
類 snowflake 的方案,會采用請求時生成的方式,無法提前生成。
基于 MySQL 的發號器,或者 uuid 模式的,可用提前生成一大批數據,根據業務去定生成數量,放到內存,MQ 或者 Redis List中,業務申請唯一 ID 的時候,直接從其中彈一個出來。同時加一個異步定時任務,固定時間計算一下隊列中剩余的唯一 ID 數量,數量不足時及時的再次生成一大批,加入到備選隊列。
Go snowflake的demo:
參考文章:
有贊技術團隊文章 - 發號器
CSDN文章
美團分布式ID生成
Go snowflake包
一如既往,推薦幾個 高質量課程,你學到新東西,我賺點傭金,大家都是贏家。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/31787.html
摘要:出于以上兩個原因,我們需要自己的發號器來產生。與此同時,為了保證執行,具有原子性,我們使用來進行實現。由于能力和水平有限,難免會有紕漏,希望及時指出。參考文章分布式生成器實現上實現原理 1、為什么要實現發號器 很多地方我們都需要一個全局唯一的編號,也就是uuid。舉一個常見的場景,電商系統產生訂單的時候,需要有一個對應的訂單編號。在composer上我們也可以看到有很多可以產生uuid...
閱讀 1830·2021-11-11 16:55
閱讀 749·2019-08-30 15:53
閱讀 3587·2019-08-30 15:45
閱讀 670·2019-08-30 14:10
閱讀 3262·2019-08-30 12:46
閱讀 2122·2019-08-29 13:15
閱讀 2025·2019-08-26 13:48
閱讀 933·2019-08-26 12:23