Моя организация создает новую версию нашего сайта покупки билетов и ищет лучший способ создать приемную онлайн, когда число пользователей в нашем пути покупки превышает определенный предел. Лучшая версия этой очереди впустила бы новых пользователей после того, как существующие пользователи или завершили свою покупку или превысили предел тайм-аута после ввода пути.
Я пытаюсь понять то, как это было реализовано другими организациями. Кто-либо там сделал что-то подобное или имеет опыт с этим? У нас есть некоторые идеи, но я хотел бы получить смысл того, какие решения попробовали и с какими проблемами те решения столкнулись.
Только, чтобы быть завершенным, этот сайт создается в Ruby on Rails, хотя я хотел бы услышать о том, как люди решили это независимо от платформы.
Править: Разъясниться: потребность в очереди не состоит в том, чтобы, прежде всего, уменьшить загрузку, но ограничить скорость, на которой сеть покупает билеты относительно людей, покупающих другими способами, как по телефону.
Прежде чем я обрисую один метод для этого, я хочу указать, что то, что вы хотите сделать, не имеет большого смысла. Сервисы в Интернете не похожи на обычный магазин, где я могу подойти, увидеть, что он переполнен, и решить, остаться или нет. Мне кажется, что создание очереди на вашем сайте перекладывает вину с вас (неспособность или нежелание адекватно предоставлять ресурсы) на меня (наказание меня за попытку использовать ваш сайт).
Если вы продаете что-то вроде билетов на шоу, где количество ограничено и каждый предмет привязан к месту, я думаю, что лучше зарезервировать предметы и отсрочить эти бронирования, если они не оплачены своевременно. Ticketmaster делает это, и я думаю, что это гораздо лучшее решение, чем блокировать людей у дверей.
Если вы все же хотите пойти по этому пути, я бы спроектировал систему следующим образом:
Когда клиенты приходят на ваш сайт, запишите время их прибытия. Когда они взаимодействуют с сайтом, запишите время «последнего посещения». «Последний раз видели» будет использоваться для определения активности. Вам понадобится очень часто выполняющееся фоновое задание, чтобы сеансы быстро заканчивались.
Как только ваш лимит исчерпан, у вас появляется упорядоченная очередь людей, которые заблокированы. Когда клиенты завершат свою транзакцию или истечет время ожидания, вы отметите следующего человека в очереди для входа в путь покупки.
Для пользователей, находящихся в очереди, их браузеры будут делать запросы на регулярной основе, проверяя, позволили ли вы им войти. Если да, они переходят к пути покупки. Если нет, они продолжают ждать.
На пути к покупке необходим механизм, который проверяет, не пытается ли кто-то обойти вашу зону ожидания, и отправляет их обратно.