Каков наилучший способ направить сообщения NServiceBus определенным клиентам? - PullRequest
1 голос
/ 26 июня 2011

Допустим, у меня есть сообщение ClientRequestMessage, содержащее запрос для конкретного Client. Веб-приложение сгенерирует эти запросы, и они должны быть отправлены на правильный Client для обработки. Я могу придумать несколько вариантов для этого.

  1. У меня может быть одна очередь, в которую отправляются все сообщения, и определенные обработчики клиента проверяют свойство (например, ClientId), чтобы решить, заботятся ли они об этом. Мне это кажется неправильным на многих уровнях.
  2. Я мог бы опубликовать сообщение всем клиентам, и они могли бы решить, заботятся ли они об этом во время обработки. Это кажется слишком большим трафиком и тратит впустую время каждого клиента, обрабатывающего сообщения, о которых он не должен заботиться вообще.
  3. У меня могут быть специфичные для клиента очереди, что эти сообщения также маршрутизируются. Этот мне кажется лучшим, но я не уверен, как это сделать. Я хотел бы сохранить простоту и избегать специфичных для клиента типов сообщений, но я не уверен, как сказать NServiceBus «для клиента A отправить его в очередь клиента A, а для клиента B отправить его в очередь клиента B».

Итак, мой вопрос: каков наилучший (самый эффективный? Самый простой в управлении?) Способ настроить это? Я почти уверен, что мне нужно использовать дистрибьютора, но не уверен, поэтому подумал, что я бы спросил.

БОНУСНЫЙ ВОПРОС:
Допустим, у каждого клиента есть несколько обработчиков. Как я могу убедиться, что только один из них обрабатывает данное сообщение? Нужен ли мне дистрибьютор для каждого клиента?

Ответы [ 2 ]

0 голосов
/ 20 июля 2011

Если то, что вам действительно нужно, - это решение, которое позволяет вам иметь только одно сообщение, в котором вы можете поместить определенный фильтр в сообщение на основе clientId и направить сообщение клиенту только тогда, когда оно относится к ним, тогда я бы использовалPServiceBus ( pservicebus.codeplex.com ).Это облегчит вам конкретный набор подписок для каждого вашего клиента, где их сообщения все фильтруются по clientId в определенную очередь или какой транспорт у вас есть.В приведенном ниже примере показана фильтрация ChatTopic по свойству UserName, и подписчик получает сообщение только на указанном транспорте, если сообщение было опубликовано, свойство 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();
0 голосов
/ 27 июня 2011

Вы можете указать NSB, куда помещать сообщения, используя раздел конфигурации MessageEndpointMappings. Вы можете отобразить определенный тип сообщения или всю сборку в очередь. Если вы не хотите создавать определенные типы сообщений и отображать их, я бы порекомендовал подход публикации. Затраты на удаление сообщения из очереди довольно минимальны.

Если ваш «клиент» имеет много экземпляров NSB для получения сообщений, вам нужно будет использовать Дистрибьютора. Ознакомьтесь с распределенной документацией Pub / Sub .

...