Ответ 1
Вы пробовали Fifo?
http://www.gnu.org/software/libc/manual/html_node/FIFO-Special-Files.html#FIFO-Special-Files
Я хотел бы знать, как взаимодействовать между процессами на рабочем диване 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
, но поскольку это готовое программное обеспечение, мы бы предпочли избежать нашей собственной вилки, если возможно.
Вы пробовали Fifo?
http://www.gnu.org/software/libc/manual/html_node/FIFO-Special-Files.html#FIFO-Special-Files
Использовать очередь сообщений Дополнения Heroku...,
как IronMQ для exsample
Считая свой вопрос, вы ответили на свой вопрос, вы не можете подключиться к localhost 12345.
Этот способ настройки ваших процессов является странным, поскольку вы запускаете два процесса в одном из процессоров Heroku, который удаляет много преимуществ Heroku, т.е. independent масштабирование процесса, изоляция и декларация чистой изоляции и изоляция.
Я бы настоятельно рекомендовал использовать это как два отдельных процесса, которые взаимодействуют через стороннюю службу поддержки.
Heroku только позволяет слушать в данном порту ($ PORT) на дино, я думаю.
Здесь я вижу два решения:
Используйте Redis в качестве связующего ПО для связи, поэтому рабочий снова напишет на Redis, а процесс прослушивания вместо прослушивания в порту будет запрашивать redis для новых заданий.
Получите еще один диктор heroku (или, лучше, совершенно другое приложение) и запустите там процесс прослушивания (на $PORT) и обменивайтесь обоими приложениями
@makdad, это "стороннее программное обеспечение", написанное на Ruby? Если это так, я запустил бы его с патчем обезьяны, который подделывает TCPSocket
или любой класс, который он использует для доступа к сокету TCP. Поместите патч обезьяны в собственный файл, который потребуется только для процесса Ruby, на котором запущено стороннее программное обеспечение. Патч обезьяны мог даже считывать данные непосредственно из очереди и делать TCPSocket
вести себя так, как если бы эти данные были получены.
Да, это не очень элегантно, и я уверен, что может быть лучший способ сделать это, но когда вы пытаетесь выполнить работу (не тратьте время на исследования), иногда вам просто нужно укусить пуля и сделать что-то некрасивое, но работает. Независимо от того, какое решение вы выбрали, обязательно задокументируйте его для тех, кто работает над проектом позже.