Как гарантировать отправку в кафку некоего события?
Есть сервис, который выполняет некоторую полезную работу и после отправляет некоторую статистику в кафку для другого сервиса. Это статистика очень важна и нужно гарантировать ее отправку, даже если сервис упадет.
Есть идея перед началом выполнения полезной работы фиксировать это в бд. А уже после отправки в кафку статистики отмечать запись в бд как `was_sent: true`.
То есть, если во время выполнения полезной работы сервис упадет, то джоба будет собирать с бд записи с `was_sent: false` и отправлять статистику в кафку.
Использование nosql типа редиса не представляется возможным.
Вот думаю как решать проблему.
Нет никакого смысла страховать Кафку. Она совершенно самодостаточна. Есть настройка message delivery semantics. Почитай про нее. Вобщем идея такава что - каждый сам себе в зависимости от бизнес требований выставляет такие параноидальные настройки producer/consumer, чтобы было и быстро и надёжно одновременно.
Вам нужен паттерн Outbox, посмотрите
Смысл в том, что при записи какой-то сущности в базе мы открываем транзакцию и пишем в две таблицы, в основную и в outbox. Транзакция гарантирует сохранение события. Затем паблишим в кафку из аутбокса какой-то джобой