В каком формате хранятся сообщения в RabbitMQ?

Ответ

Сообщения в RabbitMQ хранятся как бинарные данные (byte[]). Брокер не навязывает конкретный формат сериализации — это ответственность отправителя и потребителя. На практике чаще всего используют:

  1. JSON (через UTF-8 кодировку) — для простоты и читаемости.
  2. Protocol Buffers (Protobuf) — для эффективности и строгой схемы данных.
  3. MessagePack — как компромисс между размером и скоростью.
  4. Plain text или XML — в legacy-системах.

Пример публикации JSON-сообщения на C#:

var factory = new ConnectionFactory { HostName = "localhost" };
using var connection = factory.CreateConnection();
using var channel = connection.CreateModel();

// Объявляем очередь
channel.QueueDeclare(queue: "orders", durable: true, exclusive: false, autoDelete: false);

// Создаём объект и сериализуем в JSON
var order = new { OrderId = 123, Product = "Book", Quantity = 2 };
var jsonBody = JsonSerializer.SerializeToUtf8Bytes(order);

// Публикуем как массив байт
var properties = channel.CreateBasicProperties();
properties.Persistent = true; // Сохранить на диск
channel.BasicPublish(exchange: "", routingKey: "orders", basicProperties: properties, body: jsonBody);

Важные детали:

  • Само сообщение состоит из тела (body) и свойств (headers, properties), где properties могут содержать метаданные (content-type, message-id, timestamp).
  • Для указания формата можно использовать свойство ContentType (например, application/json).
  • Сообщения могут сохраняться на диск (durable queues) или храниться только в памяти.

Ответ 18+ 🔞

Давай разберёмся, как эта сука RabbitMQ с сообщениями работает, а то некоторые думают, что там волшебные эльфы данные переносят.

Сообщения в RabbitMQ — это по сути голые байты (byte[]). Сам брокер — тупой как пробка, ему похуй, что ты туда пихаешь. Его дело — принять и передать. А вот что это за данные и как их читать — это уже твои, дружок, проблемы. Ты и отправитель, и получатель должны договориться, на каком языке вы общаетесь.

На практике народ юзает обычно вот это:

  1. JSON (в кодировке UTF-8) — самый популярный ушлёпок. Все его понимают, читается легко, но жрёт место и не самый быстрый.
  2. Protocol Buffers (Protobuf) — строгий и эффективный зануда. Маленький, быстрый, но нужно заранее схемы описывать. Любимчик в микросервисах, где перформанс наше всё.
  3. MessagePack — типа как JSON, но бинарный. Компромиссный уродец: меньше размер, но уже не так просто человеческим глазом прочитать.
  4. Простой текст или XML — это обычно для легаси-систем, которые ещё на COBOL держатся. Если видишь XML в очередях — беги, либо готовься к боли.

Вот, смотри, как на C# какую-нибудь хуйню в JSON отправить:

var factory = new ConnectionFactory { HostName = "localhost" };
using var connection = factory.CreateConnection();
using var channel = connection.CreateModel();

// Объявляем очередь, чтобы она была. Без этого — пиздец, сообщение в никуда улетит.
channel.QueueDeclare(queue: "orders", durable: true, exclusive: false, autoDelete: false);

// Допустим, у нас заказ. Делаем из него JSON-месиво.
var order = new { OrderId = 123, Product = "Book", Quantity = 2 };
var jsonBody = JsonSerializer.SerializeToUtf8Bytes(order); // Вот он, наш массив байтов!

// А теперь самое важное — публикуем эту бинарную кашу.
var properties = channel.CreateBasicProperties();
properties.Persistent = true; // Говорим: "Храни это, блядь, на диске, а не только в оперативке!"
channel.BasicPublish(exchange: "", routingKey: "orders", basicProperties: properties, body: jsonBody);

Несколько важных пиздюлей, которые надо запомнить:

  • Сообщение — это не только тело (body). Есть ещё свойства (properties), где можно указать метаданные: тип контента, айдишник, время отправки. Это как конверт для твоего письма.
  • Если хочешь быть культурным, в свойствах указывай ContentType. Например, application/json. Тогда получатель хотя бы поймёт, с чем имеет дело, а не будет гадать, как эту бинарную хуйню расшифровать.
  • Очереди бывают стойкими (durable) и не очень. Если очередь durable, а сообщение помечено как Persistent, то даже если брокер перезагрузится — данные, есть шанс, не потеряются. Но это не 100% гарантия, не обольщайся.