我创建了一个slack bot并在rails初始化程序中运行它:
Thread.abort_on_exception = true
Thread.new do
CorgiBot.run
end
我使用多个工作人员运行Unicorn,因此每个工作人员都运行Slack机器人。那么接下来会发生的是每个工作者都有相同的slack bot在它上面运行,因此对于它接收到的每个命令,都会在slack中返回多个响应/消息。
我试图避免出于各种原因在自己的服务器上运行slack bot。使用Unicorn解决这个问题的想法,或者只是在Ruby或Rails上更改我的设置?
答案 0 :(得分:1)
运行多个Unicorn工作人员意味着您正在运行多个不同的流程 - 您基本上都在运行机器人的多个副本。
简单的解决方案是不在Unicorn流程中运行它,而是在单独的独立流程中运行。 Rails提供runner
命令来在Rails应用程序环境中运行脚本:
rails r 'CorgiBot.run'
如果这不起作用,那么你需要在某处获取共享锁,并且获得它的第一个进程获胜,另一个进程失败。你可以通过文件锁或使用像Redis这样的东西来做到这一点。 SETNX命令。