在后台处理HTTP请求的结果 - Ruby

时间:2017-04-06 19:54:50

标签: json ruby rest sinatra

我写了一个快速(hah)服务器来接受一个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连接打开。如何立即关闭“stuff”部分并让HTTP服务器关闭其连接?

我已经尝试了一下但是我被卡住了。

1 个答案:

答案 0 :(得分:2)

如果您想在开始长时间运行的过程之前向客户端返回响应,那么您是否需要排队系统?我不熟悉Sinatra,我不知道你的用例,但是在Rails中,这通常可以通过Delayed Job,Resque或Sidekiq来实现。

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