解码 RabbitMQ 负载

Decode RabbitMQ payload

在我们的团队中,我们通过 RabbitMQ 在两个系统之间交换消息。消息在 protobuf (v3) 中编码。我们在发送端和接收端使用 NServiceBus。我们使用 RabbitMQ 管理 UI 来监控错误队列。在生产中,我们注意到要理解错误队列中消息的有效负载并不容易,这些消息是 base64 编码的。

获得对错误队列中消息的可读访问权限的最简单方法是什么?我们可以完全控制两个系统中的决策,还讨论了切换到 JSON 编码的消息(而不是 protobuf)。但我们对基于 protobuf 的实现感到满意。毕竟已经实现了。

我不建议为此使用管理 UI。在我看来,带有 stomp 客户端的简单脚本或 html 页面会更容易使用,而且 error-proof。

但是,要回答您的问题:要简单地解码消息并替换文本,一个简单的 javascript 解决方案就可以了。

$(".msg-payload").text(atob($(".msg-payload").text()))

这将简单地select RabbitMQ 管理UI 队列页面上的消息字段并将其替换为解码值(即函数atob)。

要使用它,您可以从控制台 运行 或将其添加为浏览器中的书签。只需使用以 javascript: 为前缀的代码,例如:

javascript:$(".msg-payload").text(atob($(".msg-payload").text()))

Protobuf v3 支持格式化为 json,一旦您将数据解析为 IMessage(in-memory protobuf 对象的基本类型)。

因此您可以按如下方式将单个消息转换为人类可读:

  • 使用 webUI GetMessage 函数获取消息作为 base64 然后重新排队
  • 通过Convert.FromBase64String
  • 将消息转换回protobuf二进制
  • 通过ProtoMessageTypeGoesHere.Parser.ParseFrom(binaryData)
  • 将其解析回IMessage

然后您可以通过 ToString()Google.Protobuf.JsonFormatter.

将已解析的消息转换为 Json

只要您的错误队列不会被 re-queuing 中断(例如重置时间戳或重新处理),您应该能够对队列中的所有消息执行此操作。