我舉個例子,我們以前做過一個 mysqlbinlog同步的系統(tǒng),壓力還是非常大的,日同步數(shù)據(jù)要達(dá)到上億,就是說數(shù)據(jù)從一個 mysql 庫原封不動地同步到另一個 mysql 庫里面去(mysql -> mysql)。常見的一點(diǎn)在于說比如大數(shù)據(jù) team,就需要同步一個 mysql 庫過來,對公司的業(yè)務(wù)系統(tǒng)的數(shù)據(jù)做各種復(fù)雜的操作。
你在 mysql 里增刪改一條數(shù)據(jù),對應(yīng)出來了增刪改 3 條binlog日志,接著這三條binlog發(fā)送到 MQ 里面,再消費(fèi)出來依次執(zhí)行,起碼得保證人家是按照順序來的吧?不然本來是:增加、修改、刪除;你楞是換了順序給執(zhí)行成刪除、修改、增加,不全錯了么。
本來這個數(shù)據(jù)同步過來,應(yīng)該最后這個數(shù)據(jù)被刪除了;結(jié)果你搞錯了這個順序,最后這個數(shù)據(jù)保留下來了,數(shù)據(jù)同步就出錯了。
先看看順序會錯亂的倆場景:
RabbitMQ:一個 queue,多個 consumer。比如,生產(chǎn)者向 RabbitMQ 里發(fā)送了三條數(shù)據(jù),順序依次是 data1/data2/data3,壓入的是 RabbitMQ 的一個內(nèi)存隊(duì)列。有三個消費(fèi)者分別從 MQ 中消費(fèi)這三條數(shù)據(jù)中的一條,結(jié)果消費(fèi)者2先執(zhí)行完操作,把 data2 存入數(shù)據(jù)庫,然后是 data1/data3。這不明顯亂了。
Kafka:比如說我們建了一個 topic,有三個 partition。生產(chǎn)者在寫的時候,其實(shí)可以指定一個 key,比如說我們指定了某個訂單 id 作為 key,那么這個訂單相關(guān)的數(shù)據(jù),一定會被分發(fā)到同一個 partition 中去,而且這個 partition 中的數(shù)據(jù)一定是有順序的。
消費(fèi)者從 partition 中取出來數(shù)據(jù)的時候,也一定是有順序的。到這里,順序還是 ok 的,沒有錯亂。接著,我們在消費(fèi)者里可能會搞多個線程來并發(fā)處理消息。因?yàn)槿绻M(fèi)者是單線程消費(fèi)處理,而處理比較耗時的話,比如處理一條消息耗時幾十 ms,那么 1 秒鐘只能處理幾十條消息,這吞吐量太低了。而多個線程并發(fā)跑的話,順序可能就亂掉了。
解決方案
RabbitMQ
拆分多個 queue,每個 queue 一個 consumer,就是多一些 queue 而已,確實(shí)是麻煩點(diǎn);或者就一個 queue 但是對應(yīng)一個 consumer,然后這個 consumer 內(nèi)部用內(nèi)存隊(duì)列做排隊(duì),然后分發(fā)給底層不同的 worker 來處理。
Kafka
一個 topic,一個 partition,一個 consumer,內(nèi)部單線程消費(fèi),單線程吞吐量太低,一般不會用這個。
寫 N 個內(nèi)存 queue,具有相同 key 的數(shù)據(jù)都到同一個內(nèi)存 queue;然后對于 N 個線程,每個線程分別消費(fèi)一個內(nèi)存 queue 即可,這樣就能保證順序性。
鏈接:https://www.jianshu.com/p/8a5630e2c317
審核編輯:劉清
-
MySQL
+關(guān)注
關(guān)注
1文章
829瀏覽量
26745 -
MYSQL數(shù)據(jù)庫
+關(guān)注
關(guān)注
0文章
96瀏覽量
9453 -
消息隊(duì)列
+關(guān)注
關(guān)注
0文章
33瀏覽量
3017 -
mysql觸發(fā)器
+關(guān)注
關(guān)注
0文章
6瀏覽量
1129
原文標(biāo)題:面試官:消息隊(duì)列中如何保證消息的順序性?
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
FIFO隊(duì)列原理簡述
嵌入式開發(fā)中消息隊(duì)列的實(shí)現(xiàn)
![嵌入式開發(fā)<b class='flag-5'>中</b>消息<b class='flag-5'>隊(duì)列</b>的實(shí)現(xiàn)](https://file1.elecfans.com/web2/M00/94/3F/wKgaomTkKLOAA5NAAACevmPShjc673.jpg)
局部變量與隊(duì)列的使用
利用隊(duì)列控制多設(shè)備的控制結(jié)構(gòu)
數(shù)據(jù)結(jié)構(gòu)之隊(duì)列順序及其構(gòu)造
LabVIEW什么是隊(duì)列
LabVIEW中的隊(duì)列使用詳解
iFix組態(tài)軟件中基于隊(duì)列的命令處理機(jī)制研究
FIFO隊(duì)列原理簡述 擁塞避免原理
![FIFO<b class='flag-5'>隊(duì)列</b>原理簡述 擁塞避免原理](https://file.elecfans.com/web1/M00/45/F3/pIYBAFp8KtKAKZGgAAAY6fg9olc411.png)
單片機(jī)實(shí)現(xiàn)FIFO循環(huán)隊(duì)列的代碼和資料免費(fèi)下載
![單片機(jī)實(shí)現(xiàn)FIFO循環(huán)<b class='flag-5'>隊(duì)列</b>的代碼和資料免費(fèi)下載](https://file.elecfans.com/web1/M00/A7/07/o4YBAF2DQ0eAJWCfAACTeXsqDpI219.png)
SystemVerilog中的隊(duì)列
什么是消息隊(duì)列?消息隊(duì)列中間件重要嗎?
RTOS消息隊(duì)列的應(yīng)用
![RTOS消息<b class='flag-5'>隊(duì)列</b>的應(yīng)用](https://file1.elecfans.com/web2/M00/88/CB/wKgaomR0E0WAGaiCAAAZvY_r7Cs460.png)
FreeRTOS消息隊(duì)列介紹
![FreeRTOS消息<b class='flag-5'>隊(duì)列</b>介紹](https://file1.elecfans.com/web2/M00/8C/25/wKgZomSmgi6AbaURAAJ2j7wCnv4174.jpg)
評論