Кафка 1.1 Многократное отставание групп потребителей - PullRequest
0 голосов
/ 08 октября 2018

Наш брокер получает большое количество сообщений (около 15-30 МБ / с), и мы хотели бы принять эти сообщения в режиме реального времени и выполнить некоторую обработку.Каждое сообщение занимает несколько сотен килобайт.

Наши конвейеры обработки используют пулы потоков, поэтому мы хотели бы, чтобы записи, загружаемые из одного опроса, содержали большой пакет сообщений, так что наши пулы потоков не должнычасто занимайтесь обработкой небольших партий и рискуйте исчерпать потоки.В настоящее время мы контролируем это, изменяя конфигурации fetch.min.bytes, receive.buffer.bytes и max.partition.fetch.bytes нашего Kafka Consumer.

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

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

Каков наилучший способ настройки потребителей, напримерчто, когда они работают в разных группах одновременно, мы можем максимально уменьшить лаги?

1 Ответ

0 голосов
/ 11 октября 2018

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

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

Одна последняя рекомендация.Не выполняйте обработку / проверку данных в том же потоке, который потребляет потребитель kafka.Иногда люди делают дорогую обработку в том же потоке, и, не осознавая этого, замедляют потребление.Этот потребительский поток должен просто получить сообщения от Kafka, в идеале даже не десериализовать их, просто захватить байты (или String, или любой другой формат вашего сериализованного формата) и выгрузить его в потокобезопасную очередь, где его можно десериализовать и обработать-нить.Это гарантирует, что поток-потребитель сможет опрашивать как можно быстрее, ограниченный только доступным процессором.

Наконец, здесь есть множество отличных рекомендаций и советов по официальному Javadoc для KafkaConsumer: https://kafka.apache.org/20/javadoc/org/apache/kafka/clients/consumer/KafkaConsumer.html

...