我想知道如何在 Heroku worker dyno 上的进程之间进行通信。
我们希望 Resque worker 读取队列并将数据发送到在同一个 dyno 上运行的另一个进程。 “其他进程”是一个现成的软件,通常使用 TCP 套接字(端口 xyz)来监听命令。它被设置为在 Resque worker 启动之前作为后台进程运行。
但是,当我们尝试在本地连接到该 TCP 套接字时,我们一无所获。
我们设置队列的 Rake 任务是这样做的:
task "resque:setup" do
# First launch our listener process in the background
`./some_process_that_listens_on_port_12345 &`
# Now get our queue worker ready, set up Redis backing store
port = 12345
ENV['QUEUE'] = '*'
ENV['PORT'] = port.to_s
Resque.redis = ENV['REDISTOGO_URL']
# Start working from the queue
WorkerClass.enqueue
end
那行得通——我们的监听器进程运行,Resque 尝试处理排队的任务。但是,Resque 作业失败,因为它们无法连接到 localhost:12345
(具体来说,Errno::ECONNREFUSED
)。
可能是 Heroku 阻止了同一个 dyno 上的 TCP 套接字通信。有解决办法吗?
我试图从这种情况中取出“代码”并在命令行上执行(在服务器进程声称它已正确绑定(bind)到 12345 之后):
nc localhost 12345 -w 1 </dev/null
但这也不连接。
我们目前正在研究更改客户端/服务器代码以在两侧使用 UNIXSocket
而不是 TCPSocket
,但因为它是现成的软件,如果可能的话,我们宁愿避免自己的 fork 。
最佳答案
使用消息队列Heroku add-ons ...,
喜欢IronMQ对于示例
关于ruby - Heroku worker dyno 进程间的 TCP Socket 通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9322599/