Kafka обеспечивает доставку сообщений с малой задержкой благодаря последовательному вводу-выводу и принципу нулевого копирования. Те же методы обычно используются во многих других платформах обмена сообщениями/потоковой передачи.
Рассмотрим, как данные передаются между поставщиком (Producer) и потребителем (Consumer) и что означает нулевое копирование (zero copy).
Шаги 1.1–1.3: Поставщик записывает данные на диск.
Шаг 2: Потребитель читает данные без нулевого копирования:
2.1 Данные загружаются с диска в кэш операционной системы (ОС);
2.2 Данные копируются из кэша ОС в приложение Kafka;
2.3 Приложение Kafkaкопирует данные в буфер сокета;
2.4 Данные копируются из буфера сокета на сетевую карту;
2.5 Сетевая карта отправляет данные потребителю.
Шаг 3: Потребитель считывает данные с нулевым копированием:
3.1 Данные загружаются с диска в кэш ОС;
3.2 Кэш ОС напрямую копирует данные на сетевую карту с помощью команды sendfile();
3.3 Сетевая карта отправляет данные потребителю.
Оптимизация нулевой копии заключается в удалении нескольких этапов копирования данных, в результате чего данные передаются непосредственно из буфера чтения в буфер сокета, либо если сетевая карта поддерживает операции сбора, в буфер сокета записываются только дескрипторы с информацией о местоположении и длине данных. Данные передаются непосредственно из буфера чтения в сетевую карту.
Такой подход сокращает время копирования примерно на 65%.