Использование Kafka Producer в разных потоках

У меня есть производитель kafka для моего веб-приложения на основе Java, чтобы отправлять сообщения в Kafka. Согласно документации, я мог видеть, что производитель kafka является потокобезопасным. Означает ли это, что я могу иметь один экземпляр производителя Kafka и использовать его в разных потоках (веб-запросах), каждый из которых будет открывать и закрывать производителя в моем случае. Будет ли это создавать какие-либо проблемы? Или лучше инициировать производителей по запросу?


person Bill Goldberg    schedule 24.03.2016    source источник


Ответы (2)


Да, KafkaProducer является потокобезопасным.
См. Класс KafkaProducer

Клиент Kafka, который публикует записи в кластере Kafka.

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

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

person Shawn Guo    schedule 24.03.2016
comment
Меня беспокоит, обрабатывает ли он описанный ниже сценарий. Один поток открывает производителя, а перед отправкой данных другой поток закрывает его. Будет ли исключение при выполнении отправки первым потоком? - person Bill Goldberg; 24.03.2016
comment
выброшено совсем исключение. обычно мы используем микроконтейнер, такой как контекст Spring, и закрываем потребителя kafka только при уничтожении контекста Spring. - person Shawn Guo; 24.03.2016
comment
Если есть только один экземпляр KafkaProducer, то где и как мы можем вызвать для него close метод? - person ttt; 26.07.2018
comment
Верно ли это и для новых транзакционных API? В документации не указывается, и я вижу поведение, указывающее на то, что это небезопасно. - person Raman; 06.10.2019
comment
@Raman, у меня был такой же вопрос. подумайте о многопоточном случае с транзакциями, следует использовать ThreadLocal Producer с уникальным идентификатором транзакции для каждого производителя - person Ashika Umanga Umagiliya; 10.06.2021
comment
@AshikaUmangaUmagiliya да, я пришел к выводу, что транзакционные API не являются потокобезопасными. Я на самом деле считаю их дизайн плохо выполненным - они предполагают определенный контекст потоковой передачи потребителя, которого можно было бы избежать с помощью дескрипторов транзакций. - person Raman; 10.06.2021

Безусловно, лучший подход (который типичен для большинства коннекторов клиентов с отслеживанием состояния, например клиентов SQL, клиента elasticsearch и т. Д.) - создать экземпляр одного экземпляра при запуске приложения и совместно использовать его во всех потоках. Его следует закрывать только при завершении работы приложения.

person ppearcy    schedule 24.03.2016
comment
Привет, я начинаю с java, и мне интересно, как делать такие вещи, у вас есть какие-нибудь примеры, на которые я мог бы взглянуть? Благодарность - person Simon; 22.01.2021