分布式序列號(流水號)生成

序列號要素

唯一性

生成的序列號需要全局唯一。這個唯一也不是絕對的,因為首先要理解全局的概念,全局可以理解為一種業(yè)務(wù)范圍,比如說訂單生成,也可以到數(shù)據(jù)庫表一級(因為業(yè)務(wù)建模最終會在表結(jié)構(gòu)進行體現(xiàn))。也要考慮到分表情況,一張訂單表可能分為多張訂單表并存在不同的分布式數(shù)據(jù)庫中,那序列號也必須保證唯一。

支持高可用,高并發(fā)

出現(xiàn)不可用的情況后,必然影響業(yè)務(wù)進件,并發(fā)量支持不高的話,也無法適應(yīng)高頻場景。

有序

由于序列號大多為數(shù)據(jù)庫表主鍵,也是查詢的關(guān)鍵字段,保證有序,可方便查詢。

業(yè)務(wù)意義

序列號生成后不能是一堆有序的亂糟糟的數(shù)字字母組合,它必須要體現(xiàn)出一定的業(yè)務(wù)或者時間意義。這樣可以一目了然找到這筆業(yè)務(wù)的實際業(yè)務(wù)場景或者發(fā)生時間,并且方便范圍查詢。但是要保證每段序列號分配,比如說前幾位代表什么,后幾位是什么意義。
舉例說明:[業(yè)務(wù)相關(guān)字典項A]+[業(yè)務(wù)相關(guān)字典項B]+[業(yè)務(wù)相關(guān)字典項C]+...+[時間]+[分段遞增],這樣可以根據(jù)不同業(yè)務(wù)選項進行l(wèi)ike查詢(這種%在右邊的like查詢是會走索引的)。

生成方法

網(wǎng)上有很多的生成方法,我這只是展示我們公司使用的方式,并指出優(yōu)缺點。其實流水號前幾位已經(jīng)是固定的了,因為業(yè)務(wù)相關(guān)分段號和發(fā)生時間分段號在業(yè)務(wù)進件的時候便已知,那么我們需要生成的便是最后后幾位。

UUID

最差的id生成方法,它只能滿足唯一性,對業(yè)務(wù)不友好,對數(shù)據(jù)庫不友好,我覺得它只能作為接口間傳遞的接口流水號,可以定位接口日志。我們也是這么用的。

數(shù)據(jù)庫

獨立數(shù)據(jù)庫,就是說我們有一臺數(shù)據(jù)庫,專門用于生成自增id,由于是單庫,所以可用性不能保證,性能也有瓶頸。但是優(yōu)勢是結(jié)構(gòu)簡單,維護容易,對于并發(fā)量不高的業(yè)務(wù)場景是可以使用的。
oracle可以使用sequence,mysql需要獨立建一張表,并寫一個函數(shù)用于獲取id,伸手拉一個實現(xiàn)方案如下:
建表語句

CREATE TABLE SEQUENCE_ID (
    id bigint(20) unsigned NOT NULL auto_increment, 
    stub char(10) NOT NULL default '',
    PRIMARY KEY (id),
    UNIQUE KEY stub (stub)
);

存儲過程

begin;
replace into SEQUENCE_ID (stub) VALUES ('anyword');
select last_insert_id();
commit;

其實,滴滴有一個開源的基于數(shù)據(jù)庫和segment(分段)模式的id生成器tinyid。可以白嫖,可用性要比上面的方式高(因為應(yīng)用會將一部分序列號預(yù)存到內(nèi)存中,即使數(shù)據(jù)庫宕機也可使用),具體使用方式可以去github上觀摩一下https://github.com/didi/tinyid。

Redis

跟數(shù)據(jù)庫差不多的特點,只不過比數(shù)據(jù)庫要快,核心是incr和incrby兩個命令。但要開啟持久化AOF,宕機后可以恢復。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)載:細聊分布式ID生成方法 一、需求緣起 幾乎所有的業(yè)務(wù)系統(tǒng),都有生成一個記錄標識的需求,例如: (1)消息標識...
    meng_philip123閱讀 2,640評論 0 17
  • 全局唯一的 ID 幾乎是所有系統(tǒng)都會遇到的剛需。這個 id 在搜索, 存儲數(shù)據(jù), 加快檢索速度 等等很多方面都有著...
    高級java架構(gòu)師閱讀 865評論 0 6
  • --- layout: post title: "如果有人問你關(guān)系型數(shù)據(jù)庫的原理,叫他看這篇文章(轉(zhuǎn))" date...
    藍墜星閱讀 919評論 0 3
  • 你個憨批 做大做強,再創(chuàng)輝煌
    祁小五閱讀 329評論 0 0

友情鏈接更多精彩內(nèi)容