Раздел 26 · Data Engineering

Подтверждения (acks) и идемпотентный продюсер

junior~15 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

В прошлом уроке продюсер собрал пачку и отправил её лидеру партиции. Брокер отвечает «записал», и продюсер считает дело сделанным. Для точек курьера этого хватает. Для оплат «Гонца» нет: Отто нужно, чтобы оплата не пропала, если сервер сломается, и не списалась дважды, если ответ потеряется в сети. Сегодня разберём, что именно обещает ответ брокера и как от него зависят деньги.

Заказное письмо

На почте можно отправить письмо тремя способами.

Простое: бросил в ящик и ушёл. Дошло ли письмо, ты не узнаешь.

Заказное: работник почты берёт письмо и выдаёт квитанцию. Квитанция значит «письмо у нас». Но если в ту же ночь отделение сгорит, письмо сгорит вместе с ним.

Заказное с копиями: квитанцию выдают, только когда копии письма лежат в двух отделениях. Пожар в одном отделении письму не страшен.

Есть и четвёртая беда. Квитанцию выписали, а курьер, который нёс её тебе, потерял её по дороге. Ты не знаешь, приняли письмо или нет, и отправляешь его ещё раз. Адресат получит два одинаковых письма.

Что значит «записал»

Ответ брокера продюсеру называется подтверждением. Когда его отправлять, решает настройка продюсера acks:

acksКогда брокер отвечаетЧто может потеряться
0не отвечает вовсечто угодно: продюсер даже не узнает об ошибке
1лидер записал к себезапись, если лидер упал раньше, чем фолловеры её забрали
all (или -1)запись есть у всех реплик из ISRничего, пока жива хоть одна реплика из ISR

Подробно о копиях партиции поговорим в уроке про репликацию, а пока хватит двух слов. Первое мы видели в колонке Isr урока про топики. ISR это реплики, которые успевают за лидером. А min.insync.replicas это нижняя граница: если в ISR реплик меньше, брокер откажется принимать запись с acks=all. Обычная пара для важных топиков: три копии и min.insync.replicas=2. Одна копия может упасть, и запись всё равно будет в двух местах.

acks=1 быстрее: лидер отвечает, не дожидаясь фолловеров. Но если лидер упал сразу после ответа, новый лидер этой записи не видел, и она пропадает. Продюсер при этом уверен, что всё записано.

Откуда берутся дубли

Теперь потерянная квитанция. Продюсер отправил оплату, лидер её записал, а ответ потерялся в сети. Продюсер не знает, что произошло, и делает то, что должен: повторяет запрос. Лидер записывает оплату второй раз. В топике две одинаковые оплаты, и биллинг спишет деньги дважды.

Защита от этого называется идемпотентным продюсером. При старте брокер выдаёт продюсеру идентификатор, и продюсер нумерует свои пачки в каждой партиции: 0, 1, 2. Брокер помнит последний номер. Пришла пачка с номером, который уже записан, значит, это повтор: брокер её не пишет, а отвечает оффсетом первой записи.

Идемпотентность работает только вместе с acks=all. С acks=1 повтор после смены лидера ушёл бы к брокеру, который не видел первой записи, и защита бы не сработала.

урок из курса

Урок из курса «Data Engineering». Курс покупается один раз и остаётся навсегда: 500 ₽.

Оплата пока не подключена: премиум и курсы открываются промокодом.