⛓
Почему 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 не сразу удаляет это сообщение, она ждет пока в рамках одного сегмента устареют все сообщения и разом удаляет весь сегмент.Это в разы быстрее, чем пытаться удалить каждый какие-то отдельные данные из файла.