ZeroMQ-управляемый сервер перестает отвечать через некоторое время - PullRequest
0 голосов
/ 22 ноября 2011

Я изучаю, как использовать ZeroMQ вместе с EventMachine.Чтобы проверить это, я написал небольшую программу на ruby ​​(echo client server), где использовал сокеты XREQ и XREP.Клиентское приложение отправляет сообщения на сервер (последовательные номера) и возвращает их в ответ.Интервал между отправками составляет 0,1 с.Все работает ... до определенного момента.Когда текущее число достигает 400, сервер просто зависает и больше не отвечает клиенту.Я проверил это на нескольких компьютерах и все еще получил эту странную проблему.

Код довольно прост:

server.rb

require 'rubygems'
require 'bundler/setup'
require 'em-zeromq'

Thread.abort_on_exception = true

ADDRESS = 'tcp://127.0.0.1:2091'

class EMServerHandler
  attr_reader :received
  def on_readable(socket, messages)
    client_identity = messages.shift.copy_out_string #getting client identity from the 1st part of the message
    messages.shift #skip the delimeter
    messages.each do |m|
      msg = m.copy_out_string
      puts "server received from #{client_identity}: " + msg
      socket.send_msg("#{client_identity}",'',"#{msg}") #echo message back to the client
    end
  end
end

trap('INT') do
  EM::stop()
end

puts "Program started (with zmq #{ZMQ::Util.version.join('.')})."

EM.run do
EventMachine.epoll
  ctx = EM::ZeroMQ::Context.new(1)  
  server = ctx.bind(ZMQ::XREP, ADDRESS, EMServerHandler.new, {:identity => "server"})
end

client.rb

require 'rubygems'
require 'bundler/setup'
require 'em-zeromq'

Thread.abort_on_exception = true

ADDRESS = 'tcp://127.0.0.1:2091'

class EMClientHandler
  attr_reader :received
  def on_readable(socket, messages)
    messages.shift #skip the delimeter
    messages.each do |m|
      puts "client recieved: " + m.copy_out_string
    end
  end
end

trap('INT') do
  EM::stop()
end

puts "Program started (with zmq #{ZMQ::Util.version.join('.')})."

EM.run do
  EventMachine.epoll
  ctx = EM::ZeroMQ::Context.new(1)
  puts "client"
  puts "enter client name >> "
  identity = gets.strip
  client = ctx.connect(ZMQ::XREQ, ADDRESS, EMClientHandler.new, {:identity => identity})
  client.send_msg('', "hello from client #{identity}")
  count = 0
  EM::PeriodicTimer.new(0.1) do
    client.send_msg('', "#{count += 1}")
  end
end

Пожалуйста, помогите мне выяснить причину этого.

Ответы [ 2 ]

1 голос
/ 05 февраля 2012

Ваш контекст ZeroMQ пожинается сборщиком мусора.

Вам нужно перевести ваш вызов на EM::ZeroMQ::Context#new за пределы EM петли.

См. README

1 голос
/ 22 ноября 2011

Наконец-то я понял, что эта проблема возникает только при использовании ruby ​​1.9.3p0, поэтому кажется, что это ошибка этой версии ruby. С ruby ​​1.9.2 все работает как шарм.

...