Когда ваши микросервисы начинают сплетничать, как подростки на пижамной вечеринке, вам нужна система обмена сообщениями, которая не потеряет драматизма. Apache Kafka, RabbitMQ и Apache Pulsar — чемпионы в этой области, каждый со своим стилем борьбы. Давайте разберём их сильные и слабые стороны, а также секретное оружие — с реальным кодом, чтобы доказать, что это не просто теоретические рассуждения.

Основные принципы: что под капотом?

RabbitMQ — это ваш надёжный старомодный почтальон. Построенный на основе протокола AMQP, он обрабатывает сообщения как заказные письма — гарантированная доставка с точностью маршрутного листа. Идеально подходит для:

# Пример производителя RabbitMQ
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
channel.queue_declare(queue='order_queue')
channel.basic_publish(exchange='', routing_key='order_queue', body='Order #42')

Apache Kafka — это городской глашатай на стероидах. Он кричит о событиях в распределённых журналах фиксации:

// Пример фрагмента производителя Kafka
Properties props = new Properties();
props.put("bootstrap.servers", "kafka-broker:9092");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
Producer<String, String> producer = new KafkaProducer<>(props);
producer.send(new ProducerRecord<>("user_events", "user123", "clicked_button"));

Apache Pulsar — это футуристический кибернетический почтальон. Его многоуровневая архитектура отделяет вычисления от хранения с помощью BookKeeper:

graph LR A[Producer] --> B[Pulsar Broker] B --> C[Apache BookKeeper Storage] C --> D[Pulsar Broker] D --> E[Consumer]

Сравнение производительности: сырые цифры

МетрикаRabbitMQKafkaPulsar
Максимальная пропускная способность~30 тыс. сообщений/сек200 МБ+/сек~100 МБ/сек
Задержка (p99.9)Наименьшая при низкой нагрузкеВ 15 раз быстрее RabbitВыше, чем у Kafka
МасштабируемостьТолько вертикальноеГоризонтальные разделыМногопользовательские кластеры
Удержание данныхНа основе очередейУдержание по времениМногоуровневое хранилище

Kafka доминирует в тестах пропускной способности, как на шведском столе, а многоуровневое хранилище Pulsar управляет долгосрочными данными, как цифровой накопитель с организационными навыками.

Истории развёртывания

Когда RabbitMQ сияет

Тот случай, когда нашему платёжному сервису понадобились очереди мёртвых писем для неудачных транзакций:

# Настройка обмена мёртвыми письмами
rabbitmqctl set_policy DLX ".*" '{"dead-letter-exchange":"dlx"}' --apply-to queues

Гибкость Rabbit спасла нас при работе с отравляющими сообщениями — как вышибала, удаляющая нарушителей из клуба.

Доминирование Kafka в области больших данных

Масштабирование данных с датчиков IoT стало тривиальным с Kafka Connect:

bin/connect-standalone.sh config/connect-standalone.properties config/iot-source.properties

Kafka Streams затем преобразовал эти данные, как цифровая сборочная линия.

Победа Pulsar в георепликации

Развёртывание в нескольких регионах потребовало всего одной команды:

pulsar-admin clusters create cluster-b --broker-url pulsar://cluster-b:6650

Внезапно наши офисы в Токио и Нью-Йорке перестали бороться за полосу пропускания.

Блок-схема «Что мне выбрать?»

graph TD A[Нужны очереди?] -->|Да| B(RabbitMQ) A -->|Нет| C[Потоковая передача данных?] C -->|Да| D[Нужен облачный?] D -->|Да| E(Pulsar) D -->|Нет| F(Kafka) C -->|И то и другое| G(Pulsar)

Кошмары отладки: общее заблуждение

Видели ли вы дисбаланс разделов Kafka? Это похоже на то, как если бы в одном кассовом зале в Walmart было 50 человек, а другие пустовали. Исправить можно так:

kafka-topics --alter --topic orders --partitions 6

Накопление очередей RabbitMQ? Это цифровой эквивалент закупоренных артерий. Расчистить можно так:

rabbitmqctl purge_queue order_backlog

Ошибки журнала Pulsar? Как если бы библиотечную книгу поместили в раздел кулинарных книг. Исправить можно так:

pulsar-admin bookkeeper recover

Обеспечение будущего вашего выбора

Хотя Kafka сегодня доминирует в потоковой передаче событий, облачная архитектура Pulsar похожа на Tesla по сравнению с двигателем внутреннего сгорания Kafka. RabbitMQ? Это надёжный велосипед, который всегда доставит вас туда — просто не пытайтесь выиграть Тур де Франс на нём.

Настоящий победитель? Тот, кто соответствует операционной выносливости вашей команды. Потому что ни одна система обмена сообщениями не выживает при контакте с производством без шрамов.