Паттерны
Управление конкуренцией
Узнайте, как справляться с высокой конкуренцией за ресурс на интервью по System Design
🔒 Управление конкуренцией необходимо, когда несколько процессов пытаются получить доступ к одному и тому же ресурсу одновременно. Это может быть покупка последнего билета на спектакль, ставка на один и тот же лот на аукционе или любая похожая ситуация. Если не обработать такой сценарий правильно, мы получим состояния гонки (race conditions), двойные бронирования и несогласованность данных. В этом паттерне мы разберем решения от простых транзакций в базе данных до более сложной распределенной координации, показывая, когда оптимистический контроль конкурентности (Optimistic Concurrency Control, OCC) лучше пессимистической блокировки, и как масштабироваться за пределы одной машины.
Проблема
Представим покупку билетов на спектакль онлайн. На спектакль "Тихий Дон" остался последний билет. Алиса и Боб одновременно нажимают "Купить". Без правильной координации происходит следующее:
- Запрос Алисы читает: "доступно 1 место"
- Запрос Боба читает: "доступно 1 место" (оба чтения происходят до любой записи)
- Запрос Алисы проверяет, что 1 ≥ 1 (да, место доступно), переходит к оплате
- Запрос Боба проверяет, что 1 ≥ 1 (да, место доступно), переходит к оплате
- С Алисы списывается 5000 рублей, счетчик мест уменьшается до 0
- С Боба списывается 5000 рублей, счетчик мест уменьшается до -1
Оба получают письмо с подтверждением на одно и то же место. Оба приходят на спектакль, уверенные, что владеют восьмым местом на втором ряду. Для одного из них организаторам придется искать другое место или оформлять возврат и разбираться с очень недовольным клиентом.
Перейдите на Premium, чтобы продолжить
Разблокируйте доступ к этой статье и всем остальным материалам с NowInterview Premium
Перейти на Premium