Я бы хотели бы знать, как взаимодействовать между процессами на рабочем динамометрическом стенде Heroku.
Мы хотим, чтобы работник Resque считывал данные из очереди и отправлял данные другому процессу, работающему на том же динамометрическом стенде. «Другой процесс» - это отключенный -shelf - часть программного обеспечения, которое обычно использует сокеты TCP (порт xyz) для прослушивания команд. Оно настроено на запуск в качестве фонового процесса перед запуском Resque worker.
Однако, когда мы tr y для локального подключения к этому 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 пытается обработать задачи в очереди. Однако задания восстановления завершаются неудачно, потому что они не могут подключиться к localhost: 12345
(в частности, Errno :: ECONNREFUSED
).
Возможно, Heroku блокирует обмен данными по TCP-сокету на том же динамометрическом стенде. Есть ли способ обойти это?
Я попытался извлечь «код» из ситуации и просто выполнил его в командной строке (после того, как серверный процесс заявил, что он правильно привязан к 12345):
nc localhost 12345 -w 1 </dev/null
Но это действительно тоже не подключайтесь.
В настоящее время мы изучаем возможность изменения кода клиент / сервер для использования UNIXSocket
с обеих сторон вместо TCPSocket
, но, поскольку это готовая часть программного обеспечения, мы По возможности предпочитаю избегать нашего собственного форка.