Ответ
Kafka — это распределённая система обмена сообщениями, построенная на принципе журнала с добавлением записей (append-only log).
Запись сообщений:
- Производитель (Producer) отправляет сообщение в определённый топик.
- Топик разделён на партиции для параллелизма. Сообщение записывается в одну партицию на основе ключа (хешируется) или по круговому алгоритму (round-robin), если ключ не указан.
- Сообщение добавляется в конец журнала партиции и получает уникальный, монотонно возрастающий offset.
- Сообщения сохраняются на диск и реплицируются между брокерами (настраивается фактором репликации). Гарантии доставки контролируются параметром
acks(0, 1,all).
Чтение сообщений:
- Потребитель (Consumer) указывает, какую группу потребителей (consumer group) он представляет.
- Каждая партиция топика назначается только одному потребителю внутри группы, обеспечивая параллельное чтение и гарантию порядка в пределах одной партиции.
- Потребитель читает сообщения последовательно, отслеживая свою позицию (offset) для каждой партиции. Он может начать с начала, с конца или с конкретного offset.
- Сообщения не удаляются после чтения. Они хранятся в течение заданного времени или до достижения лимита размера (политики удержания — retention). Это позволяет «отстающим» потребителям или новым группам читать исторические данные.
Пример команды для консольного производителя и потребителя:
# Запись сообщения в топик 'test-topic'
echo "Hello, Kafka" | kafka-console-producer.sh --broker-list localhost:9092 --topic test-topic
# Чтение сообщений с начала топика 'test-topic'
kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test-topic --from-beginning
Ключевые преимущества: высокая пропускная способность за счёт последовательной записи на диск, горизонтальная масштабируемость, отказоустойчивость за счёт репликации и поддержка потоковой обработки.