|
4 | 4 | * [Что такое Apache Kafka?](#что-такое-apache-kafka) |
5 | 5 | * [Основные компоненты Kafka](#основные-компоненты-kafka) |
6 | 6 | * [Архитектура топика](#архитектура-топика) |
| 7 | +* [Архитектура брокера](#архитектура-брокера) |
| 8 | +* [Архитектура продюсера](#архитектура-продюсера) |
7 | 9 |
|
8 | 10 | ## Что такое Apache Kafka? |
9 | 11 |
|
|
21 | 23 | ### Когда использовать |
22 | 24 |
|
23 | 25 | * λ-архитектура или k-архитектура |
24 | | -* стриминг больших данных |
25 | | -* много клиентов (producer и consumer) |
26 | | -* требуется кратное масштабирование |
| 26 | +* Стриминг больших данных |
| 27 | +* Много клиентов (producer и consumer) |
| 28 | +* Требуется кратное масштабирование |
27 | 29 |
|
28 | 30 | ### Чего в Kafka нет из коробки |
29 | 31 |
|
30 | | -* это не брокер сообщений |
31 | | -* отложенные сообщения |
| 32 | +* Это не брокер сообщений |
| 33 | +* Отложенные сообщения |
32 | 34 | * DLQ |
33 | 35 | * AMQP / MQTT |
34 | 36 | * TTL на сообщение |
|
61 | 63 | * **retention.ms** - по времени |
62 | 64 | * **Сообщение можно быстро найти по его Offset** — каждому сообщению в партиции присваивается уникальный смещающий индекс (offset), по которому можно легко найти сообщение |
63 | 65 |
|
| 66 | +### Настройки топика Kafka |
64 | 67 |
|
| 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