<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0"
  xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
  xmlns:atom="http://www.w3.org/2005/Atom">

<channel>

<title>Slavlotski: заметки с тегом Kafka</title>
<link>https://slavlotski.com/tags/kafka/</link>
<description>Меня зовут Влад и я Data Engineer. В свободное от работы время люблю писать электронную музыку, играть в видеоигры</description>
<author></author>
<language>ru</language>
<generator>Aegea 11.2 (v4116)</generator>

<itunes:subtitle>Меня зовут Влад и я Data Engineer. В свободное от работы время люблю писать электронную музыку, играть в видеоигры</itunes:subtitle>
<itunes:image href="" />
<itunes:explicit></itunes:explicit>

<item>
<title>Apache Kafka</title>
<guid isPermaLink="false">15</guid>
<link>https://slavlotski.com/all/apache-kafka/</link>
<pubDate>Mon, 13 May 2024 21:56:42 +0500</pubDate>
<author></author>
<comments>https://slavlotski.com/all/apache-kafka/</comments>
<description>
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://slavlotski.com/pictures/apache-kafka.png" width="736" height="335" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Источник: &lt;a href="https://nz.pinterest.com/pin/kafka-logo--268456827773589368/?amp_client_id=CLIENT_ID%28_%29&amp;amp_url=https%3A%2F%2Fwww.pinterest.nz%2Famp%2Fpin%2F268456827773589368%2F&amp;mweb_unauth_id=%7B%7Bdefault.session%7D%7D&amp;open_share=t"&gt;pinterest.com&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;b&gt;Message broker&lt;/b&gt; — это тип построения архитектуры, при котором элементы системы «общаются» друг с другом с помощью посредника. Данная архитектура нужна чтобы доставлять сообщения из пункта А в пункт Б, причем мы предполагаем, что эти сообщения бесконечны. Таким образом потоковая передача данных отличается от пакетной  (пакетная рано или поздно завершится, имеет границы и ее можно разделить на эти границы). Message broker’ы активно используются в микросервисной архитектуре, где используется событийно-ориентированный подход. Преимуществами микросервиса над монолитным приложением являются низкая связь сервисов друг с другом, устойчивость приложений к сбоям за счет изоляции поставщиков (producer) и потребителей (consumer).&lt;/p&gt;
&lt;p&gt;Типы Message broker’ов:&lt;br /&gt;
— &lt;b&gt;point-to-point&lt;/b&gt;, брокеры которые работают на принципе доставки сообщения в строгой последовательности в виде очереди, где одна система пишет сообщение по принципу first in/ first out, другая очередь эти сообщения вычитывает. Примеры таких брокеров: ZeroMQ, nanomsg, Java Message service (JMS)&lt;br /&gt;
— &lt;b&gt;publish / subscribe&lt;/b&gt; Есть некий producer, который публикует свои сообщения, есть так называемые потребители (consumer), которые эти сообщения получают именно по подписке. Строгая последовательность доставки сообщений не гарантируется. Системы с таким типом являются более масштабируемыми. Примеры таких брокеров: Celery, ActiveMQ, Apache Kafka, IBM MQ&lt;/p&gt;
&lt;p&gt;В терминалогии потоковых данных событие генерируется 1 раз инициатором, а затем обрабатываются различными потребителями. Инициаторов может быть много, кто передает эти данные, также и потребителей может быть много.&lt;/p&gt;
&lt;p&gt;Назначение Message broker:&lt;br /&gt;
— интеграция систем, написанные на разных языках программирования и протоколах&lt;br /&gt;
— гарантия надежного хранения&lt;br /&gt;
— гарантированная доставка&lt;br /&gt;
— масштабирование (как источников, так и потребителей)&lt;br /&gt;
— преобразование сообщений&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Apache Kafka&lt;/b&gt; — это распределенная и легко масштабируемая система обмена сообщениями, написанная на Java и Scala, с высокой пропускной способностью, которая может в режиме реального времени обрабатывать большие объемы данных.  Kafka появилась из-за необходимости компании LinkedIn эффективно перемещать огромные количества сообщений — до нескольких терабайт в час.&lt;/p&gt;
&lt;p&gt;Верхнеуровнево Kafka состоит из:&lt;br /&gt;
— Broker&lt;br /&gt;
— ZooKeeper или KRaft&lt;br /&gt;
— Consumer&lt;br /&gt;
— Producer&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://slavlotski.com/pictures/apache-kafka-1.png" width="1560" height="870" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Источник: &lt;a href="https://habr.com/ru/companies/sbermarket/articles/738634/"&gt;habr.com&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;b&gt;Broker&lt;/b&gt; — это серверное программное обеспечение с доступом к своему локальному диску, в которое producer’ы записывают данные, а consumer’ы читают данные, Broker эти данные аккумулирует и правильно сохраняет. Apache Kafka кластер состоит из множества Broker’ов, которые объединены в одну сеть.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;ZooKeeper&lt;/b&gt; — это распределенное файловой хранилище необходимое для достижения согласованного состояния и синхронизации Broker’ов. Благодаря ZooKeeper мы можем управлять кластером Kafka, добавлять новых пользователей, создавать топики, задавать им настройки, обнаруживать сбои и восстанавливать работу кластера, хранить конфигурацию и секреты, авторизационные данные и ограничения или Access Control Lists при работе консумеров и продюсеров с брокерами.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Consumer&lt;/b&gt; — это приложение, которое имеет модуль Kafka, с помощью которого оно может прочитать сообщение. Приложение-консумер подписывается на события и получает данные в ответ.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Producer&lt;/b&gt; — это приложение, которое имеет модуль Kafka, с помощью которого оно может записать событие (сообщение) в кластер Kafka. Кластер сохраняет эти события и возвращает подтверждение о записи или acknowledgement.&lt;/p&gt;
&lt;h2&gt;Брокеры&lt;/h2&gt;
&lt;p&gt;Чтобы Broker’ы знали куда нужно отправить сообщение producer’а и какие consumer’ы могут читать эти сообщения существует такое понятие как &lt;b&gt;Topic&lt;/b&gt;&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://slavlotski.com/pictures/apache-kafka-15.png" width="1044" height="433" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Источник: &lt;a href="https://www.lydtechconsulting.com/blog-kafka-message-keys.html"&gt;lydtechconsulting.com&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;b&gt;Topic&lt;/b&gt; — это базовая, основная сущность Apache Kafka, &lt;b&gt;логическое&lt;/b&gt; разделение коллекции связанных сообщений на группы, последовательность событий. Топик удобно представить в виде лога, в который постоянно добавляются новые данные в конец, тем самым не разрушается цепочка старых событий.  Отличие топика Kafka от остальных топиков очередей тем что данные в топике Kafka нельзя удалить используя Consumer или Producer.&lt;/p&gt;
&lt;p&gt;Topic состоит из &lt;b&gt;партиций&lt;/b&gt;, которых может быть одна или несколько. Партиции — это главный механизм масштабирования и отказоустойчивости.  1 партиция — это 1 копия данных. Партиция может находится как на одном брокере, так и на нескольких. Сколько нужно партиций зависит от того насколько много consumer’ов читает топик и насколько часто они читают из этого топика. Если довольно часто, то в идеале для каждого consumer’а иметь свою отдельную партицию.&lt;/p&gt;
&lt;p&gt;Сами партиции физически представлены на дисках в виде &lt;b&gt;сегментов&lt;/b&gt;.  Сегмент — это отдельный файл, хранящийся на диске брокера. Файлы можно создавать, ротировать с одного брокера на другой, удалять согласно настройке устаревания. Число сегментов может варьироваться в зависимости от интенсивности записи и настроек размера сегмента. При превышении размера сегмента создается новый.&lt;/p&gt;
&lt;h2&gt;Хранение данных&lt;/h2&gt;
&lt;p&gt;Семантически и физически сообщения внутри сегмента не могут быть удалены, они иммутабельны. Всё, что мы можем — указать, как долго Kafka-брокер будет хранить события через настройку политики устаревания данных &lt;b&gt;retention policy&lt;/b&gt; и указать &lt;b&gt;cleanup policy&lt;/b&gt;, когда наступает некое событие для очистки данных.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Retention policy&lt;/b&gt; правила, которые позволяют избавляться от устаревших данных на основании времени. При достижении порога данные помечаются на удаление. Существуют следующие опции настройки:&lt;br /&gt;
— по милисекундам &lt;b&gt;log.retention.ms&lt;/b&gt;&lt;br /&gt;
— по минутам &lt;b&gt;log.retention.minutes&lt;/b&gt;&lt;br /&gt;
— по часам &lt;b&gt;log.retention.hours&lt;/b&gt;&lt;br /&gt;
Помимо этого существует size based подход, где оценивается размер сегмента, который может хранить топик:&lt;br /&gt;
— &lt;b&gt;log.segment.bytes&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Cleanup policy&lt;/b&gt; состоит из:&lt;br /&gt;
— Delete (по умолчанию). Помечает на удаление segment при устаревании / превышении размера&lt;br /&gt;
— Compact. Оставляет только последние сообщения для каждого ключа (message key)&lt;br /&gt;
— Delete и Compact. Производится compaction и удаление согласно retention policy&lt;/p&gt;
&lt;h2&gt;Репликация данных&lt;/h2&gt;
&lt;p&gt;Для обеспечения отказоустойчивости и сохранности данных существует механизм репликации между брокерами, который имплементируется на уровне партиций:&lt;br /&gt;
— У каждой партиции есть настраиваемое число реплик&lt;br /&gt;
— Одна из этих реплик называется &lt;b&gt;партицией-лидером&lt;/b&gt;, которая принимает все запросы на запись/чтение данных. Все остальные являются &lt;b&gt;партициями-фолловерами&lt;/b&gt;&lt;br /&gt;
— Записанные данные в партицию лидера автоматически реплицируются фолловерами внутри кластера Kafka. Фолловеры подключаются к лидеру, читают данные и асихронно сохраняют к себе на диск&lt;br /&gt;
— Роли лидеров и фолловеров не статичны. В случае выхода из строя брокера с лидирующими партициями, роль лидера достанется одной из реплик фолловеров, а консумеры и продюсеры получат обновление о необходимости переподключиться к брокерам с новыми лидерами партиций&lt;br /&gt;
— Начиная с версии Kafka 2.4 консумеры могут читать с партиций фолловеров. Это полезно для сокращения задержек при обращении к ближайшему брокеру в одной зоне доступности. Однако, из-за асинхронной работы репликации, взамен вы получаете от фолловеров менее актуальные данные, чем они есть в лидерской партиции&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://slavlotski.com/pictures/apache-kafka-7.png" width="1560" height="1015" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Источник: &lt;a href="https://habr.com/ru/companies/sbermarket/articles/738634/"&gt;habr.com&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h2&gt;Что из себя представляет сообщение Kafka&lt;/h2&gt;
&lt;p&gt;Каждое событие — это пара ключ-значение. Ключ партицирования может быть любой: числовой, строковый, объект или вовсе пустой. Значение тоже может быть любым — числом, строкой или объектом в своей предметной области, который вы можете как-то сериализовать (JSON, Protobuf, …) и хранить. В сообщении продюсер может указать время, либо за него это сделает брокер в момент приёма сообщения. Заголовки выглядят как в HTTP-протоколе — это строковые пары ключ-значение. В них не следует хранить сами данные, но они могут использоваться для передачи метаданных.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://slavlotski.com/pictures/apache-kafka-6.png" width="1560" height="828" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Источник: &lt;a href="https://habr.com/ru/companies/sbermarket/articles/738634/"&gt;habr.com&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h2&gt;Запись данных producer’ом&lt;/h2&gt;
&lt;p&gt;Чтобы producer смог отправить данные в Kafka кластер ему необходимо знать IP адреса всех брокеров и название топика. Перед тем как producer пойдет записывать данные он опросит брокер из своего пула и уточнит какая его партиция является лидером в топике и какое местоположение этой партиции в файловой системе. Запись осуществляется только в партицию-лидер.&lt;/p&gt;
&lt;p&gt;Продюсер определяет стратегию партицирования, она может быть как по &lt;b&gt;ключу сообщения&lt;/b&gt;, &lt;b&gt;по очереди&lt;/b&gt; (round-robin), так и &lt;b&gt;кастомная&lt;/b&gt;, реализованная на стороне продюсера. По ключу сообщения одного и того же идентификатора сохраняются в одну партицию. Примером такого ключа может быть номер карты, ID клиента и т. д. Например, ключ со значением Prod_id_1 всегда будет сохраняться в партицию 0, а со значением Prod_id_2 будет сохраняться в партицию 1, то есть данные не будут распределены по всем имеющимся партициям.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://slavlotski.com/pictures/apache-kafka-4.png" width="500" height="300" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Источник: &lt;a href="https://www.javatpoint.com/apache-kafka-producer"&gt;javapoint&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;При round-robin сообщения попадают в партиции по очереди, такая стратегия хорошо работает когда нужно равномерно распределить сообщения между всеми существующими партициями и очередность не играет роли.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://slavlotski.com/pictures/apache-kafka-3.png" width="500" height="300" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Источник: &lt;a href="https://www.javatpoint.com/apache-kafka-producer"&gt;javapoint&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;b&gt;Семантики доставки сообщений&lt;/b&gt;&lt;br /&gt;
В очередях есть выбор между скоростью доставки и расходами на надежность доставки.&lt;br /&gt;
—  &lt;b&gt;at-most once&lt;/b&gt; — при доставке сообщений устраивают потери сообщений, но не их дубликаты. Это самая слабая гарантия, которую реализуют брокерами очередей&lt;br /&gt;
— &lt;b&gt;at-least once&lt;/b&gt; — не хотим терять сообщения, но нас устраивают дубликаты&lt;br /&gt;
— &lt;b&gt;exactly-once&lt;/b&gt; — хотим доставить одно и только одно сообщение ничего не теряя и ничего не дублируя. Высокая надёжность данной семантики означает большие задержки&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://slavlotski.com/pictures/apache-kafka-8.png" width="1560" height="584" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Источник: &lt;a href="https://habr.com/ru/companies/sbermarket/articles/738634/"&gt;habr.com&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;b&gt;Надежность доставки&lt;/b&gt;&lt;br /&gt;
Надежность доставки продюсером данных в брокер осуществляется с помощью возвращения подтверждения записи данных продюсеру в партиции регулируется параметром &lt;b&gt;acks&lt;/b&gt;.&lt;br /&gt;
— При значении &lt;b&gt;acks=0&lt;/b&gt; продюсер не получает подтверждение от брокера, что запись произошла успешно. Данная политика влечет за собой риски потери данных&lt;br /&gt;
— При значении &lt;b&gt;acks=1&lt;/b&gt; продюсер будет ожидать получения ответа об успешной записи данных от лидера партиции&lt;br /&gt;
— При значении &lt;b&gt;acks=all&lt;/b&gt; продюсер ожидает подтверждения и от лидера партиции, и от фолловеров партиции. Данный вариант является самым надежным и самым трудозатратным, так как требует больше накладных расходов: мало того, чтобы нужно сохранить на диск, так ещё и дождаться, пока фолловеры отреплицируют сообщения и сохранят их к себе на диск. При включенной опции &lt;b&gt;enable.idempotence&lt;/b&gt; сообщениям проставляется PID (идентификатор продюсера) и увеличивающийся sequence number. Таким образом обеспечивается транзакционность и в случае сбоя в сети при попытке доставить сообщение повторно сообщения с одинаковым PID будут отброшены со стороны брокера.&lt;/p&gt;
&lt;h2&gt;Чтение данных consumer’ом&lt;/h2&gt;
&lt;p&gt;Консумеры читают данные синхронно или асинхронно из лидерской партиции — это позволяет достичь консистентности при работе с данными. Информация в партиции читается слева-направо. Консумеров, читающих сообщения из топика, может быть несколько, причем читать они могут с разных позиций партиции, тем самым не мешая друг другу. Также нет какой-то привязки к чтению по времени, в зависимости от задачи консумеры могут читать спустя дни, недели, месяцы или несколько раз через какое-то время. Сама Kafka (в данном случае брокер) не следит за тем какое сообщение будет читать consumer и когда ему приходить за этими сообщениями. Consumerы сами должны ходить в Kafka и читать оттуда сообщения, сами должны говорить Kafka какие сообщения им выдать&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://slavlotski.com/pictures/apache-kafka-5.png" width="1560" height="592" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Источник: &lt;a href="https://habr.com/ru/companies/sbermarket/articles/738634/"&gt;habr.com&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;b&gt;Offset&lt;/b&gt; — это позиция сообщения в очереди Kafka. Начальная позиция в сообщении называется &lt;b&gt;log-start offset&lt;/b&gt;. Позиция сообщения, записанного последним — &lt;b&gt;log-end offset&lt;/b&gt;. Позиция консумера сейчас — &lt;b&gt;current offset&lt;/b&gt;.  Расстояние между конечным оффсетом и текущим оффсетом консумера называют лагом — это первое, за чем стоит следить в своих приложениях. Допустимый лаг для каждого приложения свой, это тесно связано с бизнес-логикой и требованиями к работе системы.&lt;/p&gt;
&lt;p&gt;Consumer при чтении умеет запоминать на каком offset он остановился. Сохранение события фиксации позиции сообщения происходит в специальный Kafka топик &lt;b&gt;_consumer_offset&lt;/b&gt;. Под событием фиксации понимается так называемые &lt;b&gt;commits&lt;/b&gt;, их может быть два:&lt;br /&gt;
— &lt;b&gt;auto commit&lt;/b&gt; (по умолчанию). Он вычитывает кол-во offset (батч оффсетов) и потом фиксирует, какое кол-во offsetов он прочитал.&lt;br /&gt;
— &lt;b&gt;user commit&lt;/b&gt;. Можно организовать свою логику фиксирования коммитов, например, прочитал 1 offset, зафиксировал коммит. Минус такого подхода — снижение производительности&lt;/p&gt;
&lt;p&gt;Как обеспечивается то, что консумеры читают разные данные, разные партиции, а не одни и теже:&lt;br /&gt;
— Для этого есть такое понятие как &lt;b&gt;консумер группы (consumer groups)&lt;/b&gt; — это множество консумеров объединившихся в один кластер.&lt;br /&gt;
— Каждый консумер в группе будет читать разные сообщения. Каждый консумер пойдет в свою партицию и будет читать именно ее. Читать будет с того места где он остановился прошлый раз&lt;br /&gt;
— Kafka сохраняет на своей стороне текущий оффсет по каждой партиции топиков, которые входят в состав консумер-группы. Консумер в группе, после обработки прочитанных сообщений отправляет запрос на сохранение оффсета — или коммитит свой оффсет&lt;br /&gt;
— Распределение партиций между консумерами в пределах одной группы выполняется автоматически на стороне брокеров. Kafka старается честно распределять партиции между консумер-группами, насколько это возможно.&lt;br /&gt;
— Консумер группы создаются для решения разных кейсов. То есть данные могут быть одни и те же, но пользователи и задачи решаемые этими пользователями будут разные. Например, один консумер использует логи авторизаций пользователей для нужд администраторов, а другая консумер группа в виде маркетологов нужно смотреть кол-во авторизовавшихся пользователей на странице.&lt;br /&gt;
— Каждая такая группа имеет свой идентификатор, что позволяет регистрироваться на брокерах Kafka. Пространство имён консумер-групп глобально, а значит их имена в кластере Kafka уникальны.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://slavlotski.com/pictures/apache-kafka-9.png" width="1560" height="577" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Источник: &lt;a href="https://habr.com/ru/companies/sbermarket/articles/738634/"&gt;habr.com&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;b&gt;Ребалансировка консумер-групп&lt;/b&gt;&lt;br /&gt;
При добавлении новых потребителей топика происходит ребалансировка консумер-группы. Процесс ребалансировки заставляет все консумеры прекратить чтение и дождаться полной синхронизации участников, чтобы обрести новые партиции для чтения. Как только группа стала стабильной, а её участники получили партиции, консумеры в ней начинают чтение. Поскольку группа новая и раньше не существовала, то консумер выбирает позицию чтения оффсета: с самого начала earliest или же с конца latest. Топик мог существовать несколько месяцев, а консумер появился совсем недавно. В таком случае важно решить: читать ли все сообщения или же достаточно читать с конца самые последние, пропустив историю. Выбор между двумя опциями зависит от бизнес-логики протекающих внутри топика событий.&lt;/p&gt;
&lt;p&gt;Для того чтобы понимать какие из участников группы активны и работают, а какие уже нет, каждый консумер группы в равные промежутки времени отправляет &lt;b&gt;Heartbeat-сообщение&lt;/b&gt;. Временное значение настраивается программой-консумером перед запуском. Также консумер объявляет &lt;b&gt;время жизни сессии&lt;/b&gt; — если за это время он не смог отправить ни одно из Heartbeat-сообщений брокеру, то покидает группу. Брокер, в свою очередь, не получив ни одно из Heartbeat-сообщений консумеров, запускает процесс ребалансировки консумеров в группе.&lt;/p&gt;
&lt;p&gt;Процесс ребалансировки проходит достаточно болезненно для больших консумер-групп с множеством топиков. Поэтому разработчикам программ-консумеров обычно рекомендуют использовать по одной консумер-группе на топик. Также полезно держать число потребителей не слишком большим, чтобы не запускать ребалансировку много раз, но и не слишком маленьким, чтобы сохранять производительность и надёжность при чтении. Значения интервала Heartbeat и время жизни сессии следует устанавливать так, чтобы Heartbeat-интервал был в три-четыре раза меньше session timeout. Сами значения нужно выбирать не слишком большими, чтобы не увеличивать время до обнаружения «выпавшего» консумера из группы, но и не слишком маленьким, чтобы в случае малейших сетевых проблем, группа не уходила в ребалансировку.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://slavlotski.com/pictures/a52b72b1495d94797ab6f8642a09219f.gif" width="800" height="477" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Источник: &lt;a href="https://habr.com/ru/companies/sbermarket/articles/738634/"&gt;habr.com&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Ещё один гипотетический сценарий: партиций в топике 4, а консумеров в группе 5. В этом случае группа будет стабилизирована, однако участники, которым не достанется ни одна из партиций, будут бездействовать. Такое происходит потому, что с одной партицией в группе может работать только один консумер, а два и более консумеров не могут читать из одной партиции в группе. Отсюда возникает следующая базовая рекомендация: устанавливайте достаточное число партиций на старте, чтобы вы могли горизонтально масштабировать ваше приложение.&lt;/p&gt;
&lt;h2&gt;Бонус:&lt;/h2&gt;
&lt;p&gt;Неплохой ролик о том какие проблемы решает Kafka, какие его преимущества в сравнении с другими брокерами сообщений и многое другое. В ролике отличная анимация и демонстрация работы основных компонентов Kafka&lt;/p&gt;
&lt;div class="e2-text-video"&gt;
&lt;iframe src="https://www.youtube.com/embed/hbseyn-CfXY?enablejsapi=1" allow="autoplay" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;
</description>
</item>


</channel>
</rss>