Почему Kafka не является классической очередью сообщений
Что проверяют
Понимаете ли вы, что Kafka это распределённый лог, а не брокер очередей, и какие привычные по JMS и AMQP возможности из-за этого недоступны. На проекте от этого зависит, придётся ли писать ретраи, приоритеты и разбор сбоев руками.
Как отвечать
Перечислить отличия по механике, а не по маркетингу:
- сообщение не удаляется при чтении. Потребитель двигает свой offset, а брокер держит записи до конца retention или до компактизации по ключу. Отсюда повторное чтение, несколько независимых групп на одном топике и старт с начала;
- нет подтверждения отдельного сообщения. В JMS можно подтвердить или вернуть одно сообщение, в Kafka коммитится позиция. Обработать пятое и пропустить четвёртое означает свою логику поверх;
- параллелизм ограничен партициями. Потребителей в группе больше, чем партиций, держать бессмысленно: лишние простаивают. В классической очереди конкурирующих потребителей добавляют сколько угодно;
- порядок только внутри партиции, а партицию выбирает ключ;
- брокер не маршрутизирует. Нет exchange и routing key, нет приоритетов, отложенной доставки и времени жизни отдельного сообщения. Потребитель сам решает, что читать.
Для Spring это стоит договорить до конца: concurrency у @KafkaListener выше числа партиций не ускорит, застрявший обработчик блокирует всю партицию, а очередь недоставленных сообщений собирается вручную через обработчик ошибок с публикацией в отдельный топик.
Где спотыкаются
Подменяют вопрос про модель вопросом про скорость и отвечают, что Kafka просто быстрее. Спрашивают не об этом, а о том, чего в ней принципиально нет.
Обещают строгий порядок во всём топике. Он есть только внутри партиции, и ломается ещё и повторами отправки, если продюсер не идемпотентный, а в полёте разрешено больше одного запроса.
Записывают классические брокеры в устаревшие и уверяют, что те не масштабируются и работают пакетно. Это неправда: они собираются в кластеры и доставляют сообщения по мере поступления. Разница в модели хранения, а не в возрасте.