===== Общее =====
**Распределенный** брокер сообщений стриминговых событий\\
Высоконадежный, для высоконагруженных систем, горизонтальное масштабированное, оч популярное решение, много интеграций, написан на Java/Scala\\
:!: Описание
| {{:linux:0.png?direct&400|}} | {{:linux:1.png?direct&400|}} |
Компоненты:\\
* **Broker** - сервер/node, прием/хранение/передача сообщений, их обычно несколько, объединяются в кластер
* **Zookeeper** - рабочая БД для хранения состояния, конфигурации и т.д., самостоятельный инструмент (оч быстрое чтение данных)
* **Message (Record)** - передаваемые сообщения
* **Topic/Partition** - "ящики" куда складываются данные
* **Producer** - отправитель
* **Consumer** - получатель
| **Сообщения** | **Топики** |
| {{:linux:3.png?direct&400|}} | {{:linux:5.png?direct&400|}} |
** Хранение сообщений **\\
Получаемые брокером сообщения хранятся в лог файлах, папка "./logs", содержит подпапки для топиков, партиций, с соответствующими именами\\
Набор "рабочих" файлов, в которые пишется в данный момент, называется **сегментом**, сегмент состоит из трех файлов с разным расширением, со временем они ротируются в зависимости от размера, в именах файлов указаны номера п/п сообщений, с какого номера сообщений пишутся в данный сегмент\\
** Репликация **\\
(replication-factor: count)\\
Данные реплицируются на брокерах, партициями, каждая партиция находится минимум в двух экземплярах на разных брокерах\\
Для согласованности дубликатов (т.к. есть запоздания) одна из реплик является основной, остальные подчиненные, основные реплики назначаются сервером-контроллером из кластера\\
Чтение/запись происходит только с лидер-репликой, затем, синхронно, для нивелирования отставаний, идет запись в ISR реплики ("подчиненные+" так сказать), настраивается вручную, они первые кандидаты в лидеры\\
{{:linux:6.png?direct&400|}}
**Producer (отправка)**\\
{{:linux:7.png?direct&400|}}
**Consumer (получение)**\\
{{:linux:8.png?direct&400|}}
:!: Еще описание
Программный брокер сообщений, т.е. приложение, которое принимает данные от другой программы, хранит их в своей базе и отдает информацию другой программе.\\
Kafka с открытым исходным кодом, разработкой занимается Apache Software Foundation\\
**Область применения** сфокусирована в отраслях, где требуются сбор, обработка, безопасное хранение и передача больших объемов данных, например такие как онлайн-игры, соц сети, банковские системы, гео системы и т.д.\\
**Архитектурно** в процессе работы Kafka участвуют следующие сущности:
* **Продюсер** - то что генерирует и посылает данные брокеру
* **Потребитель** - тот, кто принимает отправленные продюсером сообщения
* **Сообщения** - сами данные
* **Брокер** - узел передачи данных
* **Топики (тема)** - хранилище сгруппированных сообщений (по разным признакам) из которого потребитель извлекает необходимую ему информацию
**Преимущества**\\
* Возможность долгого хранения данных
* Бесплатные и открытые исходники
* Алгоритмы работы заточены на высокую производительность
* Механизмы защиты данных (?)
* Возможность работы в режиме кластера, простая масштабируемость (горизонтальная)
Ближайший **аналог** это RabbitMQ, основные отличия\\
* Способы доставки сообщений, Kafka использует **pull** (получатель сам достает сообщения), а RabbitMQ **push** (брокер сам отправляет сообщение)
* Kafka хранит данные до установленного администратором срока, Rabbit удаляет после отправки получателю
* При высоких нагрузках Rabbit проигрывает в производительности из-за реализованного гибкого управления