39 lines
2.2 KiB
Markdown
39 lines
2.2 KiB
Markdown
|
---
|
|||
|
aliases:
|
|||
|
- thundering herd
|
|||
|
tags:
|
|||
|
- maturity/🌱
|
|||
|
date:
|
|||
|
- - 2024-06-18
|
|||
|
zero-link:
|
|||
|
- "[[../../../meta/zero/00 HighLoad|00 HighLoad]]"
|
|||
|
parents:
|
|||
|
- "[[../Кэширование|Кэширование]]"
|
|||
|
linked:
|
|||
|
---
|
|||
|
Представим, что у нас 3 реплики сервиса, которые выполняют какие-то вычисления раз в 30 секунд, а в вычислениях используется кэшированные значения. При [[Инвалидация кэша|инвалидации кэша]] может сложиться ситуация при которой все 3 реплики начнут наперегонки обновлять значение в кэше. Это приводит как минимум к лишней нагрузке на базу данных, а как максимум к отказу в обслуживании.
|
|||
|
|
|||
|
Решить эту проблему можно с использованием [[../../../../../_inbox/Блокировка|блокировок]]:
|
|||
|
- Получаем доступ к кэшу, его срок жизни истёк. Пытаемся заблокироваться по ключу.
|
|||
|
- Не удалось получить блокировку
|
|||
|
- Ждём снятия [[../../../../../_inbox/Блокировка|блокировки]].
|
|||
|
- Если не дождались, возвращаем старые данные кэша
|
|||
|
- Если дождались, значит кто-то построил кэш за нас, выбираем значения ключа заново, возвращаем новые данные.
|
|||
|
- Удалось получить блокировку
|
|||
|
- Строим кэш самостоятельно
|
|||
|
- Снимаем блокировку
|
|||
|
***
|
|||
|
## Мета информация
|
|||
|
**Область**:: [[../../../meta/zero/00 HighLoad|00 HighLoad]]
|
|||
|
**Родитель**:: [[../Кэширование|Кэширование]]
|
|||
|
**Источник**::
|
|||
|
**Автор**::
|
|||
|
**Создана**::
|
|||
|
### Дополнительные материалы
|
|||
|
-
|
|||
|
### Дочерние заметки
|
|||
|
```dataview
|
|||
|
LIST
|
|||
|
FROM [[]]
|
|||
|
WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link)
|
|||
|
```
|