TGStat
TGStat
Qidiruv uchun matnni kiriting
Ilg‘or kanal qidiruvi
  • flag Uzbek
    Sayt tili
    flag Russian flag English flag Uzbek
  • Saytga kirish
  • Katalog
    Kanal va guruhlar katalogi Hududiy to‘plamlar Tematik to‘plamlar Платные каналы Kanallar qidiruvi
    Kanal/guruh qo‘shish
  • Reytinglar
    Kanallar reytingi Guruhlar reytingi Postlar reytingi
    Brendlar va shaxslar reytingi
  • Analitika
  • Postlarda qidiruv
  • Telegram'ni kuzatish
  • Targ‘ibot
    Yandex Business orqali reklama TGStat Agency orqali kanallarda reklama TGStat.ru saytida reklama
Женя Янченко

9 Jun, 09:23

Telegram'da ochish Ulashish Shikoyat qilish

Может ли нарушаться порядок сообщений в Кафке?

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

С высоты птичьего полета процесс выглядит так:
Продюсеры отправляют данные -> Брокеры записывают данные на диск -> Консьюмеры забирают данные для обработки.

➡️ Начнем с хранения.

Партиция в Kafka — это последовательный append-only log. Новые сообщения не вставляются в середину и не перезаписывают старые, а просто добавляются в конец файла и так лежат на диске. Брокер не сортирует и не тасует сообщения, поэтому перепутаться непосредственно при хранении не могут.

➡️ Теперь посмотрим на продюсера.

Есть комбинация настроек продюсера, при которой может произойти нарушение порядка:

enable.idempotence=false
retries > 0 //сколько раз продюсер будет переотправлять запрос при ошибке
max.in.flight.requests.per.connection > 1 //сколько запросов продюсер может отправить брокеру, не дожидаясь подтверждения предыдущих

Сценарий такой:

Исходный порядок сообщений: 1, 2, 3, 4, 5, 6.

1. Продюсер отправляет batch A: сообщения 1, 2, 3

2. Не дожидаясь ответа, отправляет batch B: сообщения 4, 5, 6

3. Batch A з-за кратковременного сбоя не записался или потерялось его подтверждение записи

4. Batch B успешно записался в партицию

5. Продюсер ретраит batch A

6. Batch A успешно записывается позже batch B 😱

В логе Kafka сообщения оказываются записаны в порядке: 4, 5, 6, 1, 2, 3


Этот случай прямо описывается в доке Кафки.

Как избежать такой ситуации?

1️⃣ Максимально строгий и простой режим:

max.in.flight.requests.per.connection = 1

Тогда продюсер не будет держать несколько незавершенных запросов одновременно, и сценарий "второй батч записался раньше первого" исчезнет.
➖ Но такая настройка снижает пропускную способность.

2️⃣Включение идемпотентности продюсера и соответствующей ей комбинации настроек:

enable.idempotence = true
retries > 0
max.in.flight.requests.per.connection

3.1k 0 61 15 77
Katalog
Kanal va guruhlar katalogi Kanallar to‘plamlari Kanallar qidiruvi Kanal/guruh qo‘shish
Reytinglar
Telegram-kanallar reytingi Telegram-guruhlar reytingi Postlar reytingi Brendlar va shaxslar reytingi
API
Statistika API'si Postlar qidiruvi API'si API Callback
Kanallarimiz
@TGStat @TGStat_Chat @telepulse @TGStatAPI
O‘qish
Академия TGStat Telegram tadqiqoti 2019 Telegram tadqiqoti 2021 Telegram tadqiqoti 2023
Kontaktlar
Справочный центр Qo‘llab-quvvatlash Email Vakansiyalar
Har xil narsalar
Foydalanuvchi shartnomasi Maxfiylik siyosati Ommaviy oferta
Botlarimiz
@TGStat_Bot @SearcheeBot @TGAlertsBot @tg_analytics_bot @TGStatChatBot