Сфера финансовых приложений и трейдинга выдвигает особые требования к системам обработки данных: ультракороткие задержки, конкурентные обновления (в т.ч. из разных процессов), репликация высокочастотных обновлений.
Существовавшие открытые key-value хранилища не справлялись, поэтому мы сделали свое — Chronicle Map.
В докладе я отвечу на вопросы:
+ Почему бывает эффективнее разбить систему, работающую с общим состоянием, на несколько отдельных процессов?
+ Зачем вам может захотеться распилить JVM на несколько частей?
+ Как добиться от key-value хранилища медианной latency меньше 1 микросекунды?
+ Как сделать репликацию, если она упирается в пропускную способность сети из-за слишком частых обновлений?
Развею миф о том, что Java — это медленно :)
Также, в докладе будет сравнение Chronicle Map с redis, one-nio и ConcurrentHashMap.
44. Репликация: боль
Сеть не тянет частые
обновления
⇒ Очередь переполняется
⇒ Надо делать сжатие
• Сложно
• Задержки
45. Репликация без логов
Записи помечаются на
репликацию в bit maps
Потребление памяти
не меняется
Но: только асинхронная,
eventually consistent
репликация
46. Кратко
По процессу на сокет
Аffinity, приоритеты
syscalls, JNI
Context switches
IPC через shared memory
Меньше памяти
Доклад не маркетинговый, а технический, инженерный
Не сколько про ChMap, сколько в целом про эффективную архитектуру в памяти в рамках одного сервера
Про репликацию чуть, в контексте сервера
Менее хардкорный, чем Осипова и Крижиновского, концепции
Обычные durable базы, особенно sql – параллельная вселенная
Если вы не трейдеры
На этой конференции уже Numa не упоминал только ленивый
Красивая картинка
Память поделена между сокетами,
Разгрести логику по разным сокетам, или numa aware sharding, о чем рассказывал Александр Крижановский
Кто знает что значит Oops?
System jitter
Peter Lawrey, Gil Tene, чувак из Lmax exchange на strangeloop
E-commence, соцсети чтение/запись 90/10
К этому месту вы должны заметить подвох
Старая еврейская мудрость
Мы обсудили какие требования стоят, какие требования НЕ стоят, то тоже важно, теперь поговорим о том КАК эти требования достигаются
Держим в уме 1мкс
2 прерывания: туда обратно
2 загрузки дескриптора сегмента: туда обратно
2 переключения стека
Положить запрос в сокет из клиента, забрать на стороне сервера, положить ответ, забрать ответ
Амортизировать между несколькими запросами нельзя, потому что это еще больше увеличивает задержки
Обычный редис c обычным драйвером на java – смело 6 копирований
Сладкая парочка
Кто за JNI, кто за unsafe
Если что-то называется unsafe, разумеется его и надо использовать
Нет возможности встроить какую-то логику на java на стороне базы. Допустим, хотим взять какое-то значение по ключу, если оно уже есть в базе, или сгенерировать новое, положить в базу и вернуть. C JNI надо делать либо два отдельных обращения к базе, либо выражать логику на Си а не java
Нет сигналирования, надо «засыпать» с backoff
Не освобождается при смерти потока, надо очищать вручную
Daniel Shaya
Поток не успеет заснуть, когда блокирующий запрос закончится и он уже мог бы продолжить работу
One-nio это key-value хранилище которое написал Андрей Пангин из компании Одноклассники, очень близко по принципам к chronicle map, только другой алгоритм
Звездочки значат, что я срезал с chronicle map и one-nio слои абстракций, которые не важны в этом тесте
К сожалению на chronicle map нарос небольшой слой абстракций, который имеет константную цену
По структурам данных и принципам все честно
Каждый столбик – это кол-во заявок по какому-то инструменту
Распределены так, что есть какие-то популярные инструменты, и длинный тяжелый хвост
Вижу Новая хитроумная структура данных – смотрю на потребление памяти
Самая важная характеристика
Даже если бы редис можно было напрямую сравнить in-process системами, а его нельзя, потому что во первых он однопоточный, во вторых out-of-process, видно что он работал бы медленее