Когда закрывать производителя или потребителя

В последнее время у нас возникают некоторые проблемы с производительностью наших потребителей и производителей Kafka. Мы используем API Kafka Java в scala. Что считается хорошей практикой при открытии и закрытии объектов потребителей и производителей? Я считаю, что это довольно открытый вопрос, и правильный ответ всегда depends, но я пытаюсь рассуждать по этому поводу.

Могут ли потребители иметь длительные связи и оставить открытыми?

Следует ли закрывать продюсеров, когда мы заканчиваем выпускать сообщения?


person Achilleus    schedule 15.11.2018    source источник
comment
Если вы на самом деле больше не используете объект Closable, да, это хорошая практика JVM, чтобы закрыть эти ресурсы ... Это также должно быть переведено непосредственно в Kafka API   -  person OneCricketeer    schedule 16.11.2018
comment
Проблемы с производительностью могут существовать на уровне брокера или сети, и в клиентах есть множество других параметров буферизации, которые просто говорят, что у вас есть проблемы с производительностью, довольно расплывчато.   -  person OneCricketeer    schedule 16.11.2018
comment
Я согласен с тем, что проблемы с производительностью могут существовать на уровне брокера или сети, но у нас возникают проблемы, когда мы очень часто открываем и закрываем объекты потребителей и производителей. Так что я предполагаю, что это могло быть причиной. Поэтому разместил этот вопрос, чтобы получить информацию от профессионалов, которые занимаются такими проблемами.   -  person Achilleus    schedule 16.11.2018
comment
Возможно, вам захочется часто уточнять, а еще лучше на примере кода   -  person OneCricketeer    schedule 16.11.2018


Ответы (1)


Могут ли потребители иметь длительные связи и оставить открытыми?

В общем да.

Подробно: в зависимости от конфигурации вашего потребителя.

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

Если ваши потребители используют автоматическую фиксацию смещений, они все равно будут совершать фиксацию каждые N мс (AFAIK 60k), возможно, тратя ресурсы.

В противном случае они могут остаться - но зачем тратить ресурсы?

Следует ли закрывать продюсеров, когда мы заканчиваем выпускать сообщения?

В общем да.

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

person Adam Kotwasinski    schedule 16.11.2018
comment
мой производитель должен отправлять сообщение каждый раз, когда есть заказ от клиента, если я не буду закрывать и заново создавать производителя каждый раз, будут ли какие-то плохие вещи, такие как утечки памяти и проблемы? - person user1955934; 04.12.2019
comment
У меня есть эта дилемма: неэффективно, если я открываю и закрываю каждый раз, когда нужно отправить сообщение, но я ненавижу видеть утечки памяти и предупреждения о том, что не закрываются объекты, которые реализуют автоматическое закрытие ... пожалуйста, поясните - person user1955934; 26.01.2020
comment
предупреждения о том, что автоматическое закрытие не закрывается, подразумевают, что код, выполняющий закрытие, не может быть найден. это плохо, независимо от частоты закрывания / открывания, и именно оно вызывает утечки. если вы все еще используете его (и еще не готовы закрыть), вы не протекаете. если вы предполагаете, что он будет закрыт, когда ваше приложение умрет, вы можете ошибаться. вот почему отображается предупреждение: вы должны всегда закрывать, даже если это происходит во время завершения работы приложения. используйте try-with-resources и (образно) никогда больше не беспокойтесь о закрытии! - person Derek White; 22.04.2021