【问题标题】:Process the results of an HTTP request in the background - Ruby在后台处理 HTTP 请求的结果 - Ruby
【发布时间】:2017-04-06 19:54:50
【问题描述】:

我编写了一个快速(哈哈)服务器来接受一个 JSON 有效负载,其中包含一个用于下载存档的 URL。解析 JSON 后,我下载文件,解压缩并将元数据添加到每一行。对于大文件,这可能需要很长时间。

require 'thin'
require 'sinatra'
require 'json'

set :bind, '0.0.0.0'

#Listen on port 4567 at /core/action/parse-v1/parse-file for JSON post
post '/core/action/parse-v1/parse-file' do
request.body.rewind
request_payload = JSON.parse request.body.read

url = request_payload["s3Url"]
compressionType = request_payload["compressionType"]
  • 从 s3Url 拉文件的东西
  • 根据compressionType解压/tar -xvf/etc文件的东西
  • 为文件中的每一行创建一个 JSON 对象并将 request_payload 添加到其中的东西
  • 将结果推送到队列进行处理的东西 最后完成,向客户端发送 200(可能在 59 秒前超时)。

目前,这一切都需要相当长的时间,并且始终保持 HTTP 连接打开。如何立即传递“东西”部分并让 HTTP 服务器关闭其连接?

我已经尝试了一些,但我被卡住了。

【问题讨论】:

    标签: json ruby rest sinatra


    【解决方案1】:

    如果您想在开始某个长时间运行的进程之前向客户端返回响应,也许您需要一个排队系统?我不熟悉 Sinatra,也不了解您的用例,但在 Rails 中,这通常是通过延迟作业、Resque 或 Sidekiq 之类的东西来完成的。

    如果这些对你来说太重了,你可以直接用 Ruby 启动另一个进程,就像 laid out in this answer.

    【讨论】:

      猜你喜欢
      • 2020-04-13
      • 1970-01-01
      • 2016-12-21
      • 1970-01-01
      • 2012-08-05
      • 2015-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多