Прямой ответ
Message queue — механизм асинхронного обмена сообщениями между сервисами (queue — «очередь сообщений» — queue — incident — «асинхронная обработка» — queue), зачем: развязка сервисов (queue — «сервисы не зависят друг от друга» — queue — incident — «асинхронно» — queue — mikroservisy — «развязка» — queue); паттерны (queue — «паттерны обмена» — queue): (1) Point-to-Point (queue — «один производитель, один потребитель» — queue — incident — «один к одному» — queue — mikroservisy — «очередь задач» — queue — «задача обрабатывается одним потребителем» — queue); (2) Publish-Subscribe (Pub-Sub) (queue — «один производитель, много потребителей» — queue — incident — «один ко многим» — queue — mikroservisy — «события» — queue — «сообщение получают все подписчики» — queue); (3) Request-Reply (queue — «запрос-ответ через очередь» — queue — incident — «асинхронный запрос-ответ» — queue — mikroservisy — «RPC через очередь» — queue — «запрос → обработка → ответ» — queue); (4) Competing Consumers (queue — «много потребителей на одну очередь» — queue — incident — «распределение нагрузки» — queue — mikroservisy — «конкурирующие потребители» — queue — «задачи распределяются между потребителями» — queue); инструменты (queue): (1) RabbitMQ (queue — «брокер сообщений» — queue — incident — «гибкая маршрутизация» — queue — mikroservisy — «AMQP» — queue — RabbitMQ — «популярный» — queue); (2) Kafka (queue — «платформа потоковой обработки» — queue — incident — «высокая пропускная способность» — queue — mikroservisy — «логи/события» — queue — Kafka — «LinkedIn» — queue); (3) Redis Streams (queue — «потоки в Redis» — queue — incident — «простая очередь» — queue — mikroservisy — «Redis» — queue — Redis — «лёгкий» — queue); преимущества (queue): (1) Развязка (queue — «сервисы не зависят» — queue — incident — «асинхронно» — queue — mikroservisy — «развязка» — queue); (2) Масштабируемость (queue — «много потребителей» — queue — incident — «горизонтальное масштабирование» — queue — mikroservisy — «нагрузка распределяется» — queue); (3) Надежность (queue — «сообщения сохраняются» — queue — incident — «не теряются» — queue — mikroservisy — «надежность» — queue); (4) Асинхронность (queue — «не блокирует» — queue — incident — «асинхронно» — queue — mikroservisy — «не ждать ответа» — queue); когда использовать (queue): асинхронная обработка (queue — «не нужно ждать» — queue — incident — «асинхронно» — queue — mikroservisy), развязка сервисов (queue — «сервисы не зависят» — queue — incident — «развязка» — queue — mikroservisy), обработка пиков (queue — «пиковая нагрузка» — queue — incident — «очередь буферизует» — queue — mikroservisy); антипаттерны: синхронная обработка через очередь (queue — «ждать ответа через очередь» — queue — incident — «блокирует» — queue — mikroservisy — «синхронно — лучше HTTP» — queue), игнорирование надежности (queue — «сообщения теряются» — queue — incident — «надежность важна» — queue — «подтверждения обязательны» — queue).
Практика: обмен сообщениями с RabbitMQ
Установка RabbitMQ (queue — kubectl apply -f rabbitmq-statefulset.yaml (queue — «RabbitMQ в Kubernetes» — queue — mikroservisy — «установка» — queue — RabbitMQ); Point-to-Point (queue — channel.basic_publish(exchange='', routing_key='task_queue', body=message) channel.basic_consume(queue='task_queue', on_message_callback=callback) (queue — «один производитель, один потребитель» — queue — mikroservisy — «очередь задач» — queue — incident); Pub-Sub (queue — channel.exchange_declare(exchange='logs', exchange_type='fanout') channel.basic_publish(exchange='logs', routing_key='', body=message) channel.queue_bind(queue=queue_name, exchange='logs') (queue — «один ко многим» — queue — mikroservisy — «события» — queue — incident); Kafka (queue — producer.send('my-topic', value=message) consumer.subscribe(['my-topic']) for message in consumer: process(message) (queue — «Kafka producer/consumer» — queue — mikroservisy — «Kafka» — queue — Kafka); Redis Streams (queue — redis.xadd('mystream', {'message': 'data'}) redis.xreadgroup('mygroup', 'consumer1', {'mystream': '>'}) (queue — «Redis Streams» — queue — mikroservisy — «Redis» — queue — Redis).
Практический сценарий: асинхронная обработка задач
Контекст: веб-приложение (mikroservisy — долгие задачи (incident — queue), боль: синхронная обработка (queue — «пользователь ждёт» — queue — incident — «блокирует» — queue — mikroservisy); решение — message queue: (1) RabbitMQ (queue — установка (queue — kubectl apply -f rabbitmq-statefulset.yaml (queue — mikroservisy — «RabbitMQ» — queue — RabbitMQ); (2) Point-to-Point (queue — очередь задач (queue — channel.basic_publish(exchange='', routing_key='task_queue', body=message) (queue — mikroservisy — «задача в очередь» — queue — incident); (3) потребитель (queue — channel.basic_consume(queue='task_queue', on_message_callback=callback) (queue — «потребитель обрабатывает» — queue — mikroservisy — «асинхронно» — queue — incident); (4) асинхронность (queue — пользователь не ждёт (queue — «задача в очереди» — queue — mikroservisy — «не блокирует» — queue — incident); (5) масштабирование (queue — много потребителей (queue — «конкурирующие потребители» — queue — mikroservisy — «нагрузка распределяется» — queue — incident); результат: асинхронная обработка (queue — «задачи в очереди» — queue — incident — «пользователь не ждёт» — queue — mikroservisy — «развязка» — queue — «масштабируется» — queue); вывод: message queue решили задачу (асинхронность — queue — ADR — «синхронно через очередь» — антипаттерн — mikroservisy — синхронно — лучше HTTP — queue — техдолг).
FAQ
Что такое message queue и какие паттерны обмена существуют? Message queue (queue — механизм асинхронного обмена (queue — «очередь сообщений» — queue — incident — «асинхронно» — queue — mikroservisy); паттерны (queue): Point-to-Point (queue — «один к одному» — queue — incident — «очередь задач» — queue — mikroservisy), Pub-Sub (queue — «один ко многим» — queue — incident — «события» — queue — mikroservisy), Request-Reply (queue — «запрос-ответ» — queue — incident — «RPC» — queue — mikroservisy), Competing Consumers (queue — «много потребителей» — queue — incident — «распределение нагрузки» — queue — mikroservisy); «очередь без паттерна» — антипаттерн (нужен паттерн — mikroservisy — выбор по задаче — queue — ADR — техдолг).
Какие инструменты message queue существуют и чем они отличаются? RabbitMQ (queue — «брокер сообщений» — queue — incident — «гибкая маршрутизация» — queue — mikroservisy — RabbitMQ — «популярный» — queue); Kafka (queue — «платформа потоковой обработки» — queue — incident — «высокая пропускная способность» — queue — mikroservisy — Kafka — «LinkedIn» — queue); Redis Streams (queue — «потоки в Redis» — queue — incident — «простая очередь» — queue — mikroservisy — Redis — «лёгкий» — queue); отличие: RabbitMQ — гибкая маршрутизация (queue — RabbitMQ), Kafka — высокая пропускная способность (queue — Kafka), Redis — простая (queue — Redis — «выбор по задаче» — queue — incident — ADR — техдолг).
Как настроить message queue с RabbitMQ?
Настройка (queue — RabbitMQ (queue — kubectl apply -f rabbitmq-statefulset.yaml (queue — mikroservisy — «установка» — queue — RabbitMQ); паттерн (queue — Point-to-Point (queue — channel.basic_publish(exchange='', routing_key='task_queue', body=message) (queue — mikroservisy — «очередь задач» — queue — incident); потребитель (queue — channel.basic_consume(queue='task_queue', on_message_callback=callback) (queue — «потребитель» — queue — mikroservisy — «обработка» — queue — incident); асинхронность (queue — не блокирует (queue — «асинхронно» — queue — mikroservisy — «не ждать» — queue — incident); «синхронно через очередь» — антипаттерн (блокирует — mikroservisy — синхронно — лучше HTTP — queue — ADR — техдолг).
Как обеспечить надежность доставки сообщений и почему это важно? Надежность (queue — сообщения не теряются (queue — «сообщения сохраняются» — queue — incident — «надежность» — queue — mikroservisy — «не теряются» — queue); как: подтверждения (queue — ack/nack (queue — «потребитель подтверждает» — queue — incident — «подтверждения» — queue — mikroservisy — «ack» — queue), персистентность (queue — сообщения сохраняются (queue — «durable=true» — queue — incident — «персистентность» — queue — mikroservisy — «не теряются» — queue), повторные попытки (queue — при ошибках (queue — «retry» — queue — incident — «повторные попытки» — queue — mikroservisy — «retry» — queue); почему важно: без надежности — сообщения теряются (queue — «сообщения теряются» — queue — incident — «потеря данных» — queue — mikroservisy — «надежность обязательна» — queue); «игнорирование надежности» — антипаттерн (сообщения теряются — mikroservisy — надежность обязательна — queue — ADR — техдолг).
Источники: RabbitMQ docs, Kafka docs, Redis Streams docs — ссылки в шапке.