簡體   English   中英

使用 Azure 服務總線重新總線、競爭消費者和多租戶

[英]Rebus with Azure Service Bus, Competing consumers and multi-tenancy

我一直在嘗試為 Azure 服務總線設置 Rebus,但我發現很難找到適合我的用例的示例,也很難自己構建解決方案。

我有多個實例生成Message1 ,每個實例為特定客戶端運行,但是它們都生成消息類Message1實例。 這些消息需要發送到 ASB。 接下來,每個租戶都有很多競爭消費者 換句話說,對於每個租戶, Message1有多個消費者,但只有一個消費者可以處理此消息。 這使我能夠並行化繁重的計算工作。

通常,我會在每個客戶的 ASB 中創建 1 個隊列,從而保證來自不同客戶的消息永遠不會混淆,或者被執行多次。 然而,Rebus 創建主題,因此啟用多個訂閱。 就我的理解而言,這意味着所有訂閱者都會收到這些消息(因此導致重復)。 當然,可以過濾這些消息。 但我沒有找到任何明確的例子。 這也感覺有點不安全; 我不能過分強調這些每個租戶的數據流需要分開。

到目前為止我設法做的事情:

  • 為每個租戶創建單獨的主題
  • 為每個租戶創建單獨的(錯誤)隊列,但是,我不確定 Rebus 如何使用這些隊列,因為消息是在主題上發布的

總而言之,我的問題是:如何設置一個場景,即同一消息不能被傳遞兩次,同時還要確保來自一個租戶的消息只能由為該租戶工作的消費者處理。

使用 Rebus,基本上有兩種路由消息的方式:

  1. 通過發送它們: await bus.Send(message)
  2. 通過發布它們: await bus.Publish(message)

當您發送消息時,Rebus 假定消息必須發送到單個隊列。 在我看來,這就是你想要的。

當您發布消息時,Rebus 創建一個主題(根據發布消息的類型命名)並將其發布到該主題。 訂閱該主題的任何人都會在她/他的輸入隊列中獲得該消息的副本。

開箱即用,Rebus 將鼓勵您將希望發送的每種消息類型映射到特定隊列,這意味着配置如下:

Configure.With(...)
    .Transport(t => ...
    .Routing(r => r.TypeBased().Map<SomeMessage>("some-queue"))
    .Start();

將使您能夠做到這一點:

await bus.Send(new SomeMessage());

然后消息將直接發送到隊列“some-queue”。

在我看來,您並不想為每個租戶創建主題——它們不能用於實現“競爭消費者”,因為主題的目的是將每條消息的單獨副本分發給每個訂閱者。

然而,隊列旨在以你想要的方式分配工作——你只需要確保每條消息都被發送到正確的隊列。

如果您想閱讀更多內容,請查看關於 routing 的 wiki 頁面

暫無
暫無

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

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