Обновить

Комментарии 3

Привет! Спасибо за цикл статей!

Но совет, что надо каждый раз использовать рандомный transaction.id ( spring.kafka.producer.properties.transactional.id=some-service-${random.value}-) - имеет определенный набор проблем:

  1. Если транзакция не завершилась, и сервис упал, то метаданные транзакции останутся висеть в незавершенном состоянии в топике __transaction_state. Если таких транзакций будет много - может в итоге выстрелить и по производительность, и по размеру файла-топика на диске;

  2. При перезапуске сервиса, у него будет новый transaction.id, и старые незавершенные транзакции останутся навсегда незавершенными. Если бы стартанули с предыдущим transaction.id - они бы завершились;

  3. Если у консумера уровень изоляции установлен на read_committed, то он может подвиснуть на таких незавершенных транзакциях.

Это из того, что вспомнил.

Поэтому для каждой инстанции сервиса корректнее использовать уникальный, но жестко заданный transaction.id

Спасибо за комментарий!

На самом деле да, это правда.

При использовании StatefulSet в Kubernetes (или других решений со стабильными идентификаторами) каждый pod имеет постоянное имя, которое сохраняется между перезапусками (например, my-service-0, my-service-1 и т.д.). В таком сценарии можно использовать transactional.id в виде префикса, основанного на имени pod’а (например, ${POD_NAME}), что позволяет избежать как накопления незавершённых транзакций, так и проблем с fencing.

В статье я сфокусировался на базовой настройке Spring Boot и не углублялся в детали deployment'а — всё-таки добавлю это уточнение в статью.

Вам ещё раз спасибо!

Обязательно ли использовать транзакции ? Может что-то проще и надёжнее ?

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации