Для Кафки я видел реализацию хранения указателя на идентификатор для отслеживания того, где вы находитесь в топи c, и использования какого-то распределенного хранилища для отслеживания этого на уровне кластера. Я не проделал много работы там, поэтому я постараюсь предоставить решение, которое мы использовали с SQS для обнаружения дублирования. Вполне вероятно, что у Кафки есть лучшее решение, чем это, которое нужно решить для дублирования, просто хочу добавить туда, чтобы вы могли также посмотреть альтернативные решения.
У меня была такая же проблема при работе с AWS SQS для случаев использования обмена сообщениями «точка-точка», поскольку он обеспечивает гарантированную доставку как минимум один раз, а не один раз и только один раз.
Мы решили использовать Redis с его стратегией распределенной блокировки для решения этой проблемы. У меня есть запись здесь https://angularthinking.blogspot.com/.
Высокоуровневый подход заключается в создании распределенной блокировки для помещения записи в кэш с соответствующим TTL для вашего варианта использования. Мы используем LUA скрипт, чтобы сделать метод putIfNotExists (), как показано в блоге выше. Масштабирование было одной из наших задач, и благодаря вышеописанной реализации мы смогли обработать 10 тысяч сообщений в секунду без каких-либо проблем в SQS, а redis очень хорошо масштабировался. Нам пришлось настроить TTL на оптимальное значение, основанное на пропускной способности и увеличении кеша. У нас было преимущество в том, что окно дублирования было 24 часа или меньше, поэтому в зависимости от redis для этого решения было все в порядке. Если у вас больше windows, где дубликаты могут возникать в течение нескольких дней или месяцев, опция redis может не подойти.
Мы также рассмотрели DynamoDB для реализации putIfNotExists (), но redis показался более производительным для этого использования. случай, особенно с его собственной реализацией putIfNotExists, использующей скрипт LUA.
Удачи в поиске.