Несколько серверов в одном реакторе EventMachine
Можно ли запустить несколько серверов на одной машине событий?
Я имею в виду, что несколько клиентских подключений могут одновременно использовать несколько сервисов. Например, сервер входа в систему аутентифицирует пользователя, а затем пользователь может одновременно использовать как чат, так и простую игру, такую как шашки, с одним клиентским сокетом одновременно?
Или мне нужно несколько реакторов Eventmachine для каждой службы?
1 ответ
Я попробовал это, и это работает:
#!/usr/bin/env ruby
require 'eventmachine'
module EchoServer
def post_init
puts "-- someone connected to the echo server!"
end
def receive_data data
send_data ">>>you sent: #{data}"
close_connection if data =~ /quit/i
end
def unbind
puts "-- someone disconnected from the echo server!"
end
end
EventMachine::run {
EventMachine::start_server "127.0.0.1", 8081, EchoServer
EventMachine::start_server "127.0.0.1", 8082, EchoServer
EventMachine::start_server "127.0.0.1", 8083, EchoServer
}
Здесь вы получаете 3 эхо-услуги с разными портами. (Мне было лень внедрять разные сервисы.)
Таким образом, очень легко создать огромную мультисервисную оболочку.
Обновить
Простой пример кода для запуска EM-сервера на основе условий:
#!/usr/bin/env ruby
# encoding: utf-8
require 'eventmachine'
module EchoServer
def post_init
puts "-- someone connected to the echo server!"
end
def receive_data data
send_data ">>>you sent: #{data}"
close_connection if data =~ /quit/i
end
def unbind
puts "-- someone disconnected from the echo server!"
end
end
$check_ok = false
EventMachine::run {
puts "checker var is: #{$check_ok}"
EventMachine::start_server "127.0.0.1", 8081, EchoServer
EventMachine::start_server "127.0.0.1", 8082, EchoServer
puts "echos on 8081 and 8082 started."
# periodic timer check - every 1 sec
EventMachine.add_periodic_timer(1) {
if $check_ok
EventMachine::start_server "127.0.0.1", 8083, EchoServer
$check_ok = false
puts "echo on 8083 started!"
end
}
# timer triggered after 10 secs - only once!
EventMachine.add_timer(10) {
$check_ok = true
puts "checker var is #{$check_ok} now!"
}
}
В этом примере эхо-сервер на порте 8083 запускается через 10 секунд после запуска приложения. Пробовать telnet localhost 8083
до и после этого таймера вы увидите эффект.
Вы также можете использовать значения менее 1 секунды, например, 0,01 для каждой проверки на 1/100-ю секунду.
Это может быть вашей отправной точкой для ваших собственных идей. Периодический таймер - это ваш внутренний цикл, где вы подключаете свои условные проверки для запуска дальнейших сервисов.
Хороший учебник (PDF): введение eventmachine ( сообщение в блоге)