не идемпотентные операции? Например, на каждое сообщение нужно увеличить каунтер в базе. Консюмер может крешнуться после сохранения транзакции в базу и до коммита офсета.
1) Есть подход вместе с каунтером хранить офсет с которого было сделано обновление - так мы узнаем, что обработали конкретное кафка сообщение.
Но, кажется, что в таком случае, будет полным геморроем ситуация если придется переехать в новый топик/кластер кафки и офсеты сбросятся?
2) Другой подход это каждому сообщению давать uuid и проверять обработали ли мы уже такое сообщение, но тогда придется хранить все uuid в кеше/базе (миллионы) и все равно возможны случаи двойного процессинга (сообщение уже обработали, а в базу uuid еще не сохранили). В этом случае, есть ли преимущества перед нативными кафка офсетами?
обычно второй вариант с ограниченным набором ид обработанных сообщений, например за последние сутки. Двойного процессинга быть не может, т.к. у вас в одной транзакции должно быть изменение данных и сохранение факта прочитки сообщения
У меня Кассандра без транзакций :( Плюс, может быть вариант, когда действие - это вызов стороннего API, но тут уж наверное ничего не поделаешь. Можно сделать transactional outbox, но в случае вызова API он как я понимаю все равно не даст exactly once гарантии
ну если нет транзакций, то строгой идемпотентности с каунтерами не будет. Если надо строго - апсерт сообщения/фактам по ид и потом уже строгая аналитика над этим множеством
Обсуждают сегодня