Для high load исключена работа с БД, все держится в памяти.
На бинансе(это самая крупная криптобиржа) происходят десятки сделок в секунду, для серверов баз данных, это вообще не проблема (хоть 10 тысяч в секунду)... Поэтому в памяти держать базу данных не имеет смысла.
Ну и на небольших криптобиржах, если происходит одна сделка в минуту, то это уже не так плохо, а на маленьких биржах, одна сделка может быть в несколько часов или даже дней.
Не могу полностью согласиться.
В памяти не держится БД. Есть криптовалютное ядро, которое написано на C#, оно весьма упрощенно содержит следующую информацию в памяти:
1. Список торговых счетов в разрезе каждого пользователя и каждый счет содержит информацию о текущем балансе свободных средств, сумме заблокированных средств под ордера и размере комиссии
2. Список валютных пар и в разрезе каждой пары содержится информация о текущих (активных) ордерах в стакане на продажу и на покупку
Торговое ядро не держит в памяти информацию о сделках, оно только производит мэтчинг ордеров в текущем стакане и если есть условие для совершения сделки, то производятся манипуляции с балансами и ордерами. А информация о сделке поступает в систему уведомлений, которая в сою очередь и заносит информацию в БД PostgreSQL. Таким образом, у нас память не нагружается лишней информацией.
Теперь по поводу производительности БД. Помимо вставки информации о сделках, в БД есть список пользователей, их текущие настройки, список валют, список торговых пар, список как текущих ордеров, так и исполненных, список как внешних счетов, так и торговых счетов, системные счета, данные для графиков OHLC и многое другое. И кроме вставки данных производится множество запросов к БД, часть из них, естественно кэшируется, но тем не менее. Поэтому говорить о том, что вставка 10 тысяч сделок в секунду не проблема это не верно.
Посмотрим на криптовалютную биржу Binance, которая согласно coinmarketcap имеет суточный объем в два миллиарда долларов (2 000 000 000 $). На каждой бирже есть минимальный объем ордера и примерно равен 1$. Средний объем ордера можно принять за 10$. Таким образом, если равномерно за 24 часа распределить скорость генерации сделок, то получиться что биржа binance генерирует (2 000 000 000 $/10 $/ 24 часа/ 60 минут/ 60 секунд = 2314 сделок в секунду)
2314 сделок в секунду вполне приемлемое время для серверов на ssd дисках, особенно в raid массиве.
Что касается других бирж, соглашусь, что на многих сделки совершаются не так часто.
Теперь немного о тестах производительности торгового ядра:
Для нагрузочного тестирования были созданы следующие предварительные условия:
• Был выставлен ордер на продажу 1000 BTC по цене 1000 EUR
• Затем под этот специально заготовленный ордер была отослана команда PlaceLimitStressTest (ее нет в реальности, она была добавлена только на время теста), где в цикле из 500 000 итераций выполнялась команда PlaceLimit (размещение встречного ордера на покупку 0.001 BTC по цене 1000 EUR). Сформировалось 500 000 сообщений (Сообщение о новой сделке (NewTrade)), в котором указывается время формирования сообщения в тиках.
• Данные о сделках не писались в БД
В результате проведенного теста на следующей конфигурации ПК:
• Процессор: Intel Core i7-4770 CPU @ 3.40 GHz
• RAM: 8Гб
• ОС: Windows 7 64x
• HDD: Seagate Barracuda ST500DM002
o Объем кэш-памяти 16MБ
o Скорость вращения шпинделя 7200rpm
o Максимальная скорость интерфейса 600 МБ/с
o Буферизированная скорость чтения 202 МБ/с
o Средняя скорость чтения 125 МБ/с
Результаты следующие:
• Время формирования 1-ой сделки (timestamp): 1523970522.36384 сек
• Время формирования 500 000-ой сделки (timestamp): 1523970531.14784 сек
• Итого: 500 000 сделок за 9 сек
В данной архитектуре не особо важно, когда мы запишем информацию о сделках в БД, через доли секунд, через секунду или минуту, поскольку вся информация о стакане содержится в оперативной памяти криптовалютного ядра. Система не позволит выставить “плохой” ордер.