сообщени не записалось в топик?
можно сделать идемпотентного продюсера и накрутить ретраев
Но если пришла ошибка, то значит сообщение не записалось в топик? Может ли быть такое, что оно запишется, а сетка между кластером и программой упадет?
может) для этого и нужно ретраить с идемпотентным продюсером во избежании дублей))
лучше считать что в любом случае будут дубли, чем полагаться на их отсутствие
Сделайте продесер транзакционным. В кафку он писать будет, но при падении записи откатятся.
Ни идемпотентный продюсер, ни транзакционный дают исключительно at-least-once, для исключения дублей необходима идемпотентность на уровне консьюмера.
Транзакция здесь никак не поможет, у нас и так есть ack, транзакция нужна для записи в несколько партиций и гарантий, что они все будут записаны(или ролбэк).
Что произойдёт с записанными сообщениями, если в момент получения ака у нетранзакционного продюсера выключат свет? А если у транзакционного?
В случае одного сообщения - это идентичные ситуаци(если, конечно, ack и in-sync настроены нормально).
Зачем тогда придумали readcommited? Если аков всегда должно хватать.
Потому что транзакционность необходима для продьюсинга сообщений во множество партиций и получения гарантии, что они все будут записаны(или ролбэк). Но это ничего не дает в случае одного сообщения, так как у нас и так есть механизм ack и так же это не дает exactly-once(так как он теоритически невозможен). P.S. Transactional api в кафке - это самый сложный api, который я видел, и я бы лишний раз подумал, прежде чем его приносить(хотя со своей задачей он, конечно, справляется).
Не совсем так. Транзакционный продюсер позволяет также синкать отправку сообщений и коммит оффсета. Что позволяет организовать read process write с exactly once семантикой.
Это с большой натяжкой можно назвать exactly-once, но да, если мы говорим про reed-process-write(без учета внешних систем), то да, оно имеет подобные свойства, с другой стороны, изначальное сообщение исключительно про продюсера.
Обсуждают сегодня