Сервер с поддержкой ZeroMQ перестает отвечать через некоторое время

61
5

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

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

спросил(а) 2021-01-19T15:46:04+03:00 2 месяца, 3 недели назад
1
Решение
62

Ваш ZeroMQ-контекст извлекается сборщиком мусора.

Вам нужно переместить свой вызов в EM::ZeroMQ::Context#new вне контура EM.

См. README

ответил(а) 2021-01-19T15:46:04+03:00 2 месяца, 3 недели назад
61

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

ответил(а) 2021-01-19T15:46:04+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема