Apache Kafka — это распределенное хранилище данных, предназначенное для ввода и обработки потоковых данных в режиме реального времени. Потоковые данные — это информация, которая непрерывно генерируется тысячами источников данных, все из которых одновременно передают записи данных. Потоковая платформа должна справляться с постоянным притоком данных и обрабатывать их последовательно и постепенно.
Что такое многопоточность и зачем она нам нужна?
Способность центрального процессора (ЦП) (или одного ядра в многоядерном процессоре) одновременно обеспечивать множество потоков выполнения, поддерживаемых операционной системой, называется многопоточностью. Многопоточность может использоваться для повышения скорости работы приложения в тех случаях, когда работа может быть разбита на более мелкие блоки, которые могут работать параллельно без ущерба для согласованности данных. Kafka позволяет расширять вашу распределенную систему с помощью разделов, которые представляют собой упорядоченные подмножества сообщений в теме.
Недавно была замечена тенденция, когда разработчики вместо того, чтобы гарантировать, что вычисления могут эффективно обрабатывать данные из одного раздела, выбирают простой путь расширения разделов/VM для получения необходимой пропускной способности. Это равносильно бросанию денег на решение проблемы.
Темы Kafka делят записи на более мелкие части, называемые разделами, которые можно обрабатывать по отдельности без ущерба для точности результатов, закладывая основу для параллельной обработки. Это обычно достигается путем масштабирования, которое включает в себя использование множества потребителей в одной группе, каждый из которых обрабатывает данные из подмножества тематических разделов и работает в одном потоке.
Поскольку чтение и обработка сообщений в одном потоке достаточны для большинства Варианты использования Кафкиапачи Кафка потребитель парадигма потоков широко используется. Цикл опроса работает гладко, когда обработка не требует операций ввода-вывода.
Потребители Кафки
Потребители, которые покупают Kafka, обычно делают это как часть группы. Когда многие потребители подписываются на тему и являются членами одной и той же группы потребителей, каждый потребитель получает сообщения из подмножества разделов субъекта.
Добавление дополнительных потребителей в группу потребителей — наиболее распространенный метод масштабирования потребления данных из темы Kafka. Потребители Kafka часто выполняют действия с высокой задержкой, такие как запись в базу данных или выполнение трудоемких вычислений с данными. Когда один потребитель не может справиться со скоростью, с которой данные передаются в тему, мы масштабируем, добавляя больше потребителей, которые разделяют нагрузку, за счет того, что каждый потребитель владеет только подмножеством разделов и сообщений.
Преимущества многопоточности
Многопоточность позволяет выполнять несколько частей программы одновременно. Потоки — это легковесные процессы, доступные внутри процесса. Многопоточность позволяет многозадачности максимально использовать ресурсы ЦП.
Ниже приведены некоторые преимущества многопоточного программирования:
Совместное использование ресурсов
Ресурсы процесса, включая память, данные и файлы, совместно используются всеми потоками. Используя совместное использование ресурсов, одна программа может иметь несколько потоков в одном и том же адресном пространстве.
Ответная реакция
Отзывчивость программы позволяет программе продолжать работу, даже если ее часть остановлена из-за многопоточности. Если процесс выполняет длительную операцию, это также можно сделать.
Многопроцессорная архитектура
Многопоточность позволяет каждому потоку в многопроцессорной архитектуре параллельно работать на другом процессоре. Это улучшает параллелизм системы. В однопроцессорной системе одновременно может выполняться только один процесс или поток.
Что такое поток для потребительской модели
Каждый поток создается и подключается к брокеру Kafka в потоке для каждой потребительской модели. Разделы, чьи сообщения будут отправляться в эти потоки, назначаются брокером kafka.
Один поток подключается к Kafka в многопоточном потребительском режиме и может получать данные из нескольких / отдельных разделов. Как только данные были предоставлены потоку, поток может распределить сообщения по другим пулам потоков для параллельной обработки. В этом методе поток-потребитель определяет, какой дочерний поток будет обрабатывать какие типы сообщений. Однако в этом случае управление офсетом становится крайне затруднительным.
Spring может легко сгенерировать несколько потоков для подключения к Kafka. Давайте посмотрим, как они ведут себя по-разному. У нас есть одна тестовая тема с десятью разделами и одной виртуальной машиной, на которой запущено одно параллельное приложение Spring.
Поток на потребительскую модель
/**
* Consumer configuration for email topics
*
* @return
*/
@Bean
public ConsumerFactory<String, String> consumerFactory()
{
Map<String, Object> props = new HashMap<>();
Map<String, Object> props = new HashMap<>();
props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
props.put(ConsumerConfig.GROUP_ID_CONFIG, EMAIL_STATUS_CONSUMER_GROUP);
props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG,
StringDeserializer.class);
props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG,
StringDeserializer.class);
return new DefaultKafkaConsumerFactory<>(props);
}
/**
* Устанавливает Concurrency для прослушивателя kafka
*
* @возвращаться
*/
@Бин
public ConcurrentKafkaListenerContainerFactory
{
ConcurrentKafkaListenerContainerFactory
factory.setConsumerFactory(consumerFactory());
factory.setConcurrency (1);
возврат на заводе;
}
К этому подразделению прислушивается группа потребителей spring-group. Вот как ведет себя одиночный параллелизм:
ГРУППА ТЕМА РАЗДЕЛ CONSUMER-ID HOST CLIENT-ID
тестовая тема весенней группы 8 потребитель-1-01a5779b-940b-44cf-b8c6-2e414aa38eb1 /172.22.0.1 потребитель-1
тестовая тема весенней группы 2 потребитель-1-01a5779b-940b-44cf-b8c6-2e414aa38eb1 /172.22.0.1 потребитель-1
тестовая тема весенней группы 1 потребитель-1-01a5779b-940b-44cf-b8c6-2e414aa38eb1 /172.22.0.1 потребитель-1
тестовая тема весенней группы 4 потребитель-1-01a5779b-940b-44cf-b8c6-2e414aa38eb1 /172.22.0.1 потребитель-1
тестовая тема весенней группы 5 потребитель-1-01a5779b-940b-44cf-b8c6-2e414aa38eb1 /172.22.0.1 потребитель-1
тестовая тема весенней группы 6 потребитель-1-01a5779b-940b-44cf-b8c6-2e414aa38eb1 /172.22.0.1 потребитель-1
тестовая тема весенней группы 3 потребитель-1-01a5779b-940b-44cf-b8c6-2e414aa38eb1 /172.22.0.1 потребитель-1
тестовая тема весенней группы 7 потребитель-1-01a5779b-940b-44cf-b8c6-2e414aa38eb1 /172.22.0.1 потребитель-1
тестовая тема весенней группы 9 потребитель-1-01a5779b-940b-44cf-b8c6-2e414aa38eb1 /172.22.0.1 потребитель-1
тестовая тема весенней группы 0 потребитель-1-01a5779b-940b-44cf-b8c6-2e414aa38eb1 /172.22.0.1 потребитель-1
Если вы внимательно посмотрите на приведенный выше вывод, вы заметите, что идентификатор потребителя приложения одинаков для всех 10 разделов, что указывает на то, что их всех соединяет один поток.
Давайте посмотрим, что происходит, когда параллелизм увеличивается до 2,
ГРУППА ТЕМА РАЗДЕЛ CONSUMER-ID HOST CLIENT-ID
тестовая тема весенней группы 8 потребитель-2-8ab0213d-683c-4f92-b3c8-767701905994 /172.22.0.1 потребитель-2
тестовая тема весенней группы 5 потребитель-2-8ab0213d-683c-4f92-b3c8-767701905994 /172.22.0.1 потребитель-2
тестовая тема весенней группы 6 потребитель-2-8ab0213d-683c-4f92-b3c8-767701905994 /172.22.0.1 потребитель-2
тестовая тема весенней группы 7 потребитель-2-8ab0213d-683c-4f92-b3c8-767701905994 /172.22.0.1 потребитель-2
тестовая тема весенней группы 9 потребитель-2-8ab0213d-683c-4f92-b3c8-767701905994 /172.22.0.1 потребитель-2
тестовая тема весенней группы 4 потребитель-1-886f1a6e-f316-4e17-90d2-599a582682e4 /172.22.0.1 потребитель-1
тестовая тема весенней группы 2 потребитель-1-886f1a6e-f316-4e17-90d2-599a582682e4 /172.22.0.1 потребитель-1
тестовая тема весенней группы 3 потребитель-1-886f1a6e-f316-4e17-90d2-599a582682e4 /172.22.0.1 потребитель-1
тестовая тема весенней группы 1 потребитель-1-886f1a6e-f316-4e17-90d2-599a582682e4 /172.22.0.1 потребитель-1
тестовая тема весенней группы 0 потребитель-1-886f1a6e-f316-4e17-90d2-599a582682e4 /172.22.0.1 потребитель-1
Как вы можете видеть на снимке экрана выше, теперь есть два потока, каждый с пятью разделами.
Kafka попытается равномерно распределить разделы между потоками, принадлежащими к одной и той же группе потребителей. У нас будет выделенный поток для каждого раздела, если мы создадим десять параллельных потоков.
Вывод
В этой статье мы узнаем несколько вещей о многопоточности и изучим модель многопоточности.