Может ли производитель идемпотентов kafka обеспечить ровно один раз с несколькими разделами

Я только новичок в Kafka и немного узнал об идемпотентности производителя kafka.

Насколько я понимаю, когда производитель отправляет сообщение брокеру, и брокеру необходимо отправить обратно ACK производителю, чтобы сообщить ему, что сообщение было получено. Если ACK не был получен производителем по какой-либо причине, он должен снова отправить то же сообщение брокеру, чтобы сообщение было продублировано. И идемпотентный производитель может устранить эту проблему.

По сути, каждому производителю будет назначен PID, и каждому сообщению будет присвоен серийный номер. Таким образом, PID + серийный номер может идентифицировать сообщение. Так работает идепотенция кафки.

Если я прав, предположим, что я создаю три раздела для одной темы, и производитель отправляет сообщения в три раздела с помощью алгоритма циклического перебора, что означает, что три раздела будут получать сообщения одно за другим. Может ли Кафка в таком случае гарантировать идемпотентность?

Например, есть три раздела a, b и c.

В какой-то момент производитель отправляет сообщение X в раздел a, a успешно получает X, но не может отправить обратно ACK. Итак, производитель повторно отправил сообщение X. Теперь у меня есть два вопроса:

  1. Это будет раздел a или раздел b, который получит последнее сообщение X?
  2. Если это раздел b, означает ли это, что раздел a и раздел b будут иметь одно и то же сообщение X, что означает, что Кафка не может гарантировать идемпотентность в этом случае?

person Yves    schedule 30.11.2020    source источник


Ответы (1)


В какой-то момент производитель отправляет сообщение X в раздел a, a успешно получает X, но не может отправить обратно ACK. Таким образом, производитель повторно отправляет сообщение X.

Это будет раздел a или раздел b, который получит последнее сообщение X?

Повторная отправка выполняется внутри компании, а не в коде приложения. Таким образом, если сообщение X, отправленное в раздел A, не получило подтверждения, оно будет повторно отправлено в тот же раздел. Если мы вручную повторно отправим код приложения, то да, будут дубликаты.

Если логика разделения - циклический, это следующее сообщение, которое будет отправлено в следующий раздел. Логика разделения не применяется к повторной отправке, т.е. если сообщение не удалось отправить, оно повторно отправляется в тот же раздел.

Если это раздел b, означает ли это, что раздел a и раздел b будут иметь одно и то же сообщение X, что означает, что Кафка не может гарантировать идемпотентность в этом случае?

Это не применимо, потому что резиденты всегда отправляются в один и тот же раздел. Логика разделения будет выполняться только один раз перед отправкой сообщения, а не при каждой повторной попытке.

person JavaTechnical    schedule 30.11.2020