Apache Kafka порядок сообщений в разделе гарантированно - PullRequest
5 голосов
/ 07 ноября 2019

Прочтите эту статью об упорядочении сообщений в разделе раздела: https://blog.softwaremill.com/does-kafka-really-guarantee-the-order-of-messages-3ca849fd19d2

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

В соответствии с этим существует два типа производителяКонфиги можно получить гарантию заказа:

max.in.flight.requests.per.connection=1 // can impact producer throughput

или альтернативный

enable.idempotence=true
max.in.flight.requests.per.connection //to be less than or equal to 5
max.retries // to be greater than 0
acks=all

Кто-нибудь может объяснить, как вторая конфигурация обеспечивает гарантию заказа? Также во втором конфиге семантика включается ровно один раз.

Ответы [ 3 ]

3 голосов
/ 07 ноября 2019

идемпотентность :( Семантика порядка-один раз для каждого раздела)

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

Идемпотент - это одна из ключевых характеристик для достижения семантики Ровная однократная в Кафке. Чтобы установить «enable.idempotence = true», в конечном итоге получите семантику «ровно один раз» на раздел, что означает отсутствие дубликатов и потери данных для конкретного раздела. Если произошла ошибка, даже если производитель отправил сообщение несколько раз, он будет записан в Kafka один раз. Для одного раздела, производитель Idempotent гарантирует отсутствие дублирующих возможностей для каждого раздела в случае ошибки брокера.

Концепция PID и порядкового номера производителя Kafka для достижения идемпотента, как описано ниже:

PIDи порядковый номер

Идемпотентные производители используют идентификатор продукта (PID) и порядковый номер при создании сообщений. Производитель продолжает увеличивать порядковый номер каждого публикуемого сообщения, сопоставляя с уникальным PID. Брокер всегда сравнивает текущий порядковый номер с предыдущим и отклоняет его, если новый не на +1 больше предыдущего, что позволяет избежать дублирования, и в то же время, если в сообщениях пропадает больше, чем больше.

enter image description here

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

Если вы используете enable.idempotence = true, вы можете сохранить max.in.flight.requests.per.connection до 5, и вы можете достичьЗакажите гарантию, которая принесет лучшую параллельность и улучшит производительность.

Функция идемпотентности была введена в Kafka 0.11+, прежде чем мы сможем достичь некоторого уровня гарантированного уровня, используя max.in.flight.requests.per.connection с повторными попытками и установкой Acks:

max.in.flight.requests.per.connection to 1
max.retries bigger number
acks=all

max.in.flight.requests.per.connection = 1 : чтобы убедиться, что во время повторной отправки сообщений дополнительные сообщения отправляться не будут.

Это будет связано с затратами на производительность и пропускную способность, и это поощряет введение функции enable.idempotence для повышения производительности и в то же время гарантии заказа.

2 голосов
/ 07 ноября 2019

enable.idempotence - это более новая настройка, которая была введена как часть kip-98 (реализована в kafka 0.11+). прежде чем пользователям придется установить max.inflight равным 1.

способ, которым он работает (сокращенно), заключается в том, что производители теперь помещают порядковые номера в наши партии продуктов, а брокеры отслеживают эти порядковые номера для каждого производителя, подключенного ких. если брокер получает партию не в порядке (скажем, партию 3 после 1), он отклоняет ее и ожидает увидеть партию 2 (которую производитель будет ретранслировать). для получения полной информации вы должны прочитать kip-98

0 голосов
/ 07 ноября 2019

Идемпотентный производитель - это то, что, если вы снова отправите то же сообщение, это не повлияет на последовательность сообщений. Таким образом, если вы используете enable.idempotence=true, это также вызовет семантику "точно один раз" без установки max.in.flight.requests.per.connection=1.

...