Алгоритм процесса произведения розыгрыша для рулетки. Как бы сделали Вы?
Здравствуйте. Делаю рулетку, взаимодействие клиента и сервера происходит с помощью сокетов. Дело дошло до определения победителя, и тут образовалась непростая ситуация.
Как можно реализовать процесс розыгрыша, если спустя, допустим, 30 секунд после ставки второго пользователя, все пользователи посылают запрос на сокет-сервер для получения победителя? Также в это время должен производиться розыгрыш. Как бы сделали вы?
Я Вам и дал ответ - проводите процесс розыгрыша в ином треде.
Либо используйте блокировки, чтобы только один тред проводил розыгрыш, дабы избежать race condition.
Используйте блокировки на уровне базы данных (в mysql это допустимо для таблиц InnoDb).
Сваливается запрос на получение, первым делом смотрите завершена ли игра.
Если нет, то
стартуете READ COMMITED транзакцию, и читаете строку игры/раунда с флагом FOR UPDATE.
Это даст 100% гарантию, что только один запрос получит блокировку на эту строчку, остальные будут ждать (вплоть до таймаута) пока первый запрос отпустит (комит/ролбэк) нужную строку.
При получении блокировки проверяете её статус еще раз - если игра/раунд еще не завершен - проводите розыгрыш, делаете комит, отдаете резалт.
В противном случае сразу отдаете резалт.
В корне неверный подход. Для такого вида игр создается заранее сгенерированный ряд чисел, выигрыш на момент ставок клиентов на стороне сервера уже известен, соответственно в момент ставок вы уже можете отдать победителя.