簡體   English   中英

了解 Azure 事件中心分區消費者模式

[英]Understanding Azure Event Hubs partitioned consumer pattern

Azure 事件中心使用文檔中描述的分區使用者模式。 當談到現實世界的場景時,我在理解這個模型的消費者方面有一些問題。

所以假設我有 1000 條消息發送到具有 4 個分區的事件中心,沒有定義任何分區 ID。 這意味着消息將使用循環方法發送到所有分區。

現在我想讓兩個應用程序將消息分發到兩個不同的數據庫。 我的問題是:

  1. 假設對於第一個應用程序,我想將所有消息存儲在數據庫 1 中。這意味着,為了獲得最大速度,在我的消費者應用程序中,我需要有 4 個線程(消費者),每個線程偵聽事件中心的一個分區,對嗎? 他們每個人還必須為他們正在讀取的分區(檢查點)存儲自己的偏移量。
  2. 假設我的第二個應用程序想要過濾消息並且只在數據庫 2 中存儲它們的一個子集。我還需要 4 個消費者,因為我不知道哪個消息去哪個分區,對吧?
  3. 同樣對於這兩個應用程序,我需要有兩個消費者組,但為什么呢? 消費者組中是否定義了消息過濾? 我真的不明白為什么我需要這個,因為應用程序消費者自己存儲分區檢查點,我可以在應用程序本身內進行過濾。

我知道有EventProcessorHost類,但我想在較低級別上了解 EventHub 的概念。

  1. 假設對於第一個應用程序,我想將所有消息存儲在數據庫 1 中。這意味着,為了獲得最大速度,在我的消費者應用程序中,我需要有 4 個線程(消費者),每個線程偵聽事件中心的一個分區,對嗎? 他們每個人還必須為他們正在讀取的分區(檢查點)存儲自己的偏移量。

正確,您應該為每個預配的分區設置一個進程。 所以,如果你有 4 個處理器,你應該有 4 個進程,每個進程處理特定分區的消息。 如果您使用EventProcessorHost處理消息,它將為您處理進程的啟動。

  1. 假設我的第二個應用程序想要過濾消息並且只在數據庫 2 中存儲它們的一個子集。我還需要4 個消費者,因為我不知道哪個消息去哪個分區,對吧?

你對消費者是什么意思? 您需要另外 4 個進程來處理消息,應將它們配置為使用不同的消費者組進行讀取。 否則它們將與 1 的進程競爭

  1. 同樣對於這兩個應用程序,我需要有兩個消費者組,但為什么呢? 消費者組中是否定義了消息過濾? 我真的不明白為什么我需要這個,因為應用程序消費者自己存儲分區檢查點,我可以在應用程序本身內進行過濾。

讓我們定義一個消費者組:

消費者組使多個消費應用程序能夠分別擁有傳入消息流的單獨視圖,並以自己的速度和自己的偏移量獨立讀取流

所以是的,您需要 2 個不同的消費者群體。 每個消費者組將獲得發送到事件中心分區的所有消息。 每個消費者組在消息流中跟蹤自己的進度。 這就是為什么你的場景需要兩個。

假設您定義了一個名為“App2-Consumer-Group”的附加消費者組,讀取器進程將接收所有消息,但不應對他們不感興趣的消息采取任何操作。

如果您不創建額外的消費者組,默認消費者組的讀取器進程將處理第一個應用程序的消息,並使用檢查點機制將它們標記為已處理。 第二個應用程序的讀取器進程不會收到任何消息,因為它們已經被標記為已處理。 (在現實生活中,當使用一個包含一些消息的消費者組時,第一個應用程序的讀取器進程可能會獲取一些消息,而第二個應用程序的讀取器進程可能會獲取一些消息,因為這些進程將嘗試鎖定一個具體分區)

我認為這張圖片清楚地顯示了消費者群體如何在消息流中跟蹤他們自己的進度,因此如果您對 2 個不同的應用程序有 2 種不同的處理邏輯,為什么需要拖曳它們:

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM