仅在一名Unicorn工作人员上为Slack bot运行Ruby线程

时间:2016-07-01 19:54:41

标签: ruby-on-rails ruby unicorn slack

我创建了一个slack bot并在rails初始化程序中运行它:

Thread.abort_on_exception = true

Thread.new do
  CorgiBot.run
end

我使用多个工作人员运行Unicorn,因此每个工作人员都运行Slack机器人。那么接下来会发生的是每个工作者都有相同的slack bot在它上面运行,因此对于它接收到的每个命令,都会在slack中返回多个响应/消息。

我试图避免出于各种原因在自己的服务器上运行slack bot。使用Unicorn解决这个问题的想法,或者只是在Ruby或Rails上更改我的设置?

1 个答案:

答案 0 :(得分:1)

运行多个Unicorn工作人员意味着您正在运行多个不同的流程 - 您基本上都在运行机器人的多个副本。

简单的解决方案是不在Unicorn流程中运行它,而是在单独的独立流程中运行。 Rails提供runner命令来在Rails应用程序环境中运行脚本:

rails r 'CorgiBot.run'

如果这不起作用,那么你需要在某处获取共享锁,并且获得它的第一个进程获胜,另一个进程失败。你可以通过文件锁或使用像Redis这样的东西来做到这一点。 SETNX命令。