Ответ
В последнем проекте мы реализовали гарантию exactly-once для критически важных финансовых транзакций, обрабатываемых через Apache Kafka.
Реализация:
- Идемпотентный продюсер: Настройка продюсера с
enable.idempotence=trueгарантирует, что сообщение будет отправлено в партицию ровно один раз, даже при повторных попытках.// Пример настройки на Java Properties props = new Properties(); props.put("bootstrap.servers", "kafka-broker:9092"); props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer"); props.put("enable.idempotence", true); // Ключевая настройка props.put("acks", "all"); props.put("retries", Integer.MAX_VALUE); - Транзакции Kafka: Использовали транзакционное API для атомарной записи consumed-processed-produced в рамках одной транзакции. Это предотвращает дублирование или потерю данных при сбоях в консьюмере.
- Дедупликация на стороне приложения: Для дополнительной надежности в целевую базу данных (PostgreSQL) запись производилась с проверкой уникальности по бизнес-ключу (например,
transaction_id).
Итог: Комбинация идемпотентности Kafka, транзакций и бизнес-дедупликации позволила достичь семантики exactly-once, что было необходимо для корректного учета платежей.