| Тип | Описание | Producer | Consumer |
| Гарантия доставки не более одного раза. Гарантируется, то не будет дублей, но допускаются потери. | Без подтверждения доставки и повторных отправок (гарантирует отсутствие дублей), но сообщение может быть потеряно на фазе отправки (т.к. без подтверждения). Acks = None MessageSendMaxRetries = 0 | Сообщение коммитится сразу (без подтверждения), это гарантирует что не будет дублирования, но сообщение может быть потеряно на фазе получения (падение или timeout потребителя). AutoOffsetReset = AutoOffsetReset.Earliest ENABLE_AUTO_COMMIT = true |
| Гарантия доставки хотя бы один раз. Гарантируется, что не будет потерь, но возможны дубли. | 1) Гарантия подтверждения доставки до брокера. Acks = All EnableIdempotence = false В данном случае отправка может выполнится, но потеряется подтверждение отправки. В таком случае будет повторная отправка, которая приведет к дублированию на отправке.
2) Дополнение. Наличие функции дедубликации в kafka. Позволяет устранить дублирование на отправке. Kafka отслеживает повторную отправку и отбрасывает. EnableIdempotence = true MessageSendMaxRetries <> 0
// влияет на идентификацию экземпляра // producer при переподключении. transactional.id | 1) Использование ручного коммита после завершения обработки (транзакции БД). AutoOffsetReset = AutoOffsetReset.Earliest ENABLE_AUTO_COMMIT = false Возможные проблемы: - Дублирование на отправке.
- Не закомиченное смещение (падение consumer).
- Отвал consumer по timeout (долгая обработка, сообщение передано к другому consumer).
2) TransactionalInbox. |
| Гарантия доставки строго один раз. Гарантия отсутствия потерь и дублей. | Kafka transactions | |