Либрдкафка: распоряжение публикуется при крушении - PullRequest
0 голосов
/ 21 сентября 2019

Рассмотрим этот цикл событий:

  1. В то время как больше сообщений
  2. msg_in = consumer.Poll ()
  3. msg_out = transform (msg_in)
  4. service.Publish (msg_out)

Предположим, что один раздел и сосредоточиться на четвертой строке.Когда происходит сбой этого цикла, говорят, что в Кафку поступило 5 сообщений в порядке 1,2,3,4,5.И из этих Кафка получил только N <= 5.Покой потерян. </p>

Если нет попыток, что мы можем сказать?Что Кафка получил 1 или 1,2 или 1,2,3 или 1,2,3,4 или 1,2,3,4,5?Kafka дает гарантию заказа на раздел.

Если есть повторы попыток, упорядочение курса потеряно, и Кафка может получить любую перестановку P, превышающую то, что он получил, от m = 0 до N. Это понятно.

Я используюgolang wrap rdkafka из слияния, но давайте просто сосредоточимся на самой rdkafka.

1 Ответ

0 голосов
/ 21 сентября 2019

это даже сложнее, чем вы думаете: -)

librdkafka поддерживает max.in.flight.requests.per.connection .если вы установите для этого параметра значение 1, повторная попытка должна быть безопасной при некоторых обстоятельствах (а именно, если они бесконечны. любая настройка, которая отбрасывает недоставленные данные, может изменить порядок).

в более новых версиях enable.idempotence улучшит эту гарантию додо максимального значения в полете 5.

другой «интересный» сценарий может заключаться в том, что записи 1, 2, 3, 4 и доставляются, происходит сбой лидера, назначается нечистый лидер, запись 4 удаляется, а затем5, что приводит к 1, 2, 3, 5 в разделе.

или, возможно, рассматриваемая тема сжата в журнале, и некоторые из этих записей имеют точно такой же ключ?

...