kafka消費者消費訊息的流程

Mark_ZQ發表於2020-11-28

1.1 消費流程

1.訊息有生產者釋出到kafka叢集后,會被消費者消費。訊息的消費模型有兩種,推送模型(push)和拉取模型(pull)。

1.1   基於推送模型(push)的訊息系統,有訊息代理記錄消費者的消費狀態。訊息代理在將訊息推送到消費者後,標記這條訊息已經消費,但這種方式無法很好地保證消費被處理。如果要保證訊息被處理,訊息代理髮送完訊息後,要設定狀態為“已傳送”,只要收到消費者的確認請求後才更新為“已消費”,這就需要代理中記錄所有的消費狀態,但顯然這種方式不可取。

缺點:標記為消費後,其他消費者則不可以再消費了,不可取。

1.2   kafka採用拉取模型,由消費者自己記錄消費狀態,每個消費者互相獨立地順序拉取每個分割槽的訊息。如下圖所示,有兩個消費者(不同消費者組)拉取同一個主題的訊息,消費者A的消費進度是3,消費者B的消費進度是6。消費者拉取的最大上限通過最高水位(watermark)控制,生產者最新寫入的訊息如果還沒有達到備份數量,對消費者是不可見的。這種由消費者控制偏移量的優點是:消費者可以按照任意的順序消費訊息。比如,消費者可以重置到舊的偏移量,重新處理之前已經消費過的訊息;或者直接跳到最近的位置,從當前的時刻開始消費。

 

 

  在一些訊息系統中,訊息代理會在訊息被消費之後立即刪除訊息。如果有不同型別的消費者訂閱同一個主題,訊息代理可能需要冗餘地儲存同一訊息;或者等所有消費者都消費完才刪除,這就需要訊息代理跟蹤每個消費者的消費狀態,這種設計很大程度上限制了訊息系統的整體吞吐量和處理延遲。Kafka的做法是生產者釋出的所有訊息會一致儲存在Kafka叢集中,不管訊息有沒有被消費。使用者可以通過設定保留時間來清理過期的資料,比如,設定保留策略為兩天。那麼,在訊息釋出之後,它可以被不同的消費者消費,在兩天之後,過期的訊息就會自動清理掉。

1.3 消費者是以consumer group消費者組的方式工作,由一個或者多個消費者組成一個組,共同消費一個topic。每個分割槽在同一時間只能由group中的一個消費者讀取,但是多個group可以同時消費這個partition。在圖中,有一個由三個消費者組成的group,有一個消費者讀取主題中的兩個分割槽,另外兩個分別讀取一個分割槽。某個消費者讀取某個分割槽,也可

以叫做某個消費者是某個分割槽的擁有者。

        在這種情況下,消費者可以通過水平擴充套件的方式同時讀取大量的訊息。另外,如果一個消費者失敗了,那麼其他的group成員會自動負載均衡讀取之前失敗的消費者讀取的分割槽。

1.2 pull方式和push方式的區別

1.push(推)模式很難適應消費速率不同的消費者,因為訊息傳送速率是由broker決定的。它的目標是儘可能以最快速度傳遞訊息,但是這樣很容易造成consumer來不及處理訊息,典型的表現就是拒絕服務以及網路擁塞。

標記為消費後,其他消費者則不可以再消費了,不可取。

  1. 而pull模式則可以根據consumer的消費能力以適當的速率消費訊息。consumer採用pull(拉)模式從broker中讀取資料。

pull模式不足之處是,如果kafka沒有資料,消費者可能會陷入迴圈中,一直等待資料到達。為了避免這種情況,我們在我們的拉請求中有引數,允許消費者請求在等待資料到達的“長輪詢”中進行阻塞(並且可選地等待到給定的位元組數,以確保大的傳輸大小)。

https://blog.csdn.net/qq_34886352/article/details/84303860

相關文章