Кафка

Тарас Войнаровський

Франц Кафка?

Kafka on the Shore 

(海辺のカフカ Umibe no Kafuka)

2002

Apache Kafka

Як зберігати великий потік даних так, щоб його ще й читати можна було =)

Taras Voinarovskyi

Collaborator:

Також є confluent-kafka-python та pykafka

Що у нас в програмі?

  • Чому потрібні Message Broker'и і чому x1.32xlarge RabbitMQ не зовсім варіант =)
  • Архітектура і гарантії, які надає Kafka. Чим це відрізняється від стандартного підходу черг.
  • Як і чому ситуація міняється після Kafka 11.
  • Q&A

Message broker... Why?

Message broker... Why?

Broker

Варіанти

  • RabbitMQ
  • ActiveMQ
  • Amazon Simple Queue Service
  • Google Cloud Pub/Sub
  • Kafka
  • ...

Параметни

  • HA, cluster
  • гарантії доставки 
  • персистентність
  • Довготривале накопичення беклогу
  • ...

AMQP produce

Producer

Producer

Producer

Topic

  • ACK на кожне повідомлення
  • Порядок повідомлень не зберігається
  • Дублікати при розривах з'єднання

AMQP consume

Consumer

Consumer

Consumer

  • QoS забезпечує чесний розподіл
  • ACK/NACK на кожне повідомлення
  • Повідомлення можуть приходити не впорядковано

Topic

Kafka produce

Producer

Producer

Producer

Partition 0

Partition 1

Partition 2

  • ACK на пачку повідомлень
  • Порядок повідомлень гарантовано в межах партіції
  • Розбиття на партіції по хешу або ручками

Kafka consume

Consumer

Consumer

Consumer

  • Партіції можуть мати різний лаг
  • Commit на конкретну позицію в партіції
  • Порядок в партіції завжди зберігається

Partition 0

Partition 1

Partition 2

...

Kafka 11

Що нового?

  • Idempotent producer
  • Exactly once consume-produce
  • Record Headers
  • ...
  • Admin client
  • Timestamp index and search
  • Kafka Streams

Kafka 10.X

Before: Producer duplicates

Idempotent Producer

Transactional Producer

  • Атомарний запис в декілька партіцій
  • Після коміта скають доступні або всі записи, або ні одного
  • Consumer'и можуть бути настроєні для читання в 2 режимах: uncommited, commited

Transactional Producer

Stream processing

Client

Kafka

Consume

Producer.send()

Producer.commit()

Producer.sendOffsetsToTransaction()

Transaction

Need more? =)

  • CRC32C
    • BenchmarkCrc32KB 90196 ns/op 363.30 MB/s
    • BenchmarkCrcCastagnoli32KB 3404 ns/op 9624.42 MB/s
  • ​New record format 35% smaller
  • Request quotas
  • Heartbeats in background Thread (Kafka 10)
  • ...

Я вам посылку принёс

только я вам её не отдам

kafka-python

librdkafka

aiokafka

broker

Exactly once semantics support

  • librdkafka 2017 V4
  • confluent-kafka-python - після librdkafka
  • kafka-python - ХЗ
  • aiokafka - ХЗ

~2018

kafka11

By Taras Voinarovskyi

kafka11

  • 1,038