2014-01-27 8 views
6

В режиме реального времени Java-приложение в реальном времени я отправляю сообщения на адрес apache kafka. В настоящее время я отправляю одну тему, но в будущем мне может потребоваться отправить сообщения по нескольким темам.Сколько продюсеров создавать в кафке?

В этом случае я не уверен, что погода создаст производителя для каждой темы или я должен использовать одного производителя для всех моих тем?

Вот мой код:

props = new Properties(); 
props.put("zk.connect", <zk-ip1>:<2181>,<zk-ip3>:<2181>,<zk-ip3>:<2181>); 
props.put("zk.connectiontimeout.ms", "1000000"); 
props.put("producer.type", "async"); 

Producer<String, Message> producer = new kafka.javaapi.producer.Producer<String, Message>(new ProducerConfig(props)); 

ProducerData<String, Message> producerData1 = new ProducerData<String, Message>("someTopic1", messageTosend); 
ProducerData<String, Message> producerData2 = new ProducerData<String, Message>("someTopic2", messageTosend); 

producer.send(producerData1); 
producer.send(producerData2); 

Как вы можете видеть, когда производитель был создан, я могу использовать его для передачи данных на различные темы. Интересно, что такое лучшая практика? Если мое приложение отправляет несколько тем (каждая тема получает разные данные), могу ли я использовать одного производителя или мне нужно создать несколько продюсеров? Когда (вообще говоря) я должен использовать больше одного производителя?

ответ

6

В целом, один производитель для всех тем будет более эффективен в сети.

Если клиент kafka видит более одного раздела + раздела на одном и том же узле Kafka, он может отправлять сообщения для раздела + раздела в одном сообщении. Kafka оптимизируется для пакетов сообщений, поэтому это эффективно.

Кроме того, вашим веб-серверам необходимо поддерживать только одно соединение tcp с каждым узлом Kafka, вместо одного соединения на одного производителя на узел.

Для получения дополнительной информации о дизайне Кафки: https://kafka.apache.org/documentation.html#design

Как вы упоминаете в комментариях, блокировки может стать ограничивающим фактором, YMMV.

1

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

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

0

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

0

От Kafka: The Definitive Guide, в Кафки Производителей главе, автор говорит:

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

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

Смежные вопросы