Я хотел бы знать, как взаимодействовать между процессами на рабочем диване 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
, но поскольку это готовое программное обеспечение, мы бы предпочли избежать нашей собственной вилки, если возможно.