Ответ
Сообщения в RabbitMQ хранятся как бинарные данные (byte[]). Брокер не навязывает конкретный формат сериализации — это ответственность отправителя и потребителя. На практике чаще всего используют:
- JSON (через UTF-8 кодировку) — для простоты и читаемости.
- Protocol Buffers (Protobuf) — для эффективности и строгой схемы данных.
- MessagePack — как компромисс между размером и скоростью.
- 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[]). Сам брокер — тупой как пробка, ему похуй, что ты туда пихаешь. Его дело — принять и передать. А вот что это за данные и как их читать — это уже твои, дружок, проблемы. Ты и отправитель, и получатель должны договориться, на каком языке вы общаетесь.
На практике народ юзает обычно вот это:
- JSON (в кодировке UTF-8) — самый популярный ушлёпок. Все его понимают, читается легко, но жрёт место и не самый быстрый.
- Protocol Buffers (Protobuf) — строгий и эффективный зануда. Маленький, быстрый, но нужно заранее схемы описывать. Любимчик в микросервисах, где перформанс наше всё.
- MessagePack — типа как JSON, но бинарный. Компромиссный уродец: меньше размер, но уже не так просто человеческим глазом прочитать.
- Простой текст или 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% гарантия, не обольщайся.