【问题标题】:Message Meta-Data in MOMMOM 中的消息元数据
【发布时间】:2015-01-30 22:29:26
【问题描述】:

我开始探索 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 和有效负载。

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

【问题讨论】:

    标签: c# rabbitmq metadata nservicebus easynetq


    【解决方案1】:

    如果您需要将消息格式化为支持强模式的 XML 等格式,您可以在接收方接受消息之前简单地执行模式验证。然后,如果您可以确保在发送之前检查消息,那么您可以在必要时通过删除接收方验证来提高性能。

    【讨论】:

    • 我喜欢你所说的,但你的建议假设我自己编写验证代码。我试图发现的是我列出的工具之一是否为我提供了这种能力。而且,更准确地说,我正在寻找的实际上并不是“验证”。我正在寻找一种 AOP 行为或“装饰器”模式,它允许我在生产者的消息上线之前对其进行操作;我想知道上述工具之一是否支持。
    • 该要求在很大程度上与消息的传输正交,开发人员可能已经明确排除了这一点,以允许用户分层他们自己的偏好。 @Andreas-Öhlund 提供的 NServiceBus 示例就是一个示例。相同的参考包含您需要的ValidationMessageMutator
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-05-19
      • 2017-12-04
      • 1970-01-01
      • 2021-09-11
      • 2021-10-30
      • 1970-01-01
      • 1970-01-01
      • 2011-10-21
      • 2012-11-15
      相关资源
      最近更新 更多