一千萬個為什麽

搜索

與分銷商的NServiceBus管道

我正在使用NServiceBus構建一個處理管道,但是我遇到了分發器配置的問題,以便使流程中的每個步驟都可以擴展。這是一些信息:

  • 管道將有一個主進程,為WorkItem顯示“OK,time to start”,然後啟動一個類似流程圖的流程。
  • 流程圖中的每個步驟都可能計算成本很高,因此我希望能夠擴展每個步驟。這告訴我每個步驟都需要一個分銷商。
  • 我希望以後能夠將其他活動掛鉤到事件上。這告訴我完成後需要發布()消息,而不是Send()它們。
  • 進程可能需要根據條件進行分支。這告訴我一個進程必須能夠發布多種類型的消息。
  • 進程可能需要加入分叉。我想我應該使用Sagas。

希望這些假設是好的,否則我比我想象的更麻煩。

為了簡單起見,讓我們忘記分叉或加入並考慮一個簡單的管道,步驟A後跟步驟B,結束步驟C.每一步都有自己的分配器,可以有很多節點處理消息。

  • NodeA工作者包含IHandleMessages處理器,並發布EventA
  • NodeB worker包含IHandleMessages處理器,並發布Event B
  • NodeC worker包含一個IHandleMessages處理器,然後管道完成。

以下是配置文件的相關部分,其中#表示worker的編號,(即有NodeA.1和NodeA.2的輸入隊列):

NodeA:


    
    


NodeB:


    
        
    


NodeC:


    
        
    

以下是經銷商配置的相關部分:

Distributor A:




Distributor B:




Distributor C:



我正在使用每個節點的2個實例進行測試,問題似乎出現在Node B的中間。基本上有兩件事情可能發生:

  1. Both instances of Node B report that it is subscribing to EventA, and also that [email protected] is subscribing to the EventB that Node B publishes. In this case, everything works great.
  2. Both instances of Node B report that it is subscribing to EventA, however, one worker says [email protected] is subscribing TWICE, while the other worker does not mention it.

在第二種情況下,似乎僅通過分發者路由訂閱消息的方式來控制,如果“overachiever”節點處理EventA,一切都很好。如果“未成功者”處理EventA,則EventB的發布沒有訂閱者,工作流程就會消失。

所以,我的問題:

  1. Is this kind of setup possible?
  2. Is the configuration correct? It's hard to find any examples of configuration with distributors beyond a simple one-level publisher/2-worker setup.
  3. Would it make more sense to have one central broker process that does all the non-computationally-intensive traffic cop operations, and only sends messages to processes behind distributors when the task is long-running and must be load balanced?
    • Then the load-balanced nodes could simply reply back to the central broker, which seems easier.
    • On the other hand, that seems at odds with the decentralization that is NServiceBus's strength.
    • And if this is the answer, and the long running process's done event is a reply, how do you keep the Publish that enables later extensibility on published events?

最佳答案

您遇到的問題是您的節點沒有看到彼此的訂戶列表。您遇到這個問題的原因是您在默認的NServiceBus配置文件(lite)下嘗試生產方案(橫向擴展),這不支持橫向擴展,但使單機開發非常高效。

要解決此問題,請使用生成配置文件運行NServiceBus主機,如本頁所述:

http://docs.particular.net/nservicebus/hosting/nservicebus-host/型材

這將讓不同的節點共享相同的訂戶列表。

除此之外,您的配置正確。

轉載註明原文: 與分銷商的NServiceBus管道