Прежде чем я обрисую один метод для этого, я хочу отметить, что то, что вы хотите сделать, не имеет большого смысла. Сервисы в Интернете не похожи на физический магазин, где я могу подойти и увидеть, что он переполнен и решить остаться или нет. Очередь за людьми на вашем сайте поражает меня как перекладывание вины с вас (неспособности или нежелания адекватно предоставлять ресурсы) на меня (наказывая меня за попытку использовать ваш сайт).
Если вы продаете что-то вроде билетов на шоу, где количество ограничено, а каждый предмет привязан к месту, я думаю, что лучше бронировать предметы и тайм-аут этих бронирований, если они не оплачены своевременно. Ticketmaster делает это, и я думаю, что это гораздо лучшее решение, чем блокировка людей у двери.
Если вы все еще хотите пойти по этому пути, то я бы спроектировал систему следующим образом:
Когда клиенты приходят на ваш сайт, запишите время их прибытия. Когда они взаимодействуют с сайтом, запишите время «последнего посещения». «Последнее посещение» будет использоваться для определения активности. Вам понадобится фоновая работа, выполняемая очень часто, чтобы быстро заканчивать сеансы.
Как только ваш лимит достигнут, у вас есть упорядоченная очередь людей, которые заблокированы. Когда клиенты завершат свою транзакцию или тайм-аут, вы отметите следующего человека в очереди для входа в путь покупки.
Для пользователей, находящихся в очереди, их браузеры будут регулярно делать запросы, проверяя, не пустили ли вы их. Если да, они переходят к пути покупки. Если нет, они продолжают ждать.
Для пути покупки необходим механизм, позволяющий проверить, пытается ли кто-либо обойти вашу зону ожидания, и отправить его обратно.