成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

巧用 CAS,一分鐘實現分布式 ID 生成器!

開發 架構
有同學留言,CAS還有其他應有場景嗎?場景很多,今天分享一個巧用CAS實現分布式全局唯一ID生成的場景。

有童鞋留言,CAS還有其他應有場景嗎?

場景很多,今天分享一個巧用CAS實現分布式全局唯一ID生成的場景。

如何快速生成全局唯一ID?

可以借助DB自增鍵(auto inc id),插入一條記錄,生成一個ID:

這個方案復用了數據庫的特性,其優點為:

  • 無需寫額外代碼;
  • 全局唯一;
  • 絕對遞增;
  • 遞增ID的步長確定;

業務早期“并發量小”,追求“快速實現”,這么玩沒問題。

這種方案有什么缺點?

  • 數據庫中記錄數較多;
  • 生成ID的性能,取決于數據庫插入性能;
  • 并發量大了,數據庫扛不住;

可以怎么優化?

  • DB只保留max-id一條記錄;
  • 增加一層服務,采用批量生成的方式降低數據庫的寫壓力,提升整體性能;

更具體的操作如下:

步驟一,id-s服務首先拉取當前的max-id。

select max_id from T;

步驟二,批量獲取一批ID,放到id-s內存里,并將max-id寫回數據庫。

update T set max_id=200;

如上圖所示,id-s拿到了[100, 200]這一批ID,上游在獲取ID時,不用每次都插入數據庫,而是分配完100個ID后,再修改max-id的值,這樣分配ID的整體性能就增加了100倍。

這種方案還有什么缺點?

服務沒有做HA,無法保證高可用。需要冗余服務,做集群保證高可用。

冗余服務可能帶來什么新的問題?

和高并發庫存扣減出現的問題類似,冗余了服務后,多個服務在啟動過程中,進行ID批量申請時,可能由于并發導致數據不一致。

select max_id from T;

步驟一:兩個id-s同時拿到了max-id為100;

update T set max_id=200;

步驟二:兩個id-s同時對數據庫的max-id進行寫回;

寫回max-id成功后,這兩個id-s都以為自己拿到了[100,200]這一批ID,導致集群會生成重復的ID。

導致bug的原因在哪里?

是并發寫回時,沒有對max-id的初始值進行比對:

  • id-s1寫回max-id=200成功的條件是,max-id必須等于100;
  • id-s2寫回max-id=200成功的條件是,max-id也必須等于100;

而實際情況是:

  • id-s1寫回時,max-id是100,理應寫回成功;
  • id-s2寫回時,max-id已經被改成了200,不應該寫回成功;

如何巧用CAS修復?

在寫回時對max-id的初始條件進行比對,就能避免數據的不一致,寫回SQL由:

update T set max_id=200;

升級為:

update T set max_id=200
where max_id=100;

升級之后,s1和s2只會有一個成功。另一個失敗之后,重新查詢數據庫得到新的max-id為200,再次申請[200,300]的ID,就能夠成功。

CAS優化方案的優點是:

  • 能夠通過水平擴展的方式,達到分布式ID生成服務的無限性能;
  • 方案簡潔性;
  • 保證不會生成重復的ID;

知其然,知其所以然。

思路比結論更重要。

責任編輯:趙寧寧 來源: 架構師之路
相關推薦

2016-12-16 11:05:00

分布式互斥線程

2018-06-28 14:00:01

分布式集群架構

2017-07-01 16:02:39

分布式ID生成器

2019-06-21 10:00:42

微服務分布式架構

2017-03-30 19:28:26

HBase分布式數據

2017-02-21 13:00:27

LoadAverage負載Load

2018-07-31 16:10:51

Redo Undo數據庫數據

2018-06-26 05:23:19

線程安全函數代碼

2017-07-06 08:12:02

索引查詢SQL

2020-05-21 19:46:19

區塊鏈數字貨幣比特幣

2022-07-18 06:16:07

單點登錄系統

2020-10-28 11:00:53

Scrapy爬蟲Python

2024-10-31 13:51:58

2018-12-12 22:51:24

Java包裝語言

2020-07-17 07:44:25

云計算邊緣計算IT

2016-09-12 17:28:45

云存儲應用軟件存儲設備

2020-07-09 07:37:06

數據庫Redis工具

2011-02-21 17:48:35

vsFTPd

2025-04-18 08:47:22

2019-12-27 10:00:34

開源技術 軟件
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 草草草影院| 精品久久精品 | 一区二区三区免费 | 欧美八区 | 波霸ol一区二区 | 日韩在线视频免费观看 | 老司机久久 | 久久久久久黄 | 欧美日韩国产一区二区 | 高清视频一区二区三区 | 亚洲国产精品久久久久 | 国产午夜精品理论片a大结局 | 国产免费福利在线 | 亚洲视频 欧美视频 | 日韩视频在线一区二区 | 亚洲高清一区二区三区 | 成人h动漫亚洲一区二区 | 中文字幕av在线一二三区 | eeuss国产一区二区三区四区 | 亚洲五码久久 | 国产激情视频在线 | 日韩第1页 | 国产在线一区二区三区 | 国产精品毛片一区二区在线看 | 亚洲3p| www.中文字幕.com | 国产精品99 | 国产精品美女久久久免费 | 国产人免费人成免费视频 | 天天操天天拍 | 国产精品999 | 中文字幕在线第一页 | 日韩精品1区2区3区 国产精品国产成人国产三级 | 欧美男人天堂 | 亚洲成av人片在线观看 | 亚洲成人在线视频播放 | 国产日韩欧美激情 | 亚洲精品一区二区三区在线 | 久久久噜噜噜久久中文字幕色伊伊 | 天天干免费视频 | 香蕉视频一区二区 |