Задать вопрос

Отложенные фоновые события в онлайн игре?

Допустим, есть браузерная игра в которой можно отправить войско, чтобы оно напало на соседа. Войско придет к соседу через час, без моего участия, состоится бой, результат которого будет зависеть от конфигурации войска соседа. При этом, сосед может поменять эту конфигурацию хоть в последнюю секунду.

Т.е. я генерирую событие, которое должно быть обработано в определенное время и результат обработки будет зависеть от актуальных на момент выполнения данных.



Как лучше обрабатывать такие события на сервере?



На ум приходит очевидное — добавлять событие в очередь с параметром «время», фоновый скрипт постоянно проверяет очередь и если есть события, которым пора выполняться, обрабатывает их все по очереди.



Беспокоит меня в таком подходе то, что при большом количестве участников, событий тоже может быть много, в том числе и назначенных на одно время. Их последовательная обработка может занять время и в час Ч, результата еще не будет (т.е игра отобразит что-то там, но не результаты, которых ждут игроки).



Возможно, есть какое-то более логичное решение для отложенных событий? или не стоит переживать по поводу скорости, а делать так, чтобы обработка занимала очень мало времени?
  • Вопрос задан
  • 3053 просмотра
Подписаться 5 Оценить Комментировать
Ответ пользователя Сергей К ответам на вопрос (6)
seriyPS
@seriyPS
Вопрос как-то странно задан, не понял что вам все-таки нужно… Чтобы все события гарантированно отрабатывали за заданное время? Или чтобы внутреннее состояние системы не нарушилось?

Я бы такого рода задачу решал с использованием менеджера очередей a-la RabbitMQ. Они поддерживают отложенное выполнение задач. Ну а данные о состоянии системы можно получать в момент старта задачи.
Проблема большого кол-ва юзеров решается классическим способом — увеличением кол-ва воркеров… Получать задачи от RabbitMQ могут несколько серверов-воркеров, так что параллелить можно в очень широких пределах.

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