0

Я использую gem для моего API Sinatra. То, что я хочу сделать, - это когда запрос получен, обработайте его, верните ответ и запустите новую долговременную задачу.Ruby threading/forking with API (Sinatra)

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

Вот моего sinatra конечной точки

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

Я был бы признателен за любые советы или, например.

ответ

2

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

Вы можете посмотреть на самых популярных фоновой вакансии драгоценные камни для рубина в качестве отправной точки: 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, а затем найдите его в своей работе. Если вы сделаете это так, вы можете использовать любую БД без проблем.

+0

Спасибо за ответ, не могли бы вы привести пример, как это будет выглядеть в моем случае, я имею в виду возвращение ответа и добавление фоновой работы или наоборот? Спасибо – Putinhello

+0

И еще одна вещь, я использую Mongoid для сохранения объектов, как я могу использовать его или передать объект Sidekiq? – Putinhello

+0

@Putinhello обновил мой ответ – unkmas

0

Согласен с unkmas.

Существует два способа сделать это. Нитки или фона работы, как sidekiq.

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

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