2015-01-30 5 views
0

Я начинаю свое исследование NServiceBus, RabbitMQ, MassTransit и EasyNetQ.Сообщение метаданных в MOM

Одна деталь, которую я специально хочу понять, заключается в том, как обеспечить, чтобы пользовательский набор метаданных всегда отправлялся с каждым опубликованным сообщением?

Например, независимо от того, что публикует производитель сообщение, возможно, я хочу, чтобы гарантировать, что следующие части информации всегда передается как часть сообщения:

  • TimeStamp
  • Workflow Имя
  • Приоритет

На самом деле не имеет значения, что такое метаданные, важно иметь возможность или способность пересылать такую ​​произвольную информацию.

Мне нравится идея, что пространство имен и имя класса сообщения, отправленного производителем, автоматически переводятся в «ключ маршрутизации» сообщения. Однако для присоединения дополнительных метаданных к сообщению может быть необходимо иметь какую-то «предварительно опубликованную» точку привязки, которая позволяет произвольному сообщению преобразовывать в полезную нагрузку объекта-обертки, так как например:

public class BaseMessage { 
    //a couple fields of meta-data that every message should have. 
    public string TimeStamp; 
    public int Priority; 

    //The payload is the real message that the consumer cares about 
    //and can be any format (JSON, XML, etc). 
    public string payload; 
} 

в этом случае, я не хочу «маршрутизация ключа», чтобы содержать имя или пространство имен BaseMessage. Тип полезной нагрузки до ее сериализации - это то, на чем должен основываться «ключ маршрутизации».

Конечно, все это также предполагает, что потребитель имеет удобный способ де-сериализации как BaseMessage, так и полезной нагрузки.

Итак, какой из перечисленных мной инструментов поддерживает эту потребность? Пожалуйста, покажите пример синтаксиса, где это применимо.

ответ

0

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

+0

Мне нравится то, что вы говорите, но ваше предположение предполагает, что я сам пишу код проверки. То, что я пытаюсь обнаружить, - это использовать один из перечисленных мной инструментов. И, точнее, на самом деле это не «проверка», которую я ищу. Я ищу поведение AOP или шаблон «decorator», который позволяет мне манипулировать сообщением продюсера, прежде чем он пойдет на провод; Я хотел бы знать, поддерживает ли один из вышеупомянутых инструментов. –

+0

Требование в значительной степени ортогонально к передаче сообщений, и разработчики, возможно, специально исключили это, чтобы позволить пользователю накладывать собственные предпочтения. Пример NServiceBus, представленный @ Andreas-Öhlund, является примером. Эта же ссылка содержит [ValidationMessageMutator] (http://docs.particular.net/samples/messagemutators/#validationmessagemutator), который вам нужен. – Pekka

0

В NServiceBus вы будете использовать сообщение мутатор, чтобы убедиться, что все сообщения, отправленные будут иметь необходимые данные

http://docs.particular.net/samples/messagemutators/#transportmessagecompressionmutator

Я также рекомендовал бы использовать заголовки transmitt эти данные, чтобы избежать «poluting» свой бизнес-данные контракты с инфраструктурными проблемами