Рубиновые потоки / разветвление с API (Синатра)

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

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

Вот мой sinatra конечная точка

  post '/items' do
     # Processing data
     # Return response (body ...)
     # Start long running task
  end

Буду благодарен за любой совет или пример.

2 ответа

Решение

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

В качестве отправной точки вы можете взглянуть на большинство популярных задних камней для ruby: resque, delayed_jobs, sidekiq

UPD: реализация зависит от выбранного гема, но общая схема будет такой:

# Controller
post '/items' do
  # Processing data
  MyAwesomeJob.enqueue # here you put your job into queue
  head :ok # or whatever
end

В MyAwesomejob Вы реализуете свою долгосрочную задачу

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

Например, вместо использования вашего User в качестве аргумента используйте user_id а потом найди это в своей работе. Если вы будете делать это так, вы можете использовать любую БД без проблем.

Согласитесь с unkmas.

Есть два способа сделать это. Темы или жемчужина фоновой работы, как sidekiq.

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

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

Другие вопросы по тегам