解码 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 中断(例如重置时间戳或重新处理),您应该能够对队列中的所有消息执行此操作。
在我们的团队中,我们通过 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
将消息转换回 - 通过
ProtoMessageTypeGoesHere.Parser.ParseFrom(binaryData)
将其解析回
protobuf
二进制
IMessage
然后您可以通过 ToString()
或 Google.Protobuf.JsonFormatter
.
只要您的错误队列不会被 re-queuing 中断(例如重置时间戳或重新处理),您应该能够对队列中的所有消息执行此操作。