Паттерны

Управление конкуренцией

Узнайте, как справляться с высокой конкуренцией за ресурс на интервью по System Design

🔒 Управление конкуренцией необходимо, когда несколько процессов пытаются получить доступ к одному и тому же ресурсу одновременно. Это может быть покупка последнего билета на спектакль, ставка на один и тот же лот на аукционе или любая похожая ситуация. Если не обработать такой сценарий правильно, мы получим состояния гонки (race conditions), двойные бронирования и несогласованное состояние. В этом паттерне мы разберем решения от простых транзакций в базе данных до более сложной распределенной координации, показывая, когда оптимистический контроль конкурентности лучше пессимистической блокировки, и как масштабироваться за пределы одного узла.

Проблема

Представим покупку билетов на спектакль онлайн. На спектакль "Тихий Дон" остался последний билет. Алиса и Боб одновременно нажимают "Купить". Без правильной координации происходит следующее:

  1. Запрос Алисы читает: "доступно 1 место"
  2. Запрос Боба читает: "доступно 1 место" (оба чтения происходят до любой записи)
  3. Запрос Алисы проверяет, что 1 ≥ 1 (да, место доступно), переходит к оплате
  4. Запрос Боба проверяет, что 1 ≥ 1 (да, место доступно), переходит к оплате
  5. С Алисы списывается 5000 рублей, счетчик мест уменьшается до 0
  6. С Боба списывается 5000 рублей, счетчик мест уменьшается до -1

Оба получают письмо с подтверждением на одно и то же место. Оба приходят на спектакль, уверенные, что владеют рядом 2, местом 8. Одного из них придется развернуть, а площадке - оформлять возврат и разбираться с двумя очень недовольными клиентами.

Состояние гонки при покупке последнего билета

Перейдите на Premium, чтобы продолжить

Разблокируйте доступ к этой статье и всем остальным материалам с NowInterview Premium

Перейти на Premium