tgoop.com/cxx95/36
Create:
Last Update:
Last Update:
#madskillz и #video
Успех применения идиомы Read-Copy-Update в C++
В видео За полгода - C++ Погода разработчик Яндекс.Погоды Дмитрий Старков рассказывает о переезде погодных микросервисов на C++ 🌤
До переезда Погода разрабатывалась на Node.JS + Memcached и отвечала за 300мс в 99 перцентиле. Это было медленно даже с кэшем, а после улучшения погодных предсказаний кэш стал сильно разъезжаться с реальными данными 👎🏻
Чтобы ускориться и улучшить утилизацию CPU, решили переписать на C++.
Для быстроты данные держатся in-memory, не в СУБД.
В памяти программа держит погодное состояние, которое регулярно читается (по GET-запросам от пользователей) и обновляется (по POST-запросам от поставщиков данных).
Обычный подход - shared_ptr:
std::shared_ptr<State> state;И использование
std::mutex
с std::lock_guard
для безопасного чтения/записи.Более быстрый подход - использование
std::shared_mutex
и std::shared_lock
(для читателей) и std::unique_lock
(для писателей)Однако такой подход все равно был недостаточно быстрым (в видео есть графики со "спайками"). Поэтому применили lock-free идиому Read-Copy-Update. Состояние живет тут:
std::atomic<std::shared_ptr<State>> state;И читатель атомарно копирует объект, лежащий внутри
std::atomic
, прежде чем как-то с ним работать. Писатель также атомарно изменяет объект.В видео есть описание работающей хитрой схемы, я пересмотрел часть с кодом несколько раз, чтобы полностью понять его.
Переписывание обернулось успехом - при возросшем (за время переписывания) в 1.5 раза RPS Погода отказалась от рассинхронизирующих кэшей и стала отвечать за 30мс на 99 перцентиле! ⏱
BY C++95
Share with your friend now:
tgoop.com/cxx95/36