TCP Socket связь между процессами на рабочем динамометрическом стенде Heroku

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

10
задан makdad 17 February 2012 в 03:48
поделиться