Рубиновые потоки / разветвление с 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 между ними и ставить в нее задание и возвращать ответ. Вы можете получить работника, читающего из очереди и обрабатывающего его позже.