Вот что делает Apache Kafka столь быстрым

1656657730 vot chto delaet apache kafka stol bystrym

от Kartik Khare

u8GxQv4ndyG-qVyXgfD18hkDdqKi7rKI0ymG
BigData Автор Camelia.boban (Собственная работа)[CCBY-SA30(черезWikimediaCommons)[CCBY-SA30(viaWikimediaCommons[CCBY-SA30(черезWikimediaCommons[CCBY-SA30(viaWikimediaCommons

Что такое Apache Kafka?

Apache Kafka – это распределенная потоковая платформа, которая позволяет:

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

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

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

Низкая задержка ввода-вывода = файловая система?

Большинство традиционных систем обработки данных используют память с произвольным доступом (RAM) как хранилище данных, поскольку RAM обеспечивает очень низкие задержки.

Несмотря на то, что такой подход делает их быстрыми, стоимость оперативной памяти значительно выше диска. Такие системы обычно более дорогие в эксплуатации, когда через систему проходят данные со скоростью 100 GBPS.

Kafka полагается на файловую систему для хранения и кэширования. Проблема в том, что диски работают медленнее оперативной памяти. Это объясняется тем, что время поиска на диске велико по сравнению с временем, необходимым для фактического чтения данных.

Но если вы можете избежать поиска, то в некоторых случаях вы можете добиться задержек, таких же низких, как RAM. Это сделано Кафкой через Последовательный ввод/вывод.

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

Это гораздо лучше, чем поддерживать кэш в JVM. Это объясняется тем, что объекты JVM являются «тяжелыми» и могут привести к большому уборке мусора, который ухудшается с увеличением размера данных.

Не используйте деревья

Большинство современных баз данных используют ту или иную форму древовидной структуры для постоянного хранения данных. К примеру, MongoDB использует BTree, тогда как Cassandra использует дерево LSM.

Эти структуры обеспечивают производительность поиска O(log N).

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

Очередь является гораздо лучшей структурой данных для системы обмена сообщениями. В большинстве случаев данные добавляются в систему, а считывание просто. Все такие операции представляют собой O(1) — это гораздо эффективнее.

Не копируйте!

Одним из основных недостатков систем обработки данных является сериализация и десериализация (преобразования в форматы, пригодные для хранения и передачи) данных во время передачи.

Это можно сделать быстрее, используя лучшие двоичные форматы данных, например буферы протоколов или плоские буферы вместо JSON.

Но как вообще избежать сериализации/десериализации?

Кафка рассматривает это двумя способами:

  1. Используйте стандартизированный двоичный формат данных для производителей, брокеров и потребителей (чтобы данные можно было передавать без изменений)
  2. Не копируйте данные в программе («нулевое копирование»)

Первый из них объясняется сам собой. Это второй, требующий внимания.

Обычная передача данных из файла в сокет может происходить следующим образом:

  1. ОС считывает данные с диска в кэш страниц в пространстве ядра
  2. Программа считывает данные из пространства ядра в буфер пользовательского пространства
  3. Программа записывает данные обратно в пространство ядра в буфер сокета
  4. ОС копирует данные из буфера сокета в буфер сетевого адаптера, откуда они посылаются по сети.

Однако, если мы имеем тот же стандартизированный формат для данных, не требующих модификации, тогда нам не нужно делать шаг 2 (копировать данные из пространства ядра в пользовательское пространство).

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

Детальнее о подходе без копирования можно найти в этой статье.

Что еще?

Кафка использует многие другие методы, кроме упомянутых выше, чтобы сделать системы гораздо более быстрыми и эффективными:

  1. Пакетирование данных для уменьшения сетевых вызовов, а также преобразование большого количества случайных записей в последовательные.
  2. Сжатие пакетов (а не отдельных сообщений) с помощью кодеков LZ4, SNAPPY или GZIP. Значительная часть данных согласована между сообщениями в пакете (например, поля сообщений и метаданные). Это может привести к наилучшим коэффициентам сжатия.

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

Важно отметить, что все вышеперечисленные методы можно применять в большинстве систем для достижения низких задержек. Они не включают вмешательство в ядро, настройку сбора мусора, использование родных программ или использование экстремальных структур данных.

Однако одним недостатком является то, что некоторые из этих методов специфичны для случаев, подобных платформе обмена сообщениями. Они не подходят для более общей распределенной базы данных.

Если вам интересно больше подобных дизайнов или если у вас есть такая возможность, свяжитесь со мной на LinkedIn или Facebook или отправьте письмо на kharekartik@gmail.com

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *