Rails - 多个主题来避免 3 秒 API 响应规则的松弛

问题描述

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

我通过注释掉所有功能确认了这一点,我没有问题,它发布了对 slack 的响应。然后我添加了 sleep 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。