Надёжный процессинг триллионов сообщений Kafka в день
Крутая статья о том, с какими трудностями столкнулись инженеры Walmart при работе с Kafka на своей нагрузке. Особенно интересны условия: 25K+ консюмеров, специфичные юз-кейсы с SLA 99.99, куча приложений на разных языках программирования.
⭐️ Интересные идеи
➡️ Walmart сильно страдал из-за ребалансировки консюмеров. Любое изменение конфигурации подов в consumer group могло вызвать ребалансировку. Это решение даёт системе высокую устойчивость, но негативно влияет на latency, из-за чего многие системы не могли соответствовать своим SLA на обработку.
➡️ Ещё одной проблемой стала блокировка консюмера (партиции) в случае, если в него попадает сообщение, которое никогда не будет обработано (например, из-за бага). Такое сообщение никогда не пойдёт дальше и в результате забьёт канал, пока инженеры не выкатят фикс.
➡️ На большой нагрузке Kafka начинает стоить адски дорого. Единственный способ масштабирования — добавлять больше партиций, но есть мягкое ограничение в 4000 партиций на брокер (в статье есть ссылка на другую статью, пока не читал).
➡️ Решение они придумали тоже довольно специфичное: внедрили Messaging Proxy Service (MPS), который выступил в роли прослойки между Kafka и реальными потребителями. Его задача — остановить постоянный процесс ребалансировки консюмеров и обеспечить обработку ошибок.
➡️ MPS разделяет чтение из Kafka и отправку сообщений потребителям. Легковесный читатель тащит данные из Kafka и складывает в свою очередь, писатель читает из этой очереди и рассылает сообщения потребителям. Параллельно отдельный поток коммитит оффсеты.
➡️ Писатель использует экспоненциальный retry и после нескольких неудачных попыток отправляет сообщение в специально созданный топик Dead Letter Queue (DLQ).
➡️ Решение реализовано на Kafka Connect, поэтому работает достаточно надёжно и масштабируемо. К тому же оно stateless, поэтому легко масштабируется.
Короче, ребята немножко переизобрели свою Kafka. Но решение сработало :)
Приятного чтения!
#highload@tech_fit
➖➖➖➖➖➖➖➖➖➖➖
// Понравился пост? Ставь 💛
// И обязательно подпишись на канал, чтобы не пропустить новые статьи
Post #16
373