Почему Apache Kafka такой быстрый?

Опубликовано: 16 Июня, 2021

Apache Kafka - это хорошо известная платформа обработки потоковых данных с открытым исходным кодом, цель которой - предоставить отказоустойчивую платформу с высокой пропускной способностью, малой задержкой и отказоустойчивостью, которая способна обрабатывать ввод данных в реальном времени.

Так что же делает Apache Kafka предпочтительной платформой для обработки данных в реальном времени? Помимо всех других преимуществ, которые предоставляет Kafka, скорость является одним из самых важных. Давайте посмотрим, как Kafka устроен так быстро.

1. Ввод-вывод с малой задержкой: есть два возможных места, которые можно использовать для хранения и кэширования данных: оперативная память (RAM) и диск .

  • Традиционный способ добиться низкой задержки при доставке сообщений - использовать оперативную память. Это предпочтительнее диска, потому что у дисков высокое время поиска, что делает их медленнее.
  • Обратной стороной этого подхода является то, что использование ОЗУ может быть дорогостоящим, когда объем данных, проходящих через вашу систему, составляет от 10 до 500 ГБ в секунду или даже больше.

Таким образом, Kafka полагается на файловую систему для хранения и кэширования сообщений. Хотя он использует подход диска, а не подход RAM, ему все же удается достичь низкой задержки! Вы можете задаться вопросом, как это возможно, учитывая большое время поиска. Давай выясним.

2. Кафка избегает времени поиска : Да! Kafka умело избегает времени поиска, используя концепцию, называемую последовательным вводом-выводом .

  • Он использует структуру данных под названием «журнал», которая представляет собой последовательность записей, упорядоченных по времени, только для добавления. Журнал в основном представляет собой очередь, и он может быть добавлен в конце производителем, а подписчики могут обрабатывать сообщения самостоятельно, поддерживая указатели.
  • Первая опубликованная запись получает смещение 0, вторая - 1 и так далее.
  • Данные потребляются потребителями путем доступа к позиции, указанной смещением. Потребители периодически сохраняют свою позицию в журнале.
  • Это также делает Kafka отказоустойчивой системой, поскольку сохраненные смещения могут использоваться другими потребителями для чтения новых записей в случае сбоя текущего экземпляра потребителя. Этот подход устраняет необходимость поиска на диске, поскольку данные присутствуют последовательно, как показано ниже:

3. Принцип нулевого копирования: наиболее распространенный способ отправки данных по сети требует множественных переключений контекста между режимом ядра и режимом пользователя, что приводит к потреблению полосы пропускания памяти и циклов ЦП. Принцип нулевого копирования направлен на уменьшение этого, требуя от ядра переместить данные непосредственно в ответный сокет, а не перемещать их через приложение. Скорость Kafka значительно повышается за счет реализации принципа нулевого копирования.

4. Оптимальная структура данных: дерево или очередь: дерево кажется предпочтительной структурой данных, когда дело доходит до хранения данных. Большинство современных баз данных используют некоторую форму древовидной структуры данных. Например. MongoDB использует BTree.

  • Kafka, с другой стороны, является не базой данных, а системой обмена сообщениями, и, следовательно, он выполняет больше операций чтения / записи по сравнению с базой данных.
  • Использование для этого дерева может привести к случайному вводу-выводу, что в конечном итоге приведет к поиску диска, что катастрофически с точки зрения производительности.

Таким образом, он использует очередь, поскольку все данные добавляются в конце, а чтение очень простое за счет использования указателей. Эти операции O (1), тем самым подтверждая эффективность структуры данных очереди для Kafka.

5. Горизонтальное масштабирование: Kafka может иметь несколько разделов для одной темы, которые могут быть распределены по тысячам машин. Это позволяет поддерживать высокую пропускную способность и обеспечивать низкую задержку.

6. Сжатие и пакетирование данных: Kafka группирует данные в блоки, что помогает уменьшить количество сетевых вызовов и преобразовать большую часть случайных операций записи в последовательные. Сжатие пакета данных более эффективно, чем сжатие отдельных сообщений.

Следовательно, Kafka сжимает пакет сообщений и отправляет их на сервер, где они записываются в сжатом виде. Они распаковываются при использовании подписчиком. Протоколы сжатия GZIP и Snappy поддерживаются Kafka.