ruby-on-rails - 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 都很陌生,所以在这里有点迷失。
欣赏眼睛:)
解决方案
如果您不需要在响应中使用代码的结果,我建议使用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 的交互方式。
推荐阅读
- javascript - 尝试在 chartjs 上呈现一些数据时出现问题
- java - SQLEXCEPTION : long 类型的错误值
- java - 在异步调用中更改变量
- c++ - 在 Cap'n Proto RPC 服务器中定期运行函数
- c - 无法在 vscode 中调试单个 .c 文件
- node.js - 在 async/await 中正确处理和传递错误
- datastage - 与 datastage master 相关的错误
- javascript - 使用 extjs 6.6.0 实现覆盖基类 Extjs.Base 类以实现国际化
- ontology - 是否有机会将从 SQWRL 查询中获得的结果放入一个类中?
- android - 简单的 android 二进制文件与 zlib 一起崩溃