AMQP(rabbitmq)识别错误消息的来源

时间:2018-11-26 14:08:24

标签: rabbitmq amqp

在rabbitmq中识别(错误)AMQP消息来源的最佳方法是什么?

该方案是多个客户端将消息发布到服务器,如果成功,则会将消息发布到扇出交换机(供发布/订阅使用)。 客户端也是该队列的订阅者,并且没有自己的应答队列。

如果服务器认为邮件无效,则会对其进行处理并丢弃。

我们还需要另外两件事:

  • 发布一条消息,客户端或监视系统可能会说“停止向我发送垃圾”
  • 记录有关错误消息的诊断信息

什么是合适的策略?

哪些标头字段适合标识邮件的始发者?

还有其他考虑吗?

appid 标头字段可以标识正在发送的应用程序,但仅凭其本身是不够的,因为在一台或多台计算机上可能有多个实例。

错误的客户端可能使用 messageid 来标识它发送的消息(客户端可以分配或访问该消息)。

例如,监视系统(例如prometheus + kubernetes)将需要更多尝试来消除不良的客户端进程。

我假设一种适当的方法是要求客户端设置某些标头字段。

第二,对于那些不符合我们要求的客户,我们该怎么办?

1 个答案:

答案 0 :(得分:0)

我在AMQP方面的经验有限,因此,如果可以的话,请对此进行改进

使用host+pid来标识一个进程

appid是自由格式,因此一种方法可能是在其中包含多个应用程序ID。例如

appid: applicationid.serverip.pid

这看起来像是扩展了“ app id”的语义,但是app_id is entirely application defined。 应用程序可以通过简单的字符串比较来使用“应用程序ID”标识自己。

arbitrary key values are permitted在基本属性之上,因此您可以代替/也可以添加以下属性:

origin-host: serverip
origin-pid: pid

与使用诸如app_id之类的“内置”字段相比,这可能需要少量的额外编程工作。与此相关的还有一个小的“在线交易”成本(自定义属性are serialized as positional arguments in message header instead of associative array to save bandwidth)。 相对于解码 appid 字段中的字符串,可能需要权衡取舍。

您还可以设置死信交换来保留消息本身,但是消息将需要操作员干预才能使用。因此,我认为这只会对诊断有所帮助。