我想知道如何在 Heroku 工作人员测功机上的进程之间进行通信。
我们希望 Resque 工作人员读取队列并将数据发送到在同一个测功机上运行的另一个进程。“其他进程”是一个现成的软件,通常使用 TCP 套接字(端口 xyz)来侦听命令。它被设置为在 Resque 工作程序启动之前作为后台进程运行。
但是,当我们尝试在本地连接到该 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 在同一个测功机上阻止了 TCP 套接字通信。有没有解决的办法?
我试图将“代码”从这种情况中取出并在命令行上执行(在服务器进程声称它已正确绑定到 12345 之后):
nc localhost 12345 -w 1 </dev/null
但这也没有联系。
我们目前正在研究更改客户端/服务器代码以UNIXSocket
在双方使用而不是 . TCPSocket
,但由于它是现成的软件,如果可能,我们宁愿避免使用自己的分叉。