Rails -多个头来避免松懈的3秒API响应规则



我正在使用slack API。我的脚本做一堆外部处理,在某些情况下,它可能需要大约3-6秒。正在发生的事情是Slack API期望在3秒内响应200,因为我的函数在3秒内没有完成,它再次重试,然后它最终发布相同的自动响应2-3次。

我通过注释所有的函数来确认这一点,我没有问题,它发布了对slack的响应。然后我增加了睡眠10,它做了3次相同的反应,所以唯一不同的是它花了更长的时间。

从我读到的,我需要有线程响应。然后,我需要首先响应线程1中的slack API,然后继续处理我的函数。

这是我尝试的:

def events
Thread.new do
json = {
"text": "Here is your 200 response immediately slack",
}
render(json: json)
end

puts "--------------------------------Json response started----------------------"
sleep 30
puts "--------------------------------Json response completed----------------------"
puts "this is a successful response"
end

当我测试它时,同样的问题发生了,所以我尝试使用在线API测试器,它点击页面,等待30秒,然后返回200响应,但我需要它立即响应200,然后处理其余的,否则我会得到重复。

我是否正确使用线程,或者是否有另一种方法来绕过这个Slack API 3秒响应限制?我是rails和slack API的新手,所以这里有点迷路了。

欣赏你的眼睛:)

如果你不需要在响应中使用代码的结果,我建议使用ActionJob在后台运行代码。首先,运行以下命令创建一个ActiveJob作业:

bin/rails generate job do_stuff

然后打开在app/jobs/do_stuff_job.rb中创建的文件并编辑#perform函数以包含您的代码(因此示例中的puts语句和sleep 30)。最后,从控制器动作中,你可以调用DoStuff.perform_later,你的作业将在后台运行!你的最终控制器动作看起来像这样:

def events
DoStuff.perform_later # this schedules DoStuff to be done later, in
# the background, so it will return immediately
# and continue to the next line.
json = {
"text": "Here is your 200 response immediately slack",
}
render(json: json)
end

作为题外话,我强烈建议不要在rails中使用Thread.new。它可以创建一些真正令人困惑的行为,特别是在测试脚本中,有很多原因,但通常是因为它如何与打开的连接,特别是ActiveRecord交互。

最新更新