【问题标题】:RabbitMQ using custom headers to store message-parametersRabbitMQ 使用自定义标头来存储消息参数
【发布时间】:2017-03-04 08:19:55
【问题描述】:

我是 RabbitMQ 的新手,有点迷失在文档中。

目前,作为一个例子,我正在尝试构建一个小型邮件服务来侦听队列,但我有点卡在应该将我的服务具有的参数(目的地、主题、.. .)

我应该将它们放在某种编码格式 (json) 中、我的消息中,还是应该使用标头构造,如下例所示:

string message = "Hello World!";
var body = Encoding.UTF8.GetBytes(message);

var properties = new BasicProperties();
properties.Headers = new Dictionary<string, object>();
properties.Headers.Add("destination", "matthias123@localhost");

channel.BasicPublish(exchange: "", routingKey: "sendmail", basicProperties: properties,body: body);

使用标题是否提供额外的好处?例如,是否可以过滤发送到特定目的地的消息?

【问题讨论】:

    标签: rabbitmq messaging


    【解决方案1】:

    我不会为您尝试做的事情使用标题。在我看来,该信息属于邮件正文。

    这样看:

    邮件正文应包含完成所请求工作所需的所有内容。在这种情况下,它将是发件人、主题、电子邮件内容等。

    另一方面,标头是关于 AMQP 消息的数据位,而不是消息内容。

    这里有很多潜在的混淆,你要做的工作是“电子邮件”。 AMQP 消息和电子邮件消息之间的术语重叠过多。

    话虽如此,我将选择一个不同的工作示例:计算斐波那契数列。

    在这种情况下,您通过 rabbitmq 发送的消息将包含诸如预先计算斐波那契的多少个位置,然后再发送回多少个。

    例如,您可能会发送这样的消息(在本例中为 json):

    {
      start: 1,
      take: 3
    }
    

    这应该产生1, 1, 2 的结果,因为它从第一个位置开始并从序列中返回 3 个项目。

    使用您的具体问题和逻辑:我应该将starttake 属性放入消息的标题中吗?

    没有。

    如果我这样做了,那意味着我的消息是空的,因为关于要完成的工作的所有信息都将包含在标题中。

    当我这样看时它没有意义,因为现在没有要发送的消息......只有标题。

    另一方面,如果我将这两个数据点保留在消息正文中,则标头作为发送有关 AMQP 消息本身的元数据的一种方式变得更加有用...不是有关消息内容的信息,而是有关消息的想法的信息。

    在这种情况下,我是说我想从斐波那契数列中返回项目。换句话说,我正在参与 RPC(远程过程调用)并期待返回值。

    AMQP 不直接支持返回值。然而,我能做的是将队列名称填充到标题中并将结果发送到该队列。然后请求斐波那契数的代码可以监听该队列并获得结果。

    所以我在发送消息时可能会这样做:

    var properties = new BasicProperties();
    properties.Headers = new Dictionary();
    properties.Headers.Add("return-queue", "fibreturn");
    

    这里我设置了一个“return-queue”标头——关于消息的信息,或者在这种情况下请求信息——在标头内部。处理斐波那契数列的代码将读取此标头并将响应发送回此队列。

    这是对标头的更好使用,因为它使标头存储有关消息的信息...在这种情况下,应将响应发送到哪里。但是,标题不包含有关要完成的实际工作的信息。这些都直接存储在消息正文中。


    附:我故意不使用您通常应该使用的“回复”属性来执行 RCP。我用这个作为一个例子来说明为什么你不应该把你的“目的地”放在标题中。为了更好地实现斐波那契序列的想法,请参阅 RMQ 文档以及它如何正确使用“回复”https://www.rabbitmq.com/tutorials/tutorial-six-dotnet.html

    【讨论】:

    • 我认为完全不鼓励使用自定义标题是适当的。虽然我同意上述数据属于正文,但设置客户消息标头是有效的。例如,使用 x-type 标头指定消息类型,以便消费者可以反序列化有效负载。
    • 标头内容类型不是自定义标头。
    • (编辑超时)。另外,在这个答案中,他建议您可以在标头中放入任何关于有效负载的元数据。事实上,这就是标题的 FOR。但是你需要操作的数据呢?它应该在有效载荷中。我提醒您不要在空信封上写你的信。
    猜你喜欢
    • 2019-08-24
    • 1970-01-01
    • 1970-01-01
    • 2014-09-18
    • 2018-08-30
    • 2017-11-13
    • 1970-01-01
    • 2013-07-13
    • 1970-01-01
    相关资源
    最近更新 更多