Блок начался с вопроса Отто: почему опаздывают курьеры «Гонца». В курсе аналитика мы отвечали на него запросами к готовой таблице. Тридцать уроков спустя мы знаем, как эта таблица могла бы появиться: из событий, которые приложение пишет в Kafka, через консьюмер, который считает время доставки. Сегодня соберём этот путь целиком, от телефона курьера до витрины Отто, и вспомним по дороге весь блок.
Водопровод
Вода из крана кажется простой вещью. Но за краном стоит целая система: насосная станция, трубы, задвижки на случай аварии, счётчики, фильтры. Каждую часть кто-то выбрал и настроил. Если задвижку забыли, авария в одном доме оставит без воды весь квартал. Если забыли счётчик, никто не заметит утечку, пока не придёт счёт.
Поток данных устроен так же. Отто видит только дашборд, «кран». А за ним стоят продюсер, топик, реплики, группа консьюмеров, коммиты и мониторинг. Каждое решение мы уже разбирали по отдельности. Теперь посмотрим, как они работают вместе.
Путь заказа
приложение заказов
│ продюсер: ключ = номер заказа, acks=all, идемпотентность
▼
топик order-events: 3 партиции, 3 копии, min.insync.replicas=2
│
▼
группа delay-mart: читает, считает время доставки, коммитит после записи
│
▼
витрина опозданий по зонам ──→ дашборд Отто
События у заказа три: created, picked-up и delivered. В каждом номер заказа, зона и время. Время доставки это разница между delivered и created того же заказа.
Решения на каждом шаге
| Шаг | Решение | Зачем | Урок |
|---|---|---|---|
| ключ | номер заказа | события одного заказа в одной партиции и по порядку: created придёт раньше delivered | ключи |
| продюсер | acks=all и идемпотентность | событие не потеряется при падении лидера и не задвоится при повторе | подтверждения |
| топик | 3 копии, min.insync.replicas=2 | падение одного брокера не остановит запись и не потеряет данные | репликация |
| партиции | 3, с запасом на пик | до трёх консьюмеров в группе работают одновременно | партиции |
| коммит | после записи в витрину | упавший консьюмер ничего не потеряет, at-least-once | оффсеты |
| витрина | помнит, чья доставка уже учтена | повтор не испортит среднее | exactly-once |
| хранение | 7 дней по умолчанию | витрину можно пересчитать заново, перечитав топик | лог, retention |
| битые события | повторы и мёртвая очередь | одно сломанное событие не остановит партицию | ошибки |
| мониторинг | лаг группы и возраст старой записи | Отто не увидит устаревший дашборд раньше нас | лаг |
Отдельно стоит выгрузка для отчётов. Витрина опозданий нужна Отто в течение дня, а квартальный анализ живёт в хранилище. Те же события раз в сутки выгружают туда батчем, как мы обсуждали в первом уроке. Готовые инструменты для такой выгрузки разбирали в уроке про Kafka Connect.
урок из курса
Урок из курса «Data Engineering». Курс покупается один раз и остаётся навсегда: 500 ₽.
Оплата пока не подключена: премиум и курсы открываются промокодом.