Рассмотрим приложение типа (Ticket Master или BookMyShow или любое другое приложение для бронирования места).
- На основе выбранного города мы показываем все фильмы, которые показывают в этом городе.
- В городе будет несколько кинозалов.
- В каждом кинозале есть несколько экранов.
Оценка емкости: 6 миллиардов просмотров страниц в месяц и продажа 15 миллионов билетов в месяц.
Размер экрана может варьироваться от 1 000 до 100 000 мест.
Они предоставляют пользователю 5 минут времени для завершения платежа после резервирования места, выбранного пользователем. Если пользователь не сможет завершить платеж в течение указанного времени, место будет возвращено обратно в свободный пул.
Прежде чем пользователь будет перенаправлен на страницу оплаты, мы меняем статус мест, выбранных пользователем как «ЗАБРОНИРОВАН» в БД, и делаем запись в кеше для этого конкретного SHOWID (ключ в кеше).
Допустим, мы кэшировали все места "BOOKED and RESERVED" для более быстрого доступа в REDIS для каждого шоу вместо запроса к базе данных, как показано ниже.
{SHOWID : [{SEAT_ID, TimeInterval}, {SEAT_ID, TimeInterval}......]}
Если в любой момент времени пользователь не сможет произвести платеж в течение 5 минут. нам нужно сделать 2 вещи, чтобы освободить места обратно в свободный бассейн.
- Удалите запись seatID из кэша для этого конкретного SHOWID, который он пытался забронировать.
- Измените статус сидений обратно на «ДОСТУПНО» в БД.
Теперь проблема заключается в оценке емкости, как мы можем эффективно удалить все зарезервированные места обратно в свободный пул, если пользователь не платит в течение 5 минут за каждый сеанс во всех городах. Чтобы другие пользователи могли сразу увидеть статус этих мест как ДОСТУПНЫЙ для бронирования.
Поскольку для каждого ШОУ по всем городам в REDIS CACHE будет огромное количество ЗАБРОНИРОВАННЫХ / ЗАБРОНИРОВАННЫХ мест,
P.S .: Я читал об активном способе REDIS EXPIRING ключей. Но он случайным образом выбирает ключ для проверки срока действия и, если срок действия истекает, он удаляет запись. Но это может привести к тому, что статус некоторых мест по-прежнему будет отображаться как ЗАБРОНИРОВАН, даже если время истечения срока бронирования превышено до случайного выбора REDIS.