Ruby threading/forking 和 API (Sinatra)

Ruby threading/forking with API (Sinatra)

我正在为我的 API 使用 Sinatra gem。我想要做的是当收到请求时处理它,return 响应并开始新的长 运行 任务。

我是 Ruby 的新手,我已阅读有关线程的内容,但不确定完成任务的最佳方法是什么。

这是我的 sinatra 端点

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

如有任何建议或示例,我将不胜感激。

我认为更好的方法是使用后台作业。当您的 worker 执行一些 long-运行 任务时,它无法用于新请求。使用后台作业 - 他们完成工作,而您的网络工作者可以处理新请求。

您可以查看 ruby 最流行的背景工作 gem 作为起点:resquedelayed_jobssidekiq

UPD:实现取决于选择的 gem,但一般方案如下:

# 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。

有两种方法可以做到这一点。 线程或后台作业 gem,例如 sidekiq。

如果处理时间不是那么长并且您不想为工作人员编写代码,则线程非常适合。但是,如果您不使用线程池或者您预计会有突发的 http 流量,您很可能 运行 启动了太多线程。

最好的方法是使用 sidekiq 或类似的东西。您甚至可以在中间有一个像 beanstalkd 这样的作业队列,en-queue 作业和 return 响应。您可以让工作人员从队列中读取并稍后处理。