Skip to content

Commit 2e16886

Browse files
author
Danil Pudovkin
committed
Add kafka broker, producer architecture
+ add topic settings
1 parent 249ec2e commit 2e16886

2 files changed

Lines changed: 217 additions & 5 deletions

File tree

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -779,6 +779,8 @@
779779
* [Что такое Apache Kafka?](kafka.md#что-такое-apache-kafka)
780780
* [Основные компоненты Kafka](kafka.md#основные-компоненты-kafka)
781781
* [Архитектура топика](kafka.md#архитектура-топика)
782+
* [Архитектура брокера](kafka.md#архитектура-брокера)
783+
* [Архитектура продюсера](kafka.md#архитектура-продюсера)
782784

783785
[к оглавлению](#Вопросы-для-собеседования-на-java-developer)
784786

kafka.md

Lines changed: 215 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
* [Что такое Apache Kafka?](#что-такое-apache-kafka)
55
* [Основные компоненты Kafka](#основные-компоненты-kafka)
66
* [Архитектура топика](#архитектура-топика)
7+
* [Архитектура брокера](#архитектура-брокера)
8+
* [Архитектура продюсера](#архитектура-продюсера)
79

810
## Что такое Apache Kafka?
911

@@ -21,14 +23,14 @@
2123
### Когда использовать
2224

2325
* λ-архитектура или k-архитектура
24-
* стриминг больших данных
25-
* много клиентов (producer и consumer)
26-
* требуется кратное масштабирование
26+
* Стриминг больших данных
27+
* Много клиентов (producer и consumer)
28+
* Требуется кратное масштабирование
2729

2830
### Чего в Kafka нет из коробки
2931

30-
* это не брокер сообщений
31-
* отложенные сообщения
32+
* Это не брокер сообщений
33+
* Отложенные сообщения
3234
* DLQ
3335
* AMQP / MQTT
3436
* TTL на сообщение
@@ -61,4 +63,212 @@
6163
* **retention.ms** - по времени
6264
* **Сообщение можно быстро найти по его Offset** — каждому сообщению в партиции присваивается уникальный смещающий индекс (offset), по которому можно легко найти сообщение
6365

66+
### Настройки топика Kafka
6467

68+
#### Репликация
69+
70+
* `replication.factor`
71+
* **Описание**: Количество реплик для каждой партиции топика
72+
* **Пример**: `replication.factor=3`
73+
* `min.insync.replicas`
74+
* **Описание**: Минимальное количество синхронизированных реплик
75+
* **Пример**: `min.insync.replicas=2`
76+
77+
#### Хранение данных
78+
79+
* `retention.ms`
80+
* **Описание**: Время хранения сообщений в топике в миллисекундах
81+
* **Пример**: `retention.ms=604800000` (7 дней)
82+
* `retention.bytes`
83+
* **Описание**: Максимальный объём данных в топике, после чего старые сообщения удаляются
84+
* **Пример**: `retention.bytes=10737418240` (10 GB)
85+
* `segment.bytes`
86+
* **Описание**: Размер сегмента логов топика
87+
* **Пример**: `segment.bytes=1073741824` (1 GB)
88+
89+
#### Политики очистки
90+
91+
* `cleanup.policy`
92+
* **Описание**: Как Kafka обрабатывает старые сообщения
93+
* **Значения**: `delete`, `compact`
94+
* **Пример**: `cleanup.policy=delete`
95+
96+
#### Партиции
97+
98+
* `num.partitions`
99+
* **Описание**: Количество партиций в топике
100+
* **Пример**: `num.partitions=3`
101+
102+
[к оглавлению](#apache-kafka)
103+
104+
## Архитектура брокера
105+
106+
* **У каждой партиции свой лидер** — в Kafka для каждой партиции в топике назначается лидер-брокер, который отвечает
107+
за запись и чтение данных
108+
* **Сообщения пишутся в лидера** — производители отправляют сообщения напрямую в брокер-лидер партиции
109+
* **Данные реплицируются между брокерами** — для обеспечения отказоустойчивости Kafka реплицирует данные партиций на
110+
другие брокеры, которые становятся репликами
111+
* **Автоматический фейловер лидера** — в случае сбоя брокера-лидера Kafka автоматически назначает новый лидер из числа
112+
реплик, обеспечивая бесшовную работу системы
113+
114+
### Настройки брокера Kafka
115+
116+
#### Репликация и консистентность
117+
118+
* `min.insync.replicas`
119+
* **Описание**: Минимальное количество синхронизированных реплик для подтверждения записи
120+
* **Пример**: `min.insync.replicas=2`
121+
* `unclean.leader.election.enable`
122+
* **Описание**: Разрешает выбор лидера из неактуальных реплик, если нет синхронизированных реплик
123+
* **Пример**: `unclean.leader.election.enable=false`
124+
125+
#### Логирование и хранение данных
126+
127+
* `log.dirs`
128+
* **Описание**: Директория на диске, где хранятся логи партиций
129+
* **Пример**: `log.dirs=/var/lib/kafka/logs`
130+
* `log.retention.hours`
131+
* **Описание**: Максимальное время хранения данных в логах
132+
* **Пример**: `log.retention.hours=168` (7 дней)
133+
* `log.segment.bytes`
134+
* **Описание**: Максимальный размер сегмента лога, после чего создаётся новый
135+
* **Пример**: `log.segment.bytes=1073741824` (1 GB)
136+
137+
### Производительность и задержки
138+
139+
* `num.network.threads`
140+
* **Описание**: Количество потоков для обработки сетевых запросов
141+
* **Пример**: `num.network.threads=3`
142+
* `num.io.threads`
143+
* **Описание**: Количество потоков для ввода-вывода
144+
* **Пример**: `num.io.threads=8`
145+
* `socket.send.buffer.bytes`
146+
* **Описание**: Размер буфера для отправки данных по сети
147+
* **Пример**: `socket.send.buffer.bytes=102400`
148+
149+
### Управление сообщениями
150+
151+
* `message.max.bytes`
152+
* **Описание**: Максимальный размер сообщения, которое брокер может принять
153+
* **Пример**: `message.max.bytes=1048576` (1 MB)
154+
* `replica.fetch.max.bytes`
155+
* **Описание**: Максимальный размер данных для запроса реплики
156+
* **Пример**: `replica.fetch.max.bytes=1048576` (1 MB)
157+
158+
### Безопасность
159+
160+
* `ssl.keystore.location`
161+
* **Описание**: Путь к хранилищу ключей SSL
162+
* **Пример**: `ssl.keystore.location=/var/private/ssl/kafka.keystore.jks`
163+
* `ssl.truststore.location`
164+
* **Описание**: Путь к хранилищу доверенных сертификатов
165+
* **Пример**: `ssl.truststore.location=/var/private/ssl/kafka.truststore.jks`
166+
167+
[к оглавлению](#apache-kafka)
168+
169+
## Архитектура продюсера
170+
171+
* **Создание сообщения (Record)**: Продюсер формирует сообщение, содержащее ключ (необязательный), значение и метаданные,
172+
такие как время отправки. Сообщение отправляется в топик (Topic), который состоит из одной или нескольких партиций
173+
* **Выбор партиции**: Если ключ сообщения указан, Kafka использует его для хеширования и определения, в какую партицию
174+
записать сообщение (сообщения с одинаковым ключом попадают в одну и ту же партицию). Если ключа нет, Kafka распределяет
175+
сообщения по партициям с помощью round-robin или по другим правилам
176+
* **Отправка сообщений в буфер (Batching)**: Для повышения производительности продюсер Kafka не отправляет каждое сообщение
177+
по отдельности, а группирует несколько сообщений в пакеты (batching), прежде чем отправить их брокеру. Это снижает
178+
сетевые задержки и нагрузку на брокера
179+
* **Сжатие (Compression)**: Для уменьшения объёма передаваемых данных продюсер может сжимать сообщения с использованием
180+
таких алгоритмов, как GZIP, Snappy или LZ4. Сжатие снижает нагрузку на сеть и хранение, но добавляет небольшие накладные
181+
расходы на процессор
182+
* **Асинхронная отправка**: Продюсер отправляет пакеты сообщений асинхронно. Это означает, что сообщения записываются в
183+
буфер памяти и отправляются брокеру, не ожидая завершения предыдущих операций. Это повышает пропускную способность
184+
* **Подтверждения (Acknowledgments)**: Kafka позволяет настраивать уровень подтверждений от брокеров
185+
* **Ретрай и идемпотентность**: Если отправка сообщения не удалась, продюсер может повторить попытку отправки (ретрай).
186+
Также можно включить идемпотентный режим продюсера, что предотвращает повторную отправку одного и того же сообщения в
187+
случае сбоя, обеспечивая отправку уникального сообщения один раз
188+
* **Error handling**: Продюсер обрабатывает ошибки при отправке сообщений. В зависимости от настроек продюсер может
189+
попытаться переотправить сообщение или сообщить о проблеме через callback
190+
191+
### Настройки продюсера
192+
193+
#### Bootstrap-серверы (`bootstrap.servers`)
194+
195+
* **Описание**: Указывает адреса брокеров Kafka, к которым продюсер должен подключаться для отправки сообщений
196+
* **Пример**: `bootstrap.servers: localhost:9092,localhost:9093`
197+
* **Зачем это нужно**: Kafka продюсер использует эти брокеры для получения метаданных о кластере (например, информация о топиках и партициях). Эти брокеры служат точками входа в кластер Kafka.
198+
199+
#### Сериализация ключа и значения
200+
201+
Продюсер должен преобразовывать (сериализовать) данные в байтовый формат перед отправкой в Kafka
202+
203+
* **Ключевая настройка для сериализации ключа:**
204+
* `key.serializer`
205+
* Пример: `key.serializer: org.apache.kafka.common.serialization.StringSerializer`
206+
* **Ключевая настройка для сериализации значения:**
207+
* `value.serializer`
208+
* Пример: `value.serializer: org.apache.kafka.common.serialization.StringSerializer`
209+
210+
**Варианты сериализаторов:**
211+
* `StringSerializer` для строк
212+
* `ByteArraySerializer` для массива байтов
213+
* `LongSerializer` для чисел
214+
* Также можно реализовать свои собственные сериализаторы
215+
216+
#### Отправка сообщений в буфер
217+
218+
Продюсер Kafka отправляет сообщения асинхронно, и для этого используется буферизация сообщений
219+
220+
* **batch.size**: Размер одного пакета (batch), который продюсер отправляет брокеру
221+
* **Описание**: Определяет количество байтов сообщений, которые могут быть буферизованы в одном пакете перед отправкой брокеру
222+
* **Пример**: `"batch.size": 16384` (16 KB)
223+
* **Зачем это нужно**: Большие пакеты могут повысить производительность, но могут увеличить задержки
224+
* **linger.ms**: Максимальное время ожидания перед отправкой пакета
225+
* **Описание**: Продюсер может немного подождать, пока буфер накопит сообщения, чтобы отправить больше данных за один раз
226+
* **Пример**: `linger.ms: 5` (время ожидания 5 мс)
227+
* **Зачем это нужно**: Позволяет продюсеру собирать больше сообщений в пакете перед отправкой, что может улучшить эффективность использования сети
228+
* **buffer.memory**: Размер выделенной памяти для буферизации сообщений
229+
* **Описание**: Общий объем памяти, который продюсер может использовать для хранения сообщений, ожидающих отправки
230+
* **Пример**: `buffer.memory: 33554432` (32 MB)
231+
* **Зачем это нужно**: Если буфер заполняется, продюсер приостанавливает отправку сообщений, пока буфер не освободится
232+
233+
#### Сжатие сообщений
234+
235+
Продюсер может сжимать сообщения для уменьшения объема передаваемых данных
236+
237+
* **compression.type**
238+
* **Описание**: Указывает тип сжатия для сообщений
239+
* **Пример**: `compression.type: gzip` (варианты: none, gzip, snappy, lz4, zstd)
240+
* **Зачем это нужно**: Сжатие уменьшает объем данных, передаваемых по сети, что может снизить нагрузку на сеть и хранилище,
241+
особенно при больших объемах сообщений. Однако это может потребовать дополнительных ресурсов на сжатие/разжатие
242+
243+
#### Подтверждения (acks)
244+
245+
Настройка определяет, как много брокеров должны подтвердить получение сообщения перед тем, как продюсер будет считать его
246+
успешно отправленным
247+
248+
* **Описание**: Определяет количество подтверждений от брокеров
249+
* **Значения**:
250+
* `0`: Продюсер не ждёт подтверждений (самая быстрая отправка, но высокий риск потери сообщений)
251+
* `1`: Продюсер ждёт подтверждения от лидера партиции
252+
* `all` (или `-1`): Продюсер ждёт подтверждений от всех реплик (наибольшая надежность, но увеличенные задержки)
253+
* **Пример**: `acks: all`
254+
* **Зачем это нужно**: Позволяет выбрать баланс между скоростью и надежностью отправки данных.
255+
256+
#### Дополнительные важные настройки
257+
258+
* **Количество повторных попыток (retries):**
259+
* **Описание**: Определяет, сколько раз продюсер должен попытаться отправить сообщение при неудаче
260+
* **Пример**: `retries: 3`
261+
* **Зачем это нужно**: Если произошёл временный сбой, продюсер может попытаться повторить отправку сообщений, что
262+
увеличивает шанс доставки
263+
* **Идемпотентность продюсера (enable.idempotence):**
264+
* **Описание**: Включение идемпотентного режима, что предотвращает дублирование сообщений при сбоях
265+
* **Пример**: `enable.idempotence: true`
266+
* **Зачем это нужно**: Гарантирует, что каждое сообщение будет доставлено ровно один раз
267+
* **Максимальный размер сообщения (max.request.size):**
268+
* **Описание**: Максимальный размер сообщения, которое продюсер может отправить брокеру
269+
* **Пример**: `max.request.size: 1048576` (1 MB)
270+
* **Зачем это нужно**: Ограничивает размер сообщений, которые могут быть отправлены, чтобы избежать перегрузки сети и брокеров.
271+
* **Таймаут ожидания подтверждений (request.timeout.ms):**
272+
* **Описание**: Максимальное время ожидания подтверждения от брокера
273+
* **Пример**: `request.timeout.ms: 30000` (30 секунд)
274+
* **Зачем это нужно**: Помогает избежать бесконечного ожидания ответа от брокера в случае его сбоя

0 commit comments

Comments
 (0)