Черги й стрімінг

Apache Kafka

Kafka це розподілений журнал подій для потокової передачі даних із високою пропускною здатністю та тривалим зберіганням.

Що це

Kafka створили в LinkedIn, відкрили у 2011 році, а згодом він став проєктом Apache. Це не класична черга, а розподілений журнал: повідомлення дописуються в кінець топіка та зберігаються задану кількість днів чи розміру, навіть після прочитання.

Топік ділиться на партиції. Порядок гарантується в межах партиції, а споживачі в одній consumer group ділять партиції між собою й можуть паралельно масштабуватися. Кожен споживач сам тримає свою позицію (offset) і може перечитати історію.

Kafka використовують для потоків подій, збору логів і метрик, CDC з баз даних, інтеграції мікросервісів та event sourcing. Нові кластери працюють в режимі KRaft без ZooKeeper.

Коли брати

  • Потрібна велика пропускна здатність: сотні тисяч повідомлень за секунду.
  • Події треба зберігати й перечитувати кількома незалежними споживачами.
  • Будуєте потокову обробку, CDC чи event sourcing.
  • Потрібен строгий порядок подій у межах ключа.

Коли не варто

  • Потрібна проста черга задач для кількох воркерів: RabbitMQ чи SQS простіші.
  • Обсяг малий, а команда не готова експлуатувати кластер.
  • Потрібна маршрутизація повідомлень за складними правилами чи пріоритети.

Ключові поняття

Topic / partition
Топік це категорія подій, партиція це впорядкований шматок топіка для паралелізму.
Offset
Порядковий номер повідомлення в партиції, за ним споживач знає, де зупинився.
Consumer group
Група споживачів ділить партиції топіка: кожна партиція йде одному члену групи.
Replication factor
Скільки копій кожної партиції зберігається на різних брокерах.
Retention / log compaction
Політика зберігання: за часом, розміром або лише останнє значення для кожного ключа.

Приклад

Створення топіка з трьома партиціями, запис події та читання з початку.

Шпаргалка

Kafka: шпаргалка
Команда або кодЩо робить
kafka-topics.sh --create --topic orders --partitions 3 --bootstrap-server localhost:9092Створити topic із 3 partition
kafka-topics.sh --list --bootstrap-server localhost:9092Список topic
kafka-topics.sh --describe --topic orders --bootstrap-server localhost:9092Деталі topic: partition і репліки
kafka-console-producer.sh --topic orders --bootstrap-server localhost:9092Відправити повідомлення з консолі
kafka-console-consumer.sh --topic orders --from-beginning --bootstrap-server localhost:9092Прочитати topic з початку
kafka-console-consumer.sh --topic orders --group billing --bootstrap-server localhost:9092Читати як учасник consumer group
kafka-consumer-groups.sh --describe --group billing --bootstrap-server localhost:9092Відставання (lag) групи по partition
kafka-consumer-groups.sh --group billing --topic orders --reset-offsets --to-earliest --execute --bootstrap-server localhost:9092Скинути offset групи на початок
kafka-topics.sh --delete --topic orders --bootstrap-server localhost:9092Видалити topic

Як вивчити

  1. Зрозумій модель: topic, partition, offset, producer, consumer і consumer group, а також чим це відрізняється від черги.
  2. Запусти Kafka локально (режим KRaft, без ZooKeeper) у Docker і користуйся CLI скриптами.
  3. Створи topic, відправ повідомлення з консольного producer і прочитай їх consumer.
  4. Напиши producer і consumer на своїй мові (kafkajs, confluent, Java client) і побач, як працюють offset.
  5. Розберись із ключами повідомлень, порядком у межах partition і розподілом partition між консʼюмерами групи.
  6. Вивчи гарантії доставки: acks, ідемпотентний producer, at least once, exactly once, коміт offset.
  7. Додай обробку помилок, повторні спроби, dead letter topic та моніторинг відставання (lag).
  8. Прочитай про Kafka Connect, Schema Registry і Streams для інтеграцій та потокової обробки.

Питання на співбесіді

  1. 1. Чим Kafka відрізняється від звичайної черги?

    У черзі повідомлення зникає після споживання. У Kafka воно лишається в журналі за політикою retention, і кілька споживачів читають його незалежно, зі своїми offset.

  2. 2. Як Kafka гарантує порядок?

    Порядок гарантований лише в межах однієї партиції. Щоб події одного обʼєкта йшли по порядку, їх пишуть з однаковим ключем, тоді вони потрапляють в одну партицію.

  3. 3. Що таке delivery semantics?

    At-most-once може втратити повідомлення, at-least-once може дублювати, exactly-once досягається ідемпотентним продюсером і транзакціями. На практиці роблять споживачів ідемпотентними.

  4. 4. Скільки споживачів може читати партицію?

    У межах однієї consumer group лише один. Тому кількість партицій обмежує паралелізм групи. Інша група читає ті самі дані окремо.

Питання з банку співбесід

Порівняння з цією технологією

Логотипи належать їхнім власникам і використані лише для ідентифікації. Іконки: Simple Icons (CC0), Devicon (MIT).

Розділи платформи