Технический пост: состояние гонки
Пару дней назад (во время новогодних каникул) случилось падение баз данных. "Неожиданно" на дублирующих серверах закончилось место. Главный сервер с БД не пострадал, так как был заранее расширен под подобную ситуацию, но возросшая нагрузка на него привела к незапланированному ребуту.
ГолдВойс "встал" в обоих ситуациях. Он застрял в состоянии гонки и поднялся одновременно.
Это стандартная ситуация с проблемами масштабирования высоко-нагруженных проектов. Стандартные базы данных не выдерживают нагрузки по записи, выборкам и прочим прелестям. Точнее "выдерживают", но с парой деталей. Проект выдержит теоретически рост нагрузки раз в 10-100. Но не в рамках блокчейн-цепи.
В блокчейн цепях существует проблема одно-поточности обработки блоков. Она предварительно решена содержанием всей базы данных (блоков и структур данных) — в специализированных решениях, которые хранят все это добро в оперативной памяти. Стандартные базы данных, работающие на файлах и использующие разные прослойки с подтверждением транзакций проигрывают по скорости работы с данными. Что с нами и случилось.
Блоки приходят каждые 3 секунды. А обработка блока занимает 3.3-3.9 секунды. Не будем же ругать рост количества транзакций в блоках, рост активности в блокчейне. Проблема в архитектуре и она была очевидна с самого начала.
Поэтому несколько ночей подряд мы решали проблему с состоянием гонки. Блоки догнали, вынесли часть действий в очередь обработки (об этом будет другой пост), проблема и решена, и осталась одновременно с этим.
Решена она увеличением серверных мощностей, вынесением очереди медленных не приоритетных действий (в redis) и изменение части архитектурных решений.
Только теперь мы имеем проблему с состоянием гонки для очередей. Они наполняются быстрее, чем успевают выполняться. Решения есть, и, безусловно, их несколько. Но на их внедрение нужно время.
ГолдВойс какое-то время поштормит, но в итоге — все будет отлично :)