Doкtor: v_gildenberg: Перекупщик сдает билет и ловит его своим ботом за миллисекунды. Внутренний цикл проверки листа ожидания РЖД просто не успевает сработать за такой короткий промежуток времени — бот отправляет запрос на покупку быстрее, чем база данных обновляет статус очереди
Это вы придумываете или точно знаете? Почему бот перекупщика будет быстрее "бота" официальной программы? И будут ли поступать сданные места вообще в продажу пока не пройдут процедуру проверки листом ожидания?
Или функция искусственного удержания мест. Боты могут циклично держать «бронь без оплаты» (на те самые 15 минут) на десятки мест одновременно, постоянно перезапуская таймер. Места числятся занятыми, поэтому лист ожидания для них не срабатывает.
И опять по моим наблюдениям это не так. Для "перезапуска таймера" на очередные 15 минут нужно вновь совершить процедуру покупки освободившихся мест.
Как пример - если сейчас не оплатить заказ, через 15 минут он не появится вновь в продаже, как это было пару лет назад. Эти неоплаченные места тоже возвращаются с непредсказуемой задержкой.
Конечно, придумываю.

Ну как иначе?

Казалось бы, система «Листа ожидания» должна мгновенно забрать сданное место. Однако боты выигрывают из-за архитектурных особенностей баз данных. То есть они играют на асинхронности. Обработка возврата билета и проверка «Листа ожидания» это две разные тяжелые операции. Когда билет возвращается, база данных мгновенно меняет статус места в таблице на «свободно».

Алгоритм, который проверяет очередь листа ожидания и подбирает пассажиров по параметрам, запускается с небольшой задержкой (это может быть регламентный цикл раз в несколько секунд или минут, чтобы не перегружать сервер). Запрос бота на покупку успевает проскочить в базу данных в промежутке между изменением статуса места и запуском проверки очереди. Есть такая штука как прямое обращение по ID места. Это когда обычный пользователь ищет билеты через общий поиск, загружая схему всего вагона, а бот отправляет точечный запрос, где жестко прописаны, скажем: Вагон №8, Место №12. Такой запрос обрабатывается сервером РЖД в приоритетном порядке за микросекунды. Ну и знаменитый Anti-Fraud, т.е. механизм случайной задержки. РЖД внедрили механизм, при котором сданный билет возвращается в систему не сразу, а через случайное время (от 15 минут до 3 часов). Но для крупных перекупщиков это не преграда. Их боты переходят в режим высокочастотного флуда (штурма). Бот запускает процедуру возврата, а затем начинает отправлять запросы на покупку этого места по 50–100 раз в секунду. Как только защитный таймер РЖД истекает (будь то через 17 минут или через 2 часа), место на миллисекунду становится доступным, и бот, который непрерывно «стучался» в эту дверь, забирает его первым.
