⛓
Почему Kafka такая быстрая ⛓
Статья на medium
Тут 2 поинта (и бонус), которые применимы ко многим кейсам:
1.
Sequential I/O (Последовательный ввод / вывод) – если мы читаем и пишем в файлы (особенно, на HDD) в разных местах – это долго (100Kb/s), но если мы только добавляем записи в конец (append) и читаем записи с определенной точки и последовательно вперед, то эти операции по скорости не уступают чтению и записи из памяти (100Mb/s).
Kafka использует append-only log, где каждая новая запись добавляется в конец, а читаем мы с определенной точки файла (offset) и до конца.
2.
Zero copy read (чтение без копирования) – мы хотим начать отправлять клиенту данные из файлов хранилища с определенного места. Для этого, в стандарте, мы получаем запрашиваем данные с диска в приложение (1 копия идет в OS Buffer, 2-я из OS Buffer в наше прилодение), далее мы отправляем в Socker (3-я копия), а Socket уже в NIC Buffer (4-я копия), который уже отправляет данные получателю.
При Zero copy read мы используем системный вызов sendfile, в котором указываем какой файл и откуда читать, и указываем куда его читать, благодаря чему файл записывается в OS Buffer и оттуда сразу попадает в NIC Biffer. При этом при всем даже не задействуется CPU.
III. Бонус
В этом видео не сказали еще один хак, который использует Kafka:
Все данные, которые идут через Kafka, сохраняются в отдельных файлах, называемых "сегмент". Когда сегмент достигает заданного лимита (дефолтно 1Gb) Kafka создает следующий сегмент.
У Kafka есть возможность указать время жизни сообщения (через сколько его надо удалить), так вот, Kafka не сразу удаляет это сообщение, она ждет пока в рамках одного сегмента устареют все сообщения и разом удаляет весь сегмент.
Это в разы быстрее, чем пытаться удалить каждый какие-то отдельные данные из файла.