Где хранить временные данные в рельсах - PullRequest
1 голос
/ 26 января 2010

В Ruby у меня есть действие контроллера, которое немедленно запускает вычислительно-интенсивную задачу, которая занимает несколько секунд. Я хочу, чтобы клиент опросил мой сервер и получил обновления статуса.

в моем контроллере:

def complex_task
  Thread.new do
    loop do
      one_part_of_the_computationally_intensive_task
      # Note how much progress we've made, in case the client asks.
      save_progress
    end
  end
  # returns to client straightaway, but task continues in background.
end

def check_status
  # Retrieve state in here.
  get_progress
end

Обратите внимание, как check_status необходимо получить состояние, сохраненное отдельным потоком.

Как написать функции save_progress и get_progress? Где хранить состояние? Кажется, что не очень хорошая идея хранить его в session, так как это отправляется клиенту, но где еще мне его хранить?

(относится к к этому вопросу , но гораздо более общий. Я ожидаю совсем других ответов.)

Ответы [ 2 ]

3 голосов
/ 27 января 2010

Взгляните на delayed_job . Вы можете легко расширить это, чтобы задания могли записывать ход выполнения в таблицу delayed_jobs для последующего извлечения вашим методом check_status() (или вы даже можете добавить set_status() и check_status() в delayed_job ...)

Обратите внимание, что delayed_job был изначально извлечен из Shopify; Я предполагаю, что это означает, что у него была серьезная реальная демонстрация. Я бы предпочел начать с такой базы, чем бросать свою, если у меня не было достаточно веских причин.

1 голос
/ 26 января 2010

Вы можете сохранить статус в модели и поместить status_id в сеанс. В качестве альтернативы вы можете использовать хранилище сеансов базы данных вместо хранилища на основе файлов cookie, что позволит хранить данные, которые вы помещаете в сеанс на стороне сервера, за счет скорости сеанса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...