运行 Ruby 一个 Unicorn worker 上的 Slack 机器人线程

Run Ruby thread for Slack bot on only one Unicorn worker

我创建了一个 slack 机器人,运行 它在 rails 初始值设定项中是这样的:

Thread.abort_on_exception = true

Thread.new do
  CorgiBot.run
end

我 运行 Unicorn 有多个工人,所以每个工人 运行 都是 Slack 机器人。然后发生的事情是每个工人都有相同的松弛机器人 运行ning 并且因此 returns 多个 responses/messages 在松弛内部对于它接收到的每个命令。

出于各种原因,我试图避免 运行在自己的服务器上安装 slack 机器人。使用 Unicorn 解决此问题的任何想法或只是更改 Ruby 或 Rails 中的设置?

运行 多个 Unicorn worker 意味着您正在 运行 多个不同的进程 - 您基本上是 运行 多个机器人副本。

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

rails r 'CorgiBot.run'

如果那行不通,那么您需要在某处获取共享锁,第一个获取它的进程获胜,另一个失败。您可以使用文件锁或使用 Redis 的 SETNX 命令之类的命令来执行此操作。