[英]Azure event hubs and multiple consumer groups
在以下方案中需要有關使用Azure事件中心的幫助。 我認為消費者群體可能是這種情況的正確選擇,但我無法在網上找到具體的例子。
以下是問題的粗略描述以及使用事件中心的建議解決方案( 我不確定這是否是最佳解決方案。非常感謝您的反饋 )
我有多個事件源可以生成大量事件數據(來自傳感器的遙測數據),需要保存到我們的數據庫中,並且應該並行執行一些分析,如運行平均值,最小值 - 最大值。
發送方只能將數據發送到單個端點,但事件中心應該使這些數據可供兩個數據處理程序使用。
我正在考慮使用兩個使用者組,第一個是工作者角色實例的集群,負責將數據保存到我們的鍵值存儲,第二個消費者組將是一個分析引擎(可能與Azure流分析一起使用) )。
首先,我如何設置消費者群體,在發送者/接收者方面是否需要做些事情,以便所有消費者群體都能看到事件副本?
我在線閱讀了很多例子,但他們要么使用client.GetDefaultConsumerGroup();
和/或讓所有分區由同一輔助角色的多個實例處理。
對於我的場景,當觸發事件時,它需要由兩個不同的工作者角色並行處理(一個保存數據,另一個執行某些分析)
謝謝!
TLDR:看起來很合理,只需使用CreateConsumerGroupIfNotExists使用不同的名稱來創建兩個Consumer Group。
消費者群體主要是一個概念,因此它們的工作方式取決於您的訂閱者的實施方式。 如您所知,從概念上講,它們是一組一起工作的訂閱者,以便每個組接收所有消息,並且在理想情況下(不會發生)情況可能會消耗每個消息一次。 這意味着每個使用者組將 “使所有分區都由同一輔助角色的多個實例處理”。 你要這個。
這可以以不同方式實現。 Microsoft已經提供了兩種直接使用Event Hubs消息的方法,以及使用Streaming Analytics等可能基於兩種直接方式構建的選項。 第一種方式是Event Hub Receiver ,第二種方式是更高級別的事件處理器主機 。
我沒有直接使用Event Hub Receiver所以這個特別的評論是基於這些系統如何工作的理論和文檔中的推測:雖然它們是從EventHubConsumerGroups 創建的 , 但由於這些接收器不相互協調,因此它沒有用處。 如果您使用這些,您將需要(並且可以!)自己完成所有協調和提交偏移,這在某些情況下具有優勢,例如在與計算聚合相同的事務中將偏移量寫入事務DB。 使用這些低級別接收器 ,使用相同Azure使用者組的不同邏輯使用者組可能不應該(規范性而非實用的建議)特別成問題,但是如果要么重要或者您更改為EventProcessorHosts ,則應使用不同的名稱。
現在轉到更有用的信息, EventProcessorHosts可能建立在EventHubReceivers之上 。 它們是更高級別的東西,並且支持使多台機器作為邏輯消費者組一起工作。 下面我已經從我的代碼中包含了一個輕微編輯的片段,它使得一個EventProcessorHost在解釋一些選擇時留下了一堆注釋。
//We need an identifier for the lease. It must be unique across concurrently
//running instances of the program. There are three main options for this. The
//first is a static value from a config file. The second is the machine's NETBIOS
//name ie System.Environment.MachineName. The third is a random value unique per run which
//we have chosen here, if our VMs have very weak randomness bad things may happen.
string hostName = Guid.NewGuid().ToString();
//It's not clear if we want this here long term or if we prefer that the Consumer
//Groups be created out of band. Nor are there necessarily good tools to discover
//existing consumer groups.
NamespaceManager namespaceManager =
NamespaceManager.CreateFromConnectionString(eventHubConnectionString);
EventHubDescription ehd = namespaceManager.GetEventHub(eventHubPath);
namespaceManager.CreateConsumerGroupIfNotExists(ehd.Path, consumerGroupName);
host = new EventProcessorHost(hostName, eventHubPath, consumerGroupName,
eventHubConnectionString, storageConnectionString, leaseContainerName);
//Call something like this when you want it to start
host.RegisterEventProcessorFactoryAsync(factory)
您會注意到我告訴Azure創建一個新的Consumer Group如果它不存在,如果沒有,您將收到一條可愛的錯誤消息。 老實說,我不知道這是什么目的,因為它不包括跨實例需要相同的存儲連接字符串,以便EventProcessorHost的協調(並且可能是提交)正常工作。
在這里,我提供了一張來自Azure Storage Explorer的圖片,租用了我在11月試驗的消費者群體的租約和可能的偏差。 請注意,雖然我有一個testhub和一個testhub-testcg容器,但這是由於手動命名它們。 如果它們在同一個容器中,那么就像“$ Default / 0”vs“testcg / 0”。
如您所見,每個分區有一個blob。 我的假設是這些blob用於兩件事。 第一個是用於在實例之間分配分區的Blob租約,請參見此處 ,第二個是在已提交的分區中存儲偏移量。
消費實例不是將數據推送到消費者組,而是要求存儲系統在一個分區中的某個偏移處獲取數據。 EventProcessorHosts是一個很好的高級方式,擁有一個邏輯消費者組,每個分區一次只能被一個消費者讀取,並且不會忘記邏輯消費者組在每個分區中所取得的進展。
請記住,每個分區的吞吐量都是經過測量的,這樣如果您最大限度地減少進入,那么您只能擁有兩個完全符合速度的邏輯消費者。 因此,您需要確保有足夠的分區和吞吐量單位,您可以:
總之:消費者群體是您所需要的。 您閱讀的使用特定使用者組的示例很好,在每個邏輯使用者組中使用Azure使用者組的相同名稱,並且不同的邏輯使用者組使用不同的名稱。
我還沒有使用過Azure流分析,但至少在預覽版中,您只能使用默認的使用者群組 。 因此,不要將默認的使用者組用於其他內容,如果您需要兩個單獨的Azure Stream Analytics,您可能需要做一些令人討厭的事情。 但它很容易配置!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.