2011-06-26 36 views
1

比方說,我有一個ClientRequestMessage消息,其中包含對特定Client的請求。網絡應用程序將生成這些請求,並且需要將它們發送到正確的Client進行處理。我可以爲此考慮一些選擇。將NServiceBus消息路由到特定客戶端的最佳方式是什麼?

  1. 我能有一個隊列,所有的消息去和特定的客戶端處理程序檢查屬性(如ClientId),以決定他們是否關心它。儘管如此,這在許多層面上都感覺不對。
  2. 我可以向所有客戶發佈消息,他們可以決定他們在處理過程中是否關心它。這看起來像是太多的流量,並且浪費了每個客戶的時間處理消息,儘管他們不應該關心。
  3. 我可能有客戶端特定的隊列,這些消息也被路由。這對我來說是最好的,但我不確定如何去做。我想保持簡單並避免客戶端特定的消息類型,但我不知道如何告訴NServiceBus「客戶端A將其發送到客戶端A的隊列,並且客戶端B將其發送到客戶端B的隊列」。

所以我的問題是,什麼是最好的(最有效的?最容易管理?)的方式來設置它?我很確定我需要使用經銷商,但不是積極的想法,我會問。

紅利問題:
假設每個客戶端都有多個處理程序。我如何確保其中只有一個人處理給定的消息?我需要每個客戶的分銷商嗎?

+0

你最終使用了什麼解決方案? – Charlino

+0

我仍在努力解決它。我對發佈到所有方法都不是很滿意,因爲這些是客戶端特定的隊列,理想情況下他們無法訪問彼此的消息。 –

回答

0

您可以通過使用MessageEndpointMappings配置部分來告訴NSB在哪裏放置消息。您可以將特定的消息類型或整個程序集映射到隊列。如果你不想創建特定的消息類型並映射它們,那麼我會推薦發佈方法。從隊列中刪除消息的開銷很小。

如果你的「客戶端」有很多NSB的實例來接收消息,那麼你將需要使用分發服務器。查看distributed Pub/Sub documentation

+0

將有100多個客戶都收到相同類型的消息(爲了爭取訂單),所以我不想創建100多個特定的客戶訂單消息類。看起來更容易包含客戶端標識符。所以你說只是將所有的訂單發佈到所有的客戶端隊列中,讓他們忽略那些不屬於他們的訂單? –

+0

是的,讓他們忽略他們不關心的信息是最容易的。 –

0

如果您真正需要的是允許您只有一條消息的解決方案,您可以在基於clientId的消息上放置特定過濾器,並且只在與客戶端關聯時將消息路由到客戶端,那麼我會使用PServiceBus(pservicebus.codeplex.com)。它將使您更輕鬆地爲每個客戶端指定一組訂閱,並將其消息全部由clientId過濾爲特定的隊列或您有哪些可用的傳輸。下面的示例顯示了通過UserName屬性過濾ChatTopic,並且訂閱者僅在消息發佈時纔在指定的傳輸中接收消息。UserName屬性不是TJ。你也可以使用複雜的過濾器,如你所做的事情,如GreaterThan(「MyComplexProperty.Blah.ID」,5)

Subscriber.New("MyUserName").Durable(false) 
      .SubscribeTo(Topic.Select<ChatTopic>().NotEqual("UserName", "TJ")) 
      .AddTransport("Tcp", 
       Transport.New<TcpTransport>(
       transport => { 
        transport.Format = TransportFormat.Json; 
        transport.IPAddress = "127.0.0.1"; 
        transport.Port = port; 
       }), "ChatTopic") 
      .Save(); 
相關問題