MOM中的消息元数据

时间:2015-01-30 22:29:27

标签: c# rabbitmq metadata nservicebus easynetq

我开始探索NServiceBus,RabbitMQ,MassTransit和EasyNetQ。

我特别想了解的一个细节是如何确保每个已发布的消息始终发送一组自定义的元数据?

例如,无论消息生成者发布什么,我可能希望确保始终将以下信息作为消息的一部分发送:

  • 时间戳
  • 工作流程名称
  • 优先级

元数据是什么并不重要,重要的是拥有选择或能力来传播这些任意信息。

我喜欢这样的想法,即生产者发送的消息的名称空间和类名自动转换为消息的“路由密钥”。但是,为了将附加的元数据附加到消息中,可能需要具有某种“预发布”钩点,该钩点允许将任意消息转换为包装器对象的有效负载,如这样:

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和有效负载。

那么我列出的哪种工具支持这种需求?请在适用的地方显示示例语法。

2 个答案:

答案 0 :(得分:0)

如果您要求消息的格式类似于XML,支持强模式,则只需在接收方接受消息之前执行模式验证即可。然后,如果您可以确保在发送之前检查消息,则可以通过在必要时删除接收方验证来提高性能。

答案 1 :(得分:0)

在NServiceBus中,您将使用消息mutator来确保发送的所有消息都具有所需的数据

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

我还建议使用标头传输此数据,以避免因基础架构问题“污染”您的业务数据合同