Как управлять объектами транзакционного производителя Kafka в приложениях, ориентированных на запросы - PullRequest
1 голос
/ 01 апреля 2020

Какова лучшая практика для управления объектами-производителями Kafka в приложениях, ориентированных на запросы (например, на серверах http или RP C), при настройке в качестве производителей транзакций? В частности, как совместно использовать объекты-производители между обслуживающими потоками и как определить значение конфигурации transactional.id для этих объектов?

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

Объединение транзакционных производителей с приложениями, ориентированными на запросы, представляется более сложным, поскольку срок службы цикл обслуживания потоков обычно динамически контролируется пулом потоков. Я могу придумать несколько вариантов, все с недостатками:

  1. Совместное использование одного объекта, защищенного от параллелизма каким-либо мьютексом. Конфликт под нагрузкой, вероятно, будет серьезной проблемой.
  2. Создание объекта-производителя для каждого входящего запроса. Объекты KafkaProducer инициализируются медленно, поскольку они поддерживают сетевые соединения, потоки и другие тяжелые объекты; платить эту стоимость за каждый запрос кажется нецелесообразным.
  3. Поддерживать пул объектов-производителей и арендовать один для каждого запроса. Основным недостатком, который я вижу, является количество необходимого оборудования. Также неясно, как настроить transactional.id для этих объектов, так как их жизненный цикл не отображается чисто на идентификатор осколка в многораздельном приложении с состоянием , как в документации . 1018 *

Есть ли другие варианты? Есть ли оптимальный подход?

...