Каков наилучший способ направить сообщения NServiceBus определенным клиентам?

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

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

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

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

2 ответа

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

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

Если вам действительно нужно решение, которое позволяет вам иметь только одно сообщение, в котором вы можете поместить определенный фильтр в сообщение на основе clientId и направить сообщение клиенту только тогда, когда оно относится к ним, тогда я бы использовал PServiceBus( http://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();
Другие вопросы по тегам