【问题标题】:Decode RabbitMQ payload解码 RabbitMQ 有效负载
【发布时间】:2019-07-08 18:08:17
【问题描述】:

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

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

【问题讨论】:

    标签: rabbitmq protocol-buffers nservicebus


    【解决方案1】:

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

    因此,您可以将单个消息转换为人类可读的,如下所示:

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

    然后您可以通过ToString()Google.Protobuf.JsonFormatter 将解析后的消息转换为Json。

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

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

      【讨论】:

      • 这只是从base64转换为二进制,对于protobuf消息,这看起来像����..
      猜你喜欢
      • 2018-08-06
      • 2021-03-06
      • 2020-09-18
      • 1970-01-01
      • 1970-01-01
      • 2017-02-02
      • 1970-01-01
      • 1970-01-01
      • 2020-06-13
      相关资源
      最近更新 更多