2016-07-01 15 views
1

habe ich einen Bot schlaff und führen Sie es wie so in einem Schienen initializer:Run Ruby-Thread für Slack bot nur auf einem Einhorn Arbeiter

Thread.abort_on_exception = true 

Thread.new do 
    CorgiBot.run 
end 

I Einhorn laufen mit mehreren Arbeitern obwohl, so dass jeder Arbeiter läuft die Slack Bot. Was dann passiert, ist, dass jeder Arbeiter den selben Slack-Bot hat, der darauf läuft und so mehrere Antworten/Nachrichten innerhalb des Slacks für jeden empfangenen Befehl zurückgibt.

Ich versuche zu vermeiden, den slack bot auf seinem eigenen Server aus verschiedenen Gründen zu laufen. Irgendwelche Ideen für Lösungen mit Unicorn oder einfach mein Setup in Ruby oder Rails ändern?

Antwort

1

Wenn Sie mehrere Unicorn-Mitarbeiter ausführen, führen Sie mehrere verschiedene Prozesse aus - Sie führen im Grunde mehrere Kopien des Bots aus.

Die einfache Lösung ist, es einfach nicht in Ihrem Unicorn-Prozess auszuführen, sondern in einem separaten eigenständigen Prozess. Rails-Anbieter die runner Befehl Skripten in der Rails-Anwendung-Umgebung ausgeführt werden:

rails r 'CorgiBot.run' 

Wenn das nicht funktioniert, dann müssen Sie irgendwo eine gemeinsame Sperre nehmen, und der erste Prozess gewinnt sie zu erwerben, die andere scheitern . Sie können dies mit einer Dateisperre oder mit etwas wie dem SETNX-Befehl von Redis tun.