digital-garden/_inbox/00 Kafka.md

112 lines
7.8 KiB
Markdown
Raw Normal View History

2024-07-02 19:38:27 +03:00
---
aliases:
- кафка
- kafka
tags:
2024-07-02 19:53:38 +03:00
- type/moc
2024-07-02 19:38:27 +03:00
date:
- - 2024-07-02
- - 2024-07-02
zero-link:
- "[[00 Архитектура ПО]]"
linked:
---
2024-08-20 14:02:07 +03:00
Apache Kafka это платформа потоковой передачи, которую можно использовать для быстрой обработки большого количества событий. Строго говоря это не [Брокер сообщений](Брокер%20сообщений.md), а распределенный реплицированный журнал фиксаций изменений (commit log).
2024-08-26 13:07:54 +03:00
Основные возможности:
- Публиковать записи и подписываться на очереди сообщений (топики)
- Хранить записи с отказоустойчивостью
- Обрабатывать поток по мере их возникновения
2024-08-20 14:02:07 +03:00
Где встречается потребности в потоковой обработке:
- Финансовые транзакции
2024-08-20 14:07:07 +03:00
- Аналитика
- Действия в онлайн магазинах
- Перемещения пользователей
2024-08-20 14:02:07 +03:00
- Социальные сети
- Промышленные датчики
2024-07-03 12:09:39 +03:00
2024-08-20 14:17:33 +03:00
Примеры использований:
- Буфферизация.
2024-08-20 14:22:33 +03:00
- Агрегация журналов логов.
- Интернет вещей
- Показатели датчиков
2024-08-20 14:27:34 +03:00
- [CQRS](CQRS.md)
2024-08-20 14:17:33 +03:00
2024-07-03 12:09:39 +03:00
![](Pasted%20image%2020240703120512.png)
2024-06-13 21:01:37 +03:00
2024-07-03 12:20:34 +03:00
Характеристики:
- Гарантия доставки
- Репликация журнала и синхронизация реплик
- Уведомление о смещении (offset) получателя
- Уведомление о получении сообщения
2024-08-26 13:17:54 +03:00
- Данные хранятся в виде файлов. Файлы записываются в виде сегментов.
2024-07-03 12:20:34 +03:00
- Хранит свои записи на диске и не использует RAM. Использует кэш диска
- Операции считывания и записи выполняются за константное время.
- Реализует последовательное чтение и запись на диск
2024-07-03 12:25:33 +03:00
- Работает через pull модель. Consumer сам должен опрашивать кафку.
2024-08-26 13:07:54 +03:00
Платформа:
- API
- Producer
- Consumer
- Admin
- [Kafka Connect](Kafka%20Connect.md)
- [Kafka Stream](Kafka%20Stream.md)
2024-08-26 13:12:54 +03:00
- ksqlDB
2024-08-26 13:07:54 +03:00
2024-08-26 13:17:54 +03:00
В отличии от [RabbitMQ](00%20RabbitMQ.md) кафка не реализует какой-то роутинг внутри. Предполагается, что за это отвечает consumer.
Терминология:
- Record - запись состоящая из ключа и значения
2024-08-26 13:27:54 +03:00
- [Topic](Kafka%20Topic.md) - имя потока, куда публикуются Record
2024-08-26 13:17:54 +03:00
- Offset - позиция записи
- Pratition - шард топика
2024-08-26 13:07:54 +03:00
2024-07-02 19:38:27 +03:00
Доставка сообщений в Kafka может осуществляться как минимум тремя способами:
- не менее одного раза (at-least-once) сообщение будет отправляется потребителям до тех пор, пока те не подтвердят его получение;
2024-06-13 21:01:37 +03:00
- не более одного раза (at-most-once) сообщение отправляется только один раз и в случае сбоя не отправляется повторно;
- точно один раз (exactly-once) потребитель гарантированно получит сообщение ровно один раз.
![](c85390a0-94b2-48f9-8dea-02d9bacc2562.jpg)
![](49356685-5474-490b-975a-d198d7f966bb.jpg)
![](3ad2bf28-e12a-4be7-9336-c38c7b5d7018.jpg)
2024-07-02 19:43:28 +03:00
Помимо различных семантик доставки, есть еще одно общее преимущество использования брокера сообщений если приложение потребитель потерпело аварию или остановлено для технического обслуживания, то производитель может не ждать, пока его сообщение будет обработано. Когда потребители возобновят работу и вернутся в сеть, они смогут продолжить с того места, на котором остановились, и обработать ожидающие сообщения.
2024-06-13 21:01:37 +03:00
2024-08-20 14:12:08 +03:00
Платформа Kafka изначально была ориентирована на работу с несколькими потребителями, - модель Publish & Subscribe. Это означает, что приложение, читающее сообщение из брокера сообщений, не делает это сообщение недоступным для других приложений, которые также могут захотеть его получить и использовать. Consumer сам следит за смещением offset, то есть он сам следит за тем, какие сообщения он уже прочитал.
2024-06-13 21:01:37 +03:00
2024-07-02 19:43:28 +03:00
Сообщение, также называемое записью, является основной частью данных, проходящих через Kafka. Сообщения это представление ваших данных в Kafka. Каждое сообщение имеет отметку времени, значение и необязательный ключ. При желании также можно добавлять свои заголовки
2024-06-13 21:01:37 +03:00
![](ae8f6a39-5a3f-4195-8f6a-0b96e492413c.jpg)
2024-07-02 22:18:02 +03:00
## Заметки
2024-07-03 11:04:11 +03:00
- Реализована на Java
2024-07-03 12:09:39 +03:00
- Не использует RAM для доступа к данным.
2024-08-20 14:12:08 +03:00
- Зачем нужен Zookeper
- Чтобы определить какая из нод лидер для конкретного топика
- Какое положение курсоров
2024-08-20 14:17:33 +03:00
- Где находятся партишены
2024-07-03 12:14:39 +03:00
- Отправленные сообщения не удаляются после прочтения.
2024-07-03 12:20:34 +03:00
- Позволяет повторно считать данные с любого места. Например, мы выполняли какую-то бухгалтерскую логику и поняли, что в приложении была допущена ошибка в формуле расчета. Мы можем удалить невалидные данные, поправить формулу и заново считать все старые сообщения.
2024-07-03 12:14:39 +03:00
- Можно настроить ротацию, чтобы старые сообщения удалялись.
2024-07-03 12:43:36 +03:00
- Для улучшения производительности желательно под кафку выделять отдельные жесткие диски. Менее актуально для SSD.
- Есть возможность сжатия данных в топике. Аля архивация.
2024-07-04 12:40:41 +03:00
- Использует zookeeper для хранения мета-данных. В новых версиях может уже не использовать.
2024-07-04 13:52:04 +03:00
- Хранит offset значения продюсеров.
2024-07-04 13:46:32 +03:00
- Может обработать 30000 сообщений в секунду
- Производительнее, чем [RabbitMQ](00%20RabbitMQ.md)
2024-07-04 12:40:41 +03:00
## Дополнительно
2024-07-04 13:46:32 +03:00
- [Consumer Group](Consumer%20Group.md)
2024-07-04 13:58:04 +03:00
- [[Кластер Kafka]]
2024-08-26 13:17:54 +03:00
- [Запуск Kafka в docker-compose](Запуск%20Kafka%20в%20docker-compose.md)
2024-07-04 13:58:04 +03:00
```
sudo docker run -p 9000:9000 -e ZK_HOSTS="10.21.21.14:2181" sheepkiller/kafka-manager
```