【发布时间】:2012-03-08 12:27:43
【问题描述】:
我想知道如何在 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,但由于它是现成的软件,如果出现以下情况,我们宁愿避免使用自己的 fork可能。
【问题讨论】:
-
是否可以使用 Docker 容器解决这个问题?
标签: ruby sockets tcp heroku worker