首页 > 解决方案 > Rails - 多个线程以避免松弛的 3 秒 API 响应规则

问题描述

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

我通过注释掉所有功能确认了这一点,我没有问题,它发布了对松弛罚款的回复。然后我添加了 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 都很陌生,所以在这里有点迷失。

欣赏眼睛:)

标签: ruby-on-railsrubyslack-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

顺便说一句,我强烈建议不要Thread.new在 Rails 中使用。它可能会产生一些非常令人困惑的行为,尤其是在测试脚本中,原因有很多,但通常是因为它与打开的连接,特别是 ActiveRecord 的交互方式。


推荐阅读