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