Несколько серверов в одном реакторе EventMachine

Можно ли запустить несколько серверов на одной машине событий?

Я имею в виду, что несколько сервисов могут использоваться одновременно одним клиентским соединением. Например, сервер входа в систему аутентифицирует пользователя, а затем пользователь может одновременно использовать как чат, так и простую игру, такую ​​​​как шашки, с одним клиентским сокетом?

Или мне нужно несколько реакторов событийной машины для каждой службы?


person david    schedule 27.05.2011    source источник
comment
Я ожидаю, что если протокол однозначен, вы сможете запускать тысячи различных служб в рамках одного серверного процесса.   -  person sarnold    schedule 28.05.2011


Ответы (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 (запись в блоге)

person asaaki    schedule 01.06.2011
comment
Спасибо, так что для меня это означает, что вы не можете добавить больше серверов во время выполнения, если это необходимо. Это правильно? - person david; 07.06.2011
comment
Не сказал бы, что это невозможно. Вы можете реализовать цикл, в котором вы затем позволяете добавлять службы во время выполнения, но для этого требуется более глубокий взгляд на машину событий. В этом случае может быть полезно EM.add_periodic_timer проверять каждые x секунд, выполняется ли определенное условие и должен ли запускаться новый EM-сервер, но это еще не проверено. - person asaaki; 07.06.2011
comment
Взгляните на обновленный ответ, там вы получите первое представление о запуске сервисов во время выполнения. - person asaaki; 07.06.2011
comment
Спасибо за вашу помощь. Я поиграюсь с этим еще, но я думаю, что IO::Reactor может быть лучшим решением для меня. - person david; 09.06.2011