Forwarded from Fedkin is thinking
⚡️Cache stampede
Представим, код метода getData() выглядит так
Что произойдет если два потока почти одновременно не найдут данные в кеше? Пойдут загружать из БД
А если 100 потоков?
Понять масштабы можно на таком примере:
- В кеш может поступать до 300 запросов в секунду
- Время загрузки из бд — 2 секунды
И получается, если ключ в кеше протухнет, то за первые две секунды в базу попрутся 600 параллельных тяжелых запросов. Учитывая, что из-за этих запросов БД может деградировать, запросы могут начать выполняться еще дольше
---
Что с этим делать?
1. Локи
В примере выше хорошо бы зашел double-checked locking
Можно конечно сразу лочить, но тогда для подавляющего большинства запросов добавится лишний оверхед. А в случае дабл чека будет лочиться только когда кеш протух
2. Прогрев кеша / фоновые апдейты
Если уверены, что значение скорее всего понадобится, то просто заранее его туда положите и в фоне обновляйте. Если будет всплеск нагрузки, в кеше уже будет все что нужно
3. Вероятностные рефреши
Есть еще техника, когда кеш обновляется с некоторой вероятностью, даже если значение еще не протухло. Это может быть полезно, если полностью прогреть кеш невозможно, но вероятность cache stampede хочется снизить
---
Пишите в комментах, что из этого используете)
Представим, код метода getData() выглядит так
def getData():
dataFromCache = getFromCache()
if dataFromCache:
return dataFromCache
dataFromDb = getFromDb()
updateCache(dataFromDb)
return dataFromDb
Что произойдет если два потока почти одновременно не найдут данные в кеше? Пойдут загружать из БД
А если 100 потоков?
Понять масштабы можно на таком примере:
- В кеш может поступать до 300 запросов в секунду
- Время загрузки из бд — 2 секунды
И получается, если ключ в кеше протухнет, то за первые две секунды в базу попрутся 600 параллельных тяжелых запросов. Учитывая, что из-за этих запросов БД может деградировать, запросы могут начать выполняться еще дольше
---
Что с этим делать?
1. Локи
В примере выше хорошо бы зашел double-checked locking
def getData():
dataFromCache = getFromCache()
if dataFromCache:
return dataFromCache
withLock {
dataFromCache = getFromCache()
if dataFromCache:
return dataFromCache
dataFromDb = getFromDb()
updateCache(dataFromDb)
return dataFromDb
}
Можно конечно сразу лочить, но тогда для подавляющего большинства запросов добавится лишний оверхед. А в случае дабл чека будет лочиться только когда кеш протух
2. Прогрев кеша / фоновые апдейты
Если уверены, что значение скорее всего понадобится, то просто заранее его туда положите и в фоне обновляйте. Если будет всплеск нагрузки, в кеше уже будет все что нужно
3. Вероятностные рефреши
Есть еще техника, когда кеш обновляется с некоторой вероятностью, даже если значение еще не протухло. Это может быть полезно, если полностью прогреть кеш невозможно, но вероятность cache stampede хочется снизить
---
Пишите в комментах, что из этого используете)
15
хочу больше общаться с классными ребятами
в очередной раз прихожу к тому, что человеческий ресурс - это тот самый нескончаемый капитал который у нас есть.
окружение это и есть мы и бла бла.
короч мне нужен именно ты, го общаться :3
flowgarden - комьюнити для классных ребят, и сейфспейс для меня и вас. заходи, го чатица йоу
в очередной раз прихожу к тому, что человеческий ресурс - это тот самый нескончаемый капитал который у нас есть.
окружение это и есть мы и бла бла.
короч мне нужен именно ты, го общаться :3
flowgarden - комьюнити для классных ребят, и сейфспейс для меня и вас. заходи, го чатица йоу
🥰13
первый созвон в flow garden!
йоу ребятки, в эту субботу хочу устроить созвон с вами
пообщаться о планах, работе и вообще о чем угодно
созвон будет проходить в самом чатике, так что подписывайся блин
24.05 20:00 МСК FC DC xd
https://t.me/flowwwgarden
https://t.me/flowwwgarden
https://t.me/flowwwgarden
йоу ребятки, в эту субботу хочу устроить созвон с вами
пообщаться о планах, работе и вообще о чем угодно
созвон будет проходить в самом чатике, так что подписывайся блин
24.05 20:00 МСК FC DC xd
https://t.me/flowwwgarden
https://t.me/flowwwgarden
https://t.me/flowwwgarden
🔥10
АЙТИШНАЯ СВОЯ ИГРА
В эту субботу у нас пройдёт айтишная своя игра на стриме
В гостях у нас будут такие легенды: @go2_it, @tokarev_gregor, @scv3lp
НО ЭТО НЕ ВСЕ! Мы разыгрываем еще один слот на наш ивентик. Просто жми участвовать, а для участия подпишись на @flowwwgarden и @developnya
31 число 19:00
В эту субботу у нас пройдёт айтишная своя игра на стриме
В гостях у нас будут такие легенды: @go2_it, @tokarev_gregor, @scv3lp
НО ЭТО НЕ ВСЕ! Мы разыгрываем еще один слот на наш ивентик. Просто жми участвовать, а для участия подпишись на @flowwwgarden и @developnya
31 число 19:00
❤9🥰3🔥2