如何防止消息丟失
- 生產(chǎn)者:
- 使用同步發(fā)送
- 把a(bǔ)ck設(shè)成1或者all(非0,0可能會(huì)出現(xiàn)消息丟失的情況),并且設(shè)置同步的分區(qū)數(shù)>=2
- 消費(fèi)者:把自動(dòng)提交改成手動(dòng)提交
如何防止重復(fù)消費(fèi)
在防止消息丟失的方案中,如果生產(chǎn)者發(fā)送完消息后,因?yàn)榫W(wǎng)絡(luò)抖動(dòng),沒(méi)有收到ack,但實(shí)際上broker已經(jīng)收到了。此時(shí)生產(chǎn)者會(huì)進(jìn)行重試,于是broker就會(huì)收到多條相同的消息,而造成消費(fèi)者的重復(fù)消費(fèi)。
如何解決:
- 生產(chǎn)者關(guān)閉重試:雖不會(huì)發(fā)送相同消息,但會(huì)造成丟消息(不建議)【
同步發(fā)送消息并且開(kāi)啟重試,ack設(shè)置為1或者all
】 -
消費(fèi)者解決非冪等性消費(fèi)問(wèn)題
:
所謂的冪等性:多次訪問(wèn)的結(jié)果是?樣的
。對(duì)于rest的請(qǐng)求(get(冪等)、post(非冪等)、put(冪等)、delete(冪等))
解決方案:
- 在數(shù)據(jù)庫(kù)中創(chuàng)建
聯(lián)合主鍵
,防止相同的主鍵創(chuàng)建出多條記錄 - 使用
分布式鎖
,以業(yè)務(wù)id為鎖。保證只有?條記錄能夠創(chuàng)建成功(setnx
)
如何做到消息的順序消費(fèi)(效率不高,RocketMQ)
- 生產(chǎn)者:保證消息按順序發(fā)送,且消息不丟失——使用同步的發(fā)送,ack設(shè)置成非0的值。
- 消費(fèi)者:
主題只能設(shè)置?個(gè)分區(qū),消費(fèi)組中只能有一個(gè)消費(fèi)者
【消費(fèi)者只能限制單partition順序消費(fèi),這種效率不高】
kafka的順序消費(fèi)使用場(chǎng)景不多,因?yàn)闋奚袅诵阅?,但是比如rocketmq在這?塊有專門的功能已設(shè)計(jì)好。
如何解決消息積壓?jiǎn)栴}
積壓的消息越多,消費(fèi)者消費(fèi)越慢(尋址越來(lái)越慢),越慢積壓越多,死循環(huán),導(dǎo)致整個(gè)kafka集群磁盤IO都很慢導(dǎo)致多個(gè)服務(wù)不可用
1.消息積壓?jiǎn)栴}的出現(xiàn)
消費(fèi)者消費(fèi)消息速度遠(yuǎn)趕不上生產(chǎn)者生產(chǎn)消息的速度,導(dǎo)致kafka中有大量的數(shù)據(jù)沒(méi)有被消費(fèi)。隨著沒(méi)有被消費(fèi)的數(shù)據(jù)堆積越多,消費(fèi)者尋址的性能會(huì)越來(lái)越差,最后導(dǎo)致整個(gè)kafka對(duì)外提供的服務(wù)的性能很差,從而造成其他服務(wù)也訪問(wèn)速度變慢,造成服務(wù)雪崩。
2.消息積壓的解決方案
- 消費(fèi)者中,使用
多線程
,充分利用機(jī)器的性能進(jìn)行消費(fèi)消息。 - 通過(guò)業(yè)務(wù)的架構(gòu)設(shè)計(jì),提升業(yè)務(wù)層面消費(fèi)的性能。
- 創(chuàng)建多個(gè)消費(fèi)組,
多個(gè)消費(fèi)者
,部署到其他機(jī)器上,?起消費(fèi),提高消費(fèi)者的消費(fèi)速度 - 創(chuàng)建?個(gè)消費(fèi)者,該消費(fèi)者在kafka另建?個(gè)主題,配上多個(gè)分區(qū),多個(gè)分區(qū)再配上多個(gè)消費(fèi)者。該消費(fèi)者將poll下來(lái)的消息,不進(jìn)行消費(fèi),直接轉(zhuǎn)發(fā)到新建的主題上。此時(shí),新的主題的多個(gè)分區(qū)的多個(gè)消費(fèi)者就開(kāi)始?起消費(fèi)了?!怀S?/li>
實(shí)現(xiàn)延時(shí)隊(duì)列的效果(實(shí)現(xiàn)比較費(fèi)勁,RabbitMQ)
1.應(yīng)用場(chǎng)景
訂單創(chuàng)建后,超過(guò)30分鐘沒(méi)有?付,則需要取消訂單,這種場(chǎng)景可以通過(guò)延時(shí)隊(duì)列來(lái)實(shí)現(xiàn)文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-652353.html
2.具體方案
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-652353.html
- kafka中創(chuàng)建相應(yīng)的主題,每個(gè)topic表示延時(shí)的間隔
- topic_5s: 延時(shí)5s執(zhí)行的隊(duì)列
- topic_1m: 延時(shí)1分鐘執(zhí)行的隊(duì)列
- topic_30m: 延時(shí)30分鐘執(zhí)行的隊(duì)列
- 消息發(fā)送者發(fā)送消息到相應(yīng)的topic,并帶上消息的發(fā)送時(shí)間
- 消費(fèi)者訂閱相應(yīng)的topic,消費(fèi)該主題的消息(輪詢)
- 消費(fèi)者消費(fèi)消息時(shí)判斷消息的創(chuàng)建時(shí)間和當(dāng)前時(shí)間是否超過(guò)30分鐘(前提是訂單沒(méi)支付)
- 如果是:去數(shù)據(jù)庫(kù)中修改訂單狀態(tài)為已取消
- 如果否:記錄當(dāng)前消息的offset,并不再繼續(xù)消費(fèi)之后的消息。等待1分鐘后,再次向kafka拉取該offset及之后的消息,繼續(xù)進(jìn)行判斷,以此反復(fù)。
到了這里,關(guān)于kafka線上問(wèn)題優(yōu)化的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!