В прошлом уроке продюсер собрал пачку и отправил её лидеру партиции. Брокер отвечает «записал», и продюсер считает дело сделанным. Для точек курьера этого хватает. Для оплат «Гонца» нет: Отто нужно, чтобы оплата не пропала, если сервер сломается, и не списалась дважды, если ответ потеряется в сети. Сегодня разберём, что именно обещает ответ брокера и как от него зависят деньги.
Заказное письмо
На почте можно отправить письмо тремя способами.
Простое: бросил в ящик и ушёл. Дошло ли письмо, ты не узнаешь.
Заказное: работник почты берёт письмо и выдаёт квитанцию. Квитанция значит «письмо у нас». Но если в ту же ночь отделение сгорит, письмо сгорит вместе с ним.
Заказное с копиями: квитанцию выдают, только когда копии письма лежат в двух отделениях. Пожар в одном отделении письму не страшен.
Есть и четвёртая беда. Квитанцию выписали, а курьер, который нёс её тебе, потерял её по дороге. Ты не знаешь, приняли письмо или нет, и отправляешь его ещё раз. Адресат получит два одинаковых письма.
Что значит «записал»
Ответ брокера продюсеру называется подтверждением. Когда его отправлять, решает настройка продюсера 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 ₽.
Оплата пока не подключена: премиум и курсы открываются промокодом.