Задержка потребителя Kafka (Kafka consumer lag)

Apache Kafka - это платформа с открытым исходным кодом для распределенной потоковой передачи данных, которая позволяет реализовать приложения, основанные на обработке событий в реальном времени и долговременном хранении событий. Архитектура приложений на основе обработки событий помогает архитекторам разделить компоненты приложения и масштабировать их независимо друг от друга. Хотя разделение помогает в масштабировании и отказоустойчивости, оно также делает архитектуру сложной для отладки.

Оптимизация производительности распределенных приложений требует значительных инженерных усилий, и Kafka не является исключением. Задержка потребителя Kafka - которая измеряет задержку между производителем и потребителем Kafka - является ключевым показателем производительности Kafka. В этой статье мы подробно рассмотрим задержку потребителя Kafka, включая причины, мониторинг и стратегии ее устранения.

Краткое описание основных концепций отставания потребителей Kafka

Задержка потребителя Kafka - это ключевой показатель производительности популярной платформы потоковой передачи данных Kafka. При прочих равных условиях меньшее отставание потребителя означает лучшую производительность Kafka. В таблице ниже приведены общие причины отставания потребителей Kafka. Мы рассмотрим эти причины более подробно далее в этой статье.

Концепция отставания потребителей Kafka Описание
Что такое отставание потребителя Kafka? Отставание потребителя Kafka - это разница между последним смещением, сохраненным брокером, и последним зафиксированным смещением для данного раздела.
Причины отставания потребителей Kafka Четыре распространенные причины отставания потребителей: скачки входящего трафика, перекос данных в разделах, медленная обработка заданий и ошибки в коде и компонентах конвейера.
Мониторинг отставания потребителей Kafka Команды могут отслеживать отставание потребителей Kafka с помощью сценария группы потребителей, Burrow (компаньона для мониторинга Kafka) или общих инструментов мониторинга и экспортеров.
Стратегии устранения отставания потребителей Kafka Лучшая стратегия для устранения задержки в работе потребителей Kafka зависит от причины. Оптимизация логики обработки, изменение количества разделов, ограничение скорости и настройка конфигурации - вот четыре распространенные стратегии устранения задержек в работе потребителей.

Что такое отставание потребителя Kafka (Kafka consumer lag)?

Задержка потребителя Kafka - это разница между последним сообщением, произведенным производителем, и смещением, зафиксированным группой потребителей. Она представляет собой задержку обработки потребителем.

Понимание рабочей модели Kafka

Kafka отлично подходит в качестве основы для создания разрозненных приложений, которые полагаются на обработку событий. Это происходит благодаря концепции производителей и потребителей. Производители - это приложения, которые отправляют события брокеру Kafka. Брокер долго хранит сообщения и позволяет клиентским приложениям логически обрабатывать события.

Данные логически разделяются внутри брокера с помощью тем Kafka. Темы - это категории, которые логически разделяют данные, чтобы к ним можно было однозначно обращаться. Имена тем уникальны для всего кластера Kafka. Темы дополнительно делятся на разделы для облегчения масштабирования. В разделах хранится подмножество данных, относящихся к теме.

Когда производитель записывает сообщение в тему, брокер Kafka записывает его в раздел, принадлежащий теме. Kafka отслеживает прогресс записи данных в каждый раздел, отслеживая последнюю позицию каждой записи данных. Эта позиция называется long-end offset. Это специфическое для раздела смещение.

Потребители содержат логику приложения о том, как обрабатывать данные, записанные в разделы. Чтобы облегчить масштабирование внутри потребителей, Kafka использует концепцию групп потребителей. Группа потребителей - это набор потребителей, сотрудничающих для потребления сообщений из одной и той же темы. Kafka гарантирует, что потребители, принадлежащие к одной группе потребителей, получают сообщения из разных разделов.

Когда к группе присоединяется новый потребитель, Kafka перераспределяет членов этой группы потребителей, чтобы гарантировать, что новый потребитель получит справедливую долю назначенных разделов. Каждая операция ребалансировки приводит к созданию новых конфигураций групп. Под конфигурацией группы здесь понимается назначение потребителей на различные разделы.

Обработка сообщений Kafka может быть масштабирована путем добавления большего количества потребителей в группу потребителей. Чтобы обеспечить устойчивость, потребители Kafka отслеживают последнюю позицию в разделе, с которой они были прочитаны. Это помогает потребителям начать работу с той позиции, на которой они остановились, в случае возникновения неблагоприятных ситуаций, например сбоев. Это называется смещением потребителя. Смещение потребителя хранится в отдельной теме Kafka.

Логический обзор лага потребителей Kafka.

Разница между последним смещением, сохраненным брокером, и последним зафиксированным смещением для этого раздела называется отставанием потребителя. Она определяет разрыв между потребителями и производителями. Задержка потребителя предоставляет информацию о производительности системы обработки в реальном времени. Положительное значение задержки потребителя часто указывает на внезапный всплеск трафика, перекос в структуре данных, проблему масштабирования или даже проблему на уровне кода.

Причины отставания потребителей Kafka

Задержки в работе потребителей могут возникать из-за нескольких внутренних и внешних факторов. Даже в здоровом кластере Kafka время от времени будет наблюдаться некоторое отставание потребителей. Если отставание уменьшается в разумные сроки, беспокоиться не о чем. Задержка становится тревожной, когда она не уменьшается или проявляет признаки постепенного увеличения.

Всплеск входящего трафика

Зачастую интенсивность движения меняется в широких пределах в зависимости от внешних факторов. Например, представьте себе систему датчиков IoT, которая отправляет оповещения на основе определенных переменных внешней среды. Изменение внешних условий для ряда потребителей может вызвать резкий всплеск трафика. Потребителям будет сложно справиться с внезапными всплесками, и задержка может стать угрожающе высокой. Ручное масштабирование помогает устранить отставание потребителей Kafka в таких случаях.

Перекос данных в партициях

Партиции привносят в Kafka параллелизм. Потребители в группе потребителей сопоставляются с определенными партициями. Идея заключается в том, что каждый потребитель имеет достаточно ресурсов для обработки сообщений, поступающих в эту партицию. Однако данные часто распределяются по партициям неравномерно. Kafka предоставляет несколько стратегий выбора партиций при записи данных. Самая простая - это робин-адрес, при котором данные распределяются равномерно. Но робингуд не подходит для приложений, которые поддерживают состояние или порядок. В таких случаях используется специфический для приложения ключ партиции.

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

Медленная обработка заданий

Потребители обрабатывают сообщения, полученные из партиций, в соответствии с логикой приложения. Логика приложения может содержать такие задачи, как сложные преобразования данных, доступ к внешним микросервисам, запись в базу данных и т. д. Такие механизмы обработки занимают много времени и могут застопориться под воздействием внешних факторов. Представьте себе потребителя, который обращается к внешнему микросервису для выполнения своей задачи. Если время отклика внешнего сервиса увеличивается из-за других факторов, Kafka будет испытывать отставание потребителя.

Ошибка в коде и компонентах конвейера

Потребители Kafka часто содержат сложную прикладную логику. Как и в любом коде, в этой логике могут быть ошибки. Например, модуль обработки может зайти в бесконечный цикл или использовать неэффективные алгоритмы. Аналогично, неправильная обработка ошибочного или неожиданного входного сообщения может замедлить работу конкретного потребителя. Такие случаи приводят к отставанию потребителя.

Мониторинг отставания потребителей Kafka

Мониторинг отставания потребителей Kafka помогает разработчикам принять корректирующие меры для стабилизации кластера и оптимизации производительности. Как правило, отставание всегда присутствует, так как значения пакетной обработки и отставания варьируются от партиции к партиции. Небольшое отставание не является серьезной проблемой, если оно стабильно. Но отставание с тенденцией к увеличению указывает на проблему. В этом разделе подробно описано, как команды могут отслеживать отставание потребителей для выявления потенциальных проблем.

Вы можете использовать приведенную ниже команду, чтобы получить сведения о потребительской группе с помощью сценария потребительской группы.

Выполнение этого действия на живом сервере приведет к следующему результату.

В приведенном выше примере вы можете видеть, что значения запаздывания варьируются в зависимости от партиции.

Мониторинг отставания потребителей Kafka с помощью Burrow

Burrow - это компаньон с открытым исходным кодом для мониторинга Kafka. Он может отслеживать фиксированные смещения потребителей и предоставлять отчеты без необходимости указания разработчиками пороговых значений.

Burrow рассчитывает отставание на основе скользящего окна. Он написан на Go и требует отдельной установки или контейнера, внешнего по отношению к кластеру Kafka.

Burrow открывает конечную точку API, которая предоставляет информацию обо всех группах потребителей, за которыми он следит. Он также поддерживает отправку оповещений по электронной почте, а настраиваемый HTTP-клиент Burrow может интегрировать свои оповещения с другими сервисами.

Мониторинг отставания потребителей Kafka с помощью экспортеров и общих инструментов мониторинга

Отставание потребителей Kafka - это такая же системная метрика, как и любая другая, и общие инструменты мониторинга, такие как Grafana или Prometheus, могут ее отслеживать. Для этого необходим рабочий экспортируемый модуль, который собиaрает метрики из Kafka и отправляет их в бэкенд инструмента мониторинга. Существует множество экспортеров Kafka с открытым исходным кодом, которые выполняют эту работу.

Популярным модулем-экспортером Kafka является Kafka Lag Exporter. Он может работать где угодно, включая кластеры Kubernetes или Java-приложение. Kafka Lag Exporter может оценить значение времени задержки, используя информацию о задержке потребителя. Он написан на языке Scala.

Еще один популярный экспортер - Kafka Exporter. Он написан на Go и может экспортировать информацию о задержках потребителей в Prometheus или Grafana.

Стратегии устранения отставания потребителей Kafka

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

Оптимизация логики обработки потребителя

Самое простое решение проблемы отставания потребителей - определить узкое место в логике обработки и сделать ее более эффективной. Конечно, это легче сказать, чем сделать. Возможный подход - выявить в коде любую синхронную блокирующую операцию и сделать ее асинхронной, если это позволяет сценарий использования.

Изменение количества партиций

Назначение партиций - важнейший фактор, влияющий на задержку потребителей. Ситуация, когда задержка только в одной партиции выше, чем в других, указывает на проблему в распределении данных. Эту проблему можно решить с помощью пользовательского ключа партиции или добавления дополнительных партиций. Конфигурация партиций и потребителей зависит от конкретного случая использования.

Использование специфической для приложения очереди для ограничения скорости

Иногда логика обработки занимает много времени и не может быть оптимизирована. В таких случаях разработчикам следует рассмотреть возможность использования специфической для приложения очереди, чтобы потребители могли просто добавлять сообщения в очередь приложения. Как только сообщения попадают в очередь, потребитель может подождать, пока они будут обработаны, прежде чем принимать новые сообщения из Kafka. Вторая очередь поможет разделить сообщения из одной партиции между несколькими экземплярами обработки.

Настройка параметров конфигурации потребителя

Разработчики могут использовать различные параметры потребителей, чтобы настроить частоту получения сообщений из партиций или количество данных, получаемых за одну операцию. Параметр 'fetch.max.wait.ms' управляет временем ожидания потребителя перед приемом новых данных из партиции. Параметры 'fetch.max.bytes' и 'fetch.min.bytes' управляют максимальным и минимальным объемом данных, получаемых потребителями за одну операцию.

Еще один критический элемент уменьшения задержки потребителей - максимально возможная минимизация операций ребалансировки. Каждая операция ребалансировки блокирует потребителей на некоторое время и может увеличить задержку потребителей. Параметры 'max.poll.interval.ms', 'session.timeout.ms' и 'heartbeat.interval.ms' управляют ситуациями, когда брокер решает, что потребитель неактивен слишком долго, и запускает операцию ребалансировки. Настройка этих значений может помочь сократить количество операций ребалансировки.

Заключение

Потребительское отставание (Consumer lag) - это ключевая метрика, которая дает информацию о том, насколько потребители должны наверстать упущенное, чтобы добиться работы в режиме, близком к реальному времени. Хотя небольшое отставание потребителей неизбежно, растущее отставание потребителей указывает на проблемы в распределении данных, коде и схемах трафика.

Понравилась статья? Поделиться с друзьями:
Добавить комментарий