亚欧色一区w666天堂,色情一区二区三区免费看,少妇特黄A片一区二区三区,亚洲人成网站999久久久综合,国产av熟女一区二区三区

  • 發布文章
  • 消息中心
點贊
收藏
評論
分享
原(yuan)創

kafka如何保證消息的順序性

2024-08-29 09:42:16
65
0

前提

生產者給kakfa投遞的消(xiao)息(xi),在同(tong)一個topic下(xia)不(bu)同(tong)的Partition中,不(bu)同(tong)的Partition之間的消(xiao)息(xi)是無法(fa)保(bao)證(zheng)順(shun)(shun)序(xu)(xu)的。但有些(xie)場景,業務需(xu)要處理順(shun)(shun)序(xu)(xu)消(xiao)息(xi)。怎(zen)么保(bao)證(zheng)kakfa消(xiao)息(xi)的順(shun)(shun)序(xu)(xu)性,以致最終消(xiao)費(fei)者能順(shun)(shun)序(xu)(xu)消(xiao)費(fei)消(xiao)息(xi)呢

消息有序性分類

  • 全局有序:一個Topic下的所有消息都需要按照生產順序消費。
  • 局部有序:一個Topic下的消息,只需要滿足同一業務字段的要按照生產順序消費。例如:Topic消息是訂單的流水表,包含訂單orderId,業務要求同一個orderId的消息需要按照生產順序進行消費。

全局有序

由于Kafka的一個(ge)(ge)Topic可以分為了(le)多個(ge)(ge)Partition,Producer發(fa)送消(xiao)息(xi)的時候,是(shi)分散在不同 Partition的。當Producer按順(shun)序發(fa)消(xiao)息(xi)給Broker,但進入Kafka之后,這(zhe)些消(xiao)息(xi)就不一定(ding)進到哪個(ge)(ge)Partition,會導致順(shun)序是(shi)亂的。因此要滿足全局有序,需要1個(ge)(ge)Topic只能對應1個(ge)(ge)Partition。而且對應的consumer也要使用單線(xian)程(cheng)或者保證消(xiao)費順(shun)序的線(xian)程(cheng)模型.

局部有序

要滿足局部有序,只需(xu)要在(zai)發消(xiao)息(xi)的時候指定Partition Key,Kafka對其進行Hash計算,根據計算結果決定放(fang)入哪個Partition。這樣Partition Key相(xiang)(xiang)同(tong)的消(xiao)息(xi)會(hui)放(fang)在(zai)同(tong)一(yi)(yi)個Partition。確保(bao)將(jiang)相(xiang)(xiang)關(guan)的消(xiao)息(xi)發送(song)(song)到(dao)同(tong)一(yi)(yi)個分(fen)區。Kafka 保(bao)證在(zai)單(dan)個分(fen)區內消(xiao)息(xi)的順(shun)(shun)序。因此(ci),如果消(xiao)息(xi)的順(shun)(shun)序性對業(ye)務非(fei)常重要,可(ke)(ke)以將(jiang)相(xiang)(xiang)關(guan)的消(xiao)息(xi)通過(guo)相(xiang)(xiang)同(tong)的分(fen)區鍵(如用(yong)戶 ID 或訂單(dan) ID)發送(song)(song)至同(tong)一(yi)(yi)分(fen)區。此(ci)時,Partition的數量(liang)(liang)仍然可(ke)(ke)以設置多個,提升Topic的整體吞吐量(liang)(liang)。

 

提升消費效率

在不增加(jia)partition數量的情況下(xia)想提高消(xiao)費速(su)度,可以(yi)考慮以(yi)上局部(bu)有(you)序的場景下(xia)再(zai)次hash唯一標識(例(li)如(ru)訂單orderId)到不同的線程上,多(duo)個消(xiao)費者線程并發(fa)處理消(xiao)息(依(yi)舊(jiu)可以(yi)保(bao)證局部(bu)有(you)序)。說到底還是一個實(shi)例(li)線程消(xiao)費一個partition消(xiao)息

消息重試對順序消息的影響

對于一個有著(zhu)先后(hou)順序的(de)消息A、B,正常情況(kuang)下(xia)應該是(shi)A先發(fa)(fa)(fa)送完成后(hou)再(zai)發(fa)(fa)(fa)送B,但是(shi)在異常情況(kuang)下(xia),在A發(fa)(fa)(fa)送失敗(bai)的(de)情況(kuang)下(xia),B發(fa)(fa)(fa)送成功,而A由于重試機制(zhi)在B發(fa)(fa)(fa)送完成之后(hou)重試發(fa)(fa)(fa)送成功了。這時(shi)對于本身順序為(wei)AB的(de)消息順序變(bian)成了BA。

針對這種問題,嚴格的順序消費還需要max.in.flight.requests.per.connection參數的支持。

該參數指定了(le)生(sheng)產者在收到服務(wu)器(qi)響應(ying)之前可以(yi)發送多(duo)少個消(xiao)息。它的(de)(de)值(zhi)越(yue)高(gao),就(jiu)會(hui)占用越(yue)多(duo)的(de)(de)內存,同時也(ye)會(hui)提(ti)升吞吐量。把(ba)它設為1就(jiu)可以(yi)保證消(xiao)息是按照(zhao)發送的(de)(de)順序寫入服務(wu)器(qi)的(de)(de)。

此外,對于某些業務場景,設置max.in.flight.requests.per.connection=1會嚴重(zhong)(zhong)降低吞(tun)吐量,如果(guo)放棄使(shi)用這種同步(bu)重(zhong)(zhong)試機制,則可以考慮在(zai)消費端增加失敗(bai)標記(ji)的記(ji)錄(lu),然(ran)后用定時任務(wu)輪詢(xun)去(qu)重(zhong)(zhong)試這些失敗(bai)的消息并做好監控報警。

0條評論
作者已關閉評論
肖****凱
4文章數
0粉絲(si)數
肖****凱
4 文章(zhang) | 0 粉絲
肖****凱
4文章數
0粉絲(si)數
肖****凱
4 文章 | 0 粉絲
原創

kafka如何保證消息的順序性

2024-08-29 09:42:16
65
0

前提

生產者給kakfa投遞的(de)消(xiao)息(xi),在同一(yi)個topic下不同的(de)Partition中,不同的(de)Partition之間(jian)的(de)消(xiao)息(xi)是無(wu)法(fa)保(bao)證順(shun)(shun)序的(de)。但(dan)有些場(chang)景(jing),業務(wu)需(xu)要處(chu)理順(shun)(shun)序消(xiao)息(xi)。怎么(me)保(bao)證kakfa消(xiao)息(xi)的(de)順(shun)(shun)序性,以致最(zui)終(zhong)消(xiao)費(fei)者能(neng)順(shun)(shun)序消(xiao)費(fei)消(xiao)息(xi)呢

消息有序性分類

  • 全局有序:一個Topic下的所有消息都需要按照生產順序消費。
  • 局部有序:一個Topic下的消息,只需要滿足同一業務字段的要按照生產順序消費。例如:Topic消息是訂單的流水表,包含訂單orderId,業務要求同一個orderId的消息需要按照生產順序進行消費。

全局有序

由(you)于Kafka的(de)(de)一個(ge)Topic可以分(fen)為了多個(ge)Partition,Producer發送消(xiao)息的(de)(de)時候(hou),是分(fen)散(san)在不(bu)同 Partition的(de)(de)。當(dang)Producer按(an)順(shun)序(xu)發消(xiao)息給(gei)Broker,但進(jin)入Kafka之后,這些消(xiao)息就不(bu)一定進(jin)到哪個(ge)Partition,會(hui)導(dao)致順(shun)序(xu)是亂的(de)(de)。因此要滿足全局有(you)序(xu),需要1個(ge)Topic只能對應(ying)(ying)1個(ge)Partition。而(er)且(qie)對應(ying)(ying)的(de)(de)consumer也要使用單線程(cheng)或者(zhe)保(bao)證消(xiao)費順(shun)序(xu)的(de)(de)線程(cheng)模型(xing).

局部有序

要(yao)滿足局部有序,只需要(yao)在(zai)發消(xiao)(xiao)(xiao)息(xi)的時候指定Partition Key,Kafka對其進行Hash計算(suan),根據計算(suan)結果決定放入(ru)哪個Partition。這樣(yang)Partition Key相(xiang)同(tong)(tong)(tong)的消(xiao)(xiao)(xiao)息(xi)會放在(zai)同(tong)(tong)(tong)一(yi)個Partition。確(que)保將相(xiang)關(guan)的消(xiao)(xiao)(xiao)息(xi)發送到同(tong)(tong)(tong)一(yi)個分區(qu)。Kafka 保證在(zai)單個分區(qu)內消(xiao)(xiao)(xiao)息(xi)的順序。因(yin)此(ci)(ci),如果消(xiao)(xiao)(xiao)息(xi)的順序性對業務非常重要(yao),可以將相(xiang)關(guan)的消(xiao)(xiao)(xiao)息(xi)通(tong)過相(xiang)同(tong)(tong)(tong)的分區(qu)鍵(如用戶(hu) ID 或訂單 ID)發送至同(tong)(tong)(tong)一(yi)分區(qu)。此(ci)(ci)時,Partition的數量仍(reng)然可以設置(zhi)多個,提升Topic的整體吞吐量。

 

提升消費效率

在不增加(jia)partition數量的(de)情況(kuang)下想提高消(xiao)(xiao)費速度,可以考慮以上局部(bu)有(you)序的(de)場(chang)景下再(zai)次hash唯一標識(例(li)(li)如(ru)訂(ding)單orderId)到(dao)不同的(de)線程(cheng)上,多個(ge)(ge)消(xiao)(xiao)費者(zhe)線程(cheng)并發處(chu)理消(xiao)(xiao)息(依舊可以保(bao)證(zheng)局部(bu)有(you)序)。說到(dao)底(di)還是一個(ge)(ge)實例(li)(li)線程(cheng)消(xiao)(xiao)費一個(ge)(ge)partition消(xiao)(xiao)息

消息重試對順序消息的影響

對于(yu)一個(ge)有著先后順序(xu)(xu)的(de)消息A、B,正常情(qing)況(kuang)下(xia)應該是A先發送(song)(song)(song)完成(cheng)(cheng)(cheng)后再發送(song)(song)(song)B,但是在(zai)異常情(qing)況(kuang)下(xia),在(zai)A發送(song)(song)(song)失敗(bai)的(de)情(qing)況(kuang)下(xia),B發送(song)(song)(song)成(cheng)(cheng)(cheng)功(gong)(gong),而A由(you)于(yu)重試機制在(zai)B發送(song)(song)(song)完成(cheng)(cheng)(cheng)之后重試發送(song)(song)(song)成(cheng)(cheng)(cheng)功(gong)(gong)了(le)(le)。這時(shi)對于(yu)本身(shen)順序(xu)(xu)為(wei)AB的(de)消息順序(xu)(xu)變成(cheng)(cheng)(cheng)了(le)(le)BA。

針對這種問題,嚴格的順序消費還需要max.in.flight.requests.per.connection參數的支持。

該參(can)數指定了生產者在收到(dao)服務器響(xiang)應之前可以發送多少個消息。它的(de)值越高(gao),就會占用越多的(de)內存,同(tong)時也會提升吞吐(tu)量。把它設為1就可以保(bao)證消息是(shi)按照發送的(de)順序寫入服務器的(de)。

此外,對于某些業務場景,設置max.in.flight.requests.per.connection=1會嚴重降低(di)吞吐(tu)量,如果放棄(qi)使用這(zhe)種同步重試機制,則(ze)可(ke)以考慮(lv)在消(xiao)費端增加失(shi)敗標(biao)記(ji)(ji)的(de)(de)記(ji)(ji)錄,然后(hou)用定時任(ren)務輪詢去重試這(zhe)些失(shi)敗的(de)(de)消(xiao)息并做好監控報(bao)警。

文章來自個人專欄
文(wen)章 | 訂閱
0條評論
作者已關閉評論
作者已關閉評論
0
0