2016-12-27 8 views
2

Я использую Кафка 0,8 и весенне-интеграционного Кафка 1.2.0.RELEASEМедленный производитель при работе Кафки потребителя и производителя от того же виртуальной машины Java

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

В то время как потребление из основной темы отлично работает, выдается вторичная тема после нескольких минут. Проблема начинается с запроса отправки на тайм-аут kafka после 500 мс, который я установил. Окончание с пулом потоков исчерпан.

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

У меня 4 потребителя, работающих по обеим темам, имеющим по 200 разделов.

Я мало нового для kafka, пожалуйста, извините за недостаток знаний. Прокомментируйте любую недостающую информацию, которую я должен предоставить.

+0

Если вы новичок в Apache Kafka, было бы лучше перейти на последнюю версию - 0.10.1. Есть много хороших изменений, а также уровень абстракции весны. –

+0

Я также попробую обновить, но проблема в том, что мне нужна некоторая недостающая конфигурация. – Vaibhav

ответ

0

Наконец-то возникла проблема после проверки всех возможных конфигураций.

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

<dependency> 
<groupId>org.apache.kafka</groupId> 
<artifactId>kafka-clients</artifactId> 
<version>0.9.0.0</version> 

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

Спасибо.

2

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

Основная проблема не в том, что касается Kafka: если вы потребляете один источник и отправляете что данные во второй приемник, который вы часто не можете принять, 2-й приемник всегда будет быстрее первого источника. Всякий раз, когда второй приемник идет медленнее, даже немного, вы, в конце концов, столкнетесь с такой проблемой. Например, скажем, вы можете читать 100 событий в секунду из первичной, но вторичный приемник может потреблять только 99 событий в секунду. Это означает, что каждую секунду вы получаете еще одно событие в памяти, ожидающее отправки в вашу раковину. Если вы не делаете ничего, чтобы замедлить скорость, с которой вы читаете из основного источника, у вас будет нехватка ОЗУ, потоков или какого-либо другого ресурса.

Общее решение - это своего рода дросселирование. Например, вы можете использовать Semaphore, который начинается с 500 разрешений: это означает, что вы никогда не сможете прочитать более 500 предметов из основного источника, который еще не был успешно отправлен в раковину. Прежде чем читать элемент из основного источника, вы уменьшите Semaphore, чтобы, если вы уже «опережаете» вторичный объект на 500 единиц, ваш читатель будет блокировать. Каждый раз, когда вы успешно отправляете элемент в свою вторую тему, вы выпускаете разрешение, позволяющее продолжить чтение.

Я бы предостерег от исправлений, как использование 2-го кластера Kafka или что-то еще, что работает, но на самом деле не затрагивает основную проблему. Например, если теперь работать с другим кластером, это не произойдет, когда этот кластер замедлит работу из-за потери узла, большой перебалансировки и т. Д. Это временно скроет проблему.

+0

Спасибо за ответ. Я согласен, что не должно предполагать, что 2-я раковина всегда будет быстрее первого источника. Пара пунктов, которые следует отметить здесь. - После использования от первичной обработки и выполнения некоторой обработки, я получаю вторичный фильтр после фильтров. В текущем сценарии только 5% сообщений, потребляемых из первичного, производятся на вторичном. Он не работает даже при очень низком уровне трафика. - попытка со вторым кластером успешно работала с более медленными и меньшими машинами. Я даже не чувствовал, что никаких связей с кафкой может быть проблемой. поэтому попытался увеличить свойство num.network.threads без помощи. – Vaibhav

+0

Мне до сих пор не хватает небольшой части конфигурации. Также вторичная тема имеет такое же количество разделов, как и первичный, и тот же ключ используется для разделения. – Vaibhav

+0

Интересно. Да, похоже, это не соответствует моему диагнозу. Боюсь, у меня нет других замечательных идей. Сожалею. –