Пусть что-то случится в определенное время с Rails - PullRequest
1 голос
/ 30 января 2009

Как в браузерных играх. Пользователь строит здание, и таймер устанавливается на определенную дату / время, чтобы закончить строительство и породить здание.

Я представлял себе что-то вроде демона, но как это будет работать? Мне кажется, что спиннинг + опрос - это не путь. Я посмотрел на async_observer , но подходит ли это для чего-то подобного?

Ответы [ 4 ]

1 голос
/ 06 февраля 2009

Я только что сделал это для PBBG, над которой я работаю (Большой Злодей, вы можете увидеть работу в MadGamesLab.com). Во всяком случае, я пошел с таблицей команд, где пользовательские команды генерировали ровно одну запись, и таблицу событий с одной или несколькими записями на команду (обратная связь с командой). Вспомогательный демон запускается с использованием script / runner, чтобы запустить его, периодически опрашивает таблицу событий и запускает события, время которых прошло.

Пока, похоже, он работает довольно хорошо, если только я не увижу какую-то проблему, когда я добавлю большое количество пользователей, я не планирую ее менять.

1 голос
/ 30 января 2009

Если вам нужно, чтобы событие было видимым только для игрока-владельца, тогда модель может сообщать об обновленном статусе по требованию, и мы закончили, двигайтесь дальше, здесь ничего не видно.

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

Я бы сказал, что тебе нужны две вещи. Очередь, в которую вы можете поместить синхронизированные события (таблица базы данных будет работать хорошо) и фоновый процесс, который выполняется непрерывно или часто перезапускается, который извлекает события, запланированные с момента последнего выполнения (или те, которые неизбежны, я полагаю) и действия их.

Глядя на список параметров в вики Rails, кажется, что пока нет единого верного решения. Будем надеяться, что один из них отвечает всем требованиям.

0 голосов
/ 30 января 2009

Я бы использовал AJAX для запуска таймера (см. Periodical Executor ) для обновления вашего пользовательского интерфейса. Что касается модели, просто следите за столбцом create_at для своего здания и разрешайте использовать его только по истечении времени его создания. Таким образом, вам не нужно будет ездить в свою базу данных каждые несколько секунд, чтобы посмотреть, готово ли ваше здание.

0 голосов
/ 30 января 2009

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

Я бы использовал вашу модель, чтобы определить положение вещей, и по конкретному запросу вы можете проверить, построена ли она или нет. Я не понимаю, зачем вам нужен фоновый работник для этого.

...