Декодирование RabbitMQ полезной нагрузки - PullRequest
4 голосов
/ 08 июля 2019

В нашей команде мы обмениваемся сообщениями через RabbitMQ между двумя системами. Сообщения кодируются в protobuf (v3). Мы используем NServiceBus на отправляющей и получающей стороне. Мы используем пользовательский интерфейс управления RabbitMQ для мониторинга очереди ошибок. В процессе работы мы заметили, что нелегко понять полезную нагрузку сообщений в очереди ошибок, которые закодированы в base64.

Какой самый простой способ получить понятный человеку доступ к сообщениям в очереди ошибок? Мы имеем полный контроль над решениями в обеих системах, а также обсудили переход на сообщения в кодировке JSON (вместо protobuf). Но в остальном мы довольны нашей реализацией на основе protobuf. Который уже реализован в конце концов.

Ответы [ 2 ]

1 голос
/ 22 июля 2019

Protobuf v3 поддерживает форматирование как json, если данные проанализированы как IMessage (базовый тип для объектов в памяти protobuf объектов).

Таким образом, вы можете преобразовать одно сообщение в человеческое.можно читать следующим образом:

  • Используйте функцию webUI GetMessage, чтобы получить сообщение как base64, а затем запросить его
  • Преобразовать сообщение обратно в двоичный файл protobuf через Convert.FromBase64String
  • Разобрать его обратно в IMessage через ProtoMessageTypeGoesHere.Parser.ParseFrom(binaryData)

Затем можно преобразовать проанализированное сообщение в Json с помощью ToString() или Google.Protobuf.JsonFormatter.

* 1024.* Пока ваша очередь ошибок не будет нарушена повторной очередью (например, сбросом временных отметок или повторной обработкой), вы должны быть в состоянии сделать это для всех сообщений в очереди.
0 голосов
/ 17 июля 2019

Я бы не рекомендовал использовать для этого интерфейс управления.На мой взгляд, простой скрипт или html-страница с клиентом stomp будет намного проще в использовании и более защищенным от ошибок.

Однако, чтобы ответить на ваш вопрос: просто расшифровать сообщение и заменить текст,простое решение javascript будет работать нормально.

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

Это просто выберет поле сообщения на странице очереди в пользовательском интерфейсе управления RabbitMQ и заменит его декодированным значением (это функция atob).

Чтобы использовать это, вы можете запустить его из консоли или добавить в закладки в браузере.Просто используйте код с префиксом javascript:, например:

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