一:順序消費(fèi)
什么場(chǎng)景下需要順序消費(fèi)?
比如說:訂單有很多狀態(tài),比如:下單(未支付)、完成(已支付)、撤銷等,不可能下單的消息都沒讀取到,就先讀取支付或撤銷的消息吧,要保證消息順序消費(fèi)
如何保證順序消費(fèi)?
kafka的topic是無序的,但是一個(gè)topic包含多個(gè)partition,每個(gè)partition內(nèi)部是有序的
只要保證生產(chǎn)者寫消息時(shí),按照一定的規(guī)則寫到同一個(gè)partition
,不同的消費(fèi)者讀不同的partition的消息,就能保證生產(chǎn)和消費(fèi)者消息的順序。
路由字段的選擇:首先考慮消息消費(fèi)依賴的字段,訂單有很多狀態(tài),消費(fèi)消息是根據(jù)不同訂單狀態(tài)來做消費(fèi)邏輯的,可以以訂單ID為路由字段,這樣同一個(gè)訂單就會(huì)路由到同一個(gè)topic的partition下,這個(gè)partition內(nèi)的消息是有序的,每個(gè)partion再由一個(gè)消費(fèi)者消費(fèi) 。
2. 消息積壓
導(dǎo)致消息積壓的可能情況是很多的,要根據(jù)具體的業(yè)務(wù)來看,大致思路如下:
-
首先看一下topic下積壓的情況,是
全部partion積壓?
還是某幾個(gè)partion積壓
,如果單個(gè)partion積壓,那是不是消費(fèi)該partion的消費(fèi)者
掛了,或者說是不是路由的字段
不合理,導(dǎo)致都路由到這個(gè)分區(qū)了,那如果路由合理消費(fèi)者也正常,是不是該分區(qū)的零時(shí)積壓
,零時(shí)積壓消費(fèi)端可以開更多的線程加快處理
。文章來源:http://www.zghlxwxcb.cn/news/detail-861887.html -
如果是
全部partion都積壓
,那是不是消息體太大
了,優(yōu)化消息體只保留必要的字段,如果消費(fèi)者這邊需要用到其他更加詳細(xì)的消息可以提供接口來查詢
;如果消息體設(shè)計(jì)合理但是全部partion都積壓了,以訂單來說,是不是上游服務(wù)批量的更新
了字段導(dǎo)致下游服務(wù)
收到了大量的消息,造成了所有partition的消息積壓 ,直接加節(jié)點(diǎn)肯定是不行的,因?yàn)閗afka允許一個(gè)消費(fèi)者消費(fèi)多個(gè)partion,但是不允許一個(gè)partion被多個(gè)消費(fèi)者消費(fèi),這樣做也是為了避免資源的浪費(fèi),這種情況下,可以對(duì)消費(fèi)者開更多的線程
處理,這種情況需要和其他的下游服務(wù)做溝通協(xié)調(diào),因?yàn)榭赡茏陨頃?huì)用到下游服務(wù),比如說消費(fèi)消息的邏輯里面包括查詢下游接口信息,協(xié)調(diào)是避免對(duì)下游服務(wù)造成沖擊,讓下游服務(wù)提前加服務(wù)節(jié)點(diǎn)。文章來源地址http://www.zghlxwxcb.cn/news/detail-861887.html
到了這里,關(guān)于Kafka順序消費(fèi)以及消息積壓問題的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!