Я хотел бы знать, как обмениваться данными между процессами в рабочей станции 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 на одном и том же Dyno.Есть ли способ обойти это?
Я попытался вывести «код» из ситуации и просто выполнить в командной строке (после того, как процесс сервера заявил, что он правильно связан с 12345):
nc localhost 12345 -w 1 </dev/null
Но это также не соединяет.
В настоящее время мы изучаем возможность изменения кода клиент / сервер для использования UNIXSocket
с обеих сторон, а не TCPSocket
, но так как эточасть программного обеспечения, мы бы предпочли избегать нашего собственного форка, если это возможно.