我正在集成通信api,每当文本/语音到达我的服务器(rails控制器)时,我都必须向api发回OK(200)。我想在执行我的代码块之前发送此响应,因为如果我的代码中断(并且无法发送OK),则通信api会持续发送消息长达3天。现在,这只会使我服务器上已经存在的问题复杂化,因为它会随着同一条消息的继续而不断发生。
我做了一些研究并找到了两个解决方案。
解决方案1:下面是第一个解决方案(我当前的实现)并且它似乎没有工作(除非我没有正确读取日志文件或者我是幻觉)。
def receive_text_message
head :ok, :content_type => 'text/html'
# A bunch of code down here
end
我认为这应该做(每个rails doc),但我不确定是否会这样做。
解决方案2:我正在考虑的第二个实现是快速创建一个新进程/线程来执行代码块并终止接收消息的进程...这样一来api很快得到它,它不必等待我的代码块的成功执行。我可以使用spawnling(或spawn)gem来做到这一点。因为我使用乘客(社区)服务器,所以我会创建一个流程。但是新进程会占用更多RAM,而且我认为调试子进程/线程更难(我可能错了)
感谢您的帮助!
附带问题:rails在失败后是否尝试重启进程?
答案 0 :(得分:2)
您可以选择在控制器中返回200并开始sidekiq作业。这样200将立即返回,您的控制器将准备好处理下一个工作。所以不要浪费你的控制器的时间和资源。让工人做出真正艰苦的工作。
在您的控制器中
def receive_text_message
head :ok, :content_type => 'text/html'
HardWorker.perform_async(params)
end
在你的sidekiq工作人员中:
class HardWorker
include Sidekiq::Worker
def perform(params)
# 'Doing hard work'
end
end
我喜欢sidekiq主要是因为与救援相比,它更好地处理资源。