2011-05-27 12 views
6

¿Es posible ejecutar varios servidores dentro de una única máquina de eventos?Múltiples servidores en un solo reactor EventMachine

Lo que quiero decir es que múltiples servicios se pueden usar al mismo tiempo mediante una única conexión de cliente. Por ejemplo, un servidor de inicio de sesión autentica a un usuario y luego un usuario puede usar simultáneamente una sala de chat y un juego simple como las damas con un solo socket de cliente.

¿O necesito reactores múltiples para cada servicio?

+0

yo esperaría si el protocolo es inequívoca que usted debe ser capaz de ejecutar miles de diferentes servicios dentro de un proceso de servidor. – sarnold

Respuesta

7

yo probamos este y que está funcionando:

#!/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 
} 

aquí se obtiene 3 Servicios de eco con diferentes puertos. (Era demasiado perezoso para implementar diferentes servicios).

Por lo tanto, es muy fácil crear una gran envoltura multiservicio.


actualización

ejemplo de código simple para el arranque basado en la condición de un servidor 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!" 
    } 
} 

En este ejemplo se inicia el servidor de eco en el puerto 8083 ~ 10 segundos después del inicio de aplicaciones . Intenta telnet localhost 8083 antes y después de este temporizador, verás el efecto.

También puede usar valores inferiores a 1 segundo, como 0,01 por cada 1/100 segundos de verificación.

Este podría ser su punto de partida para sus propias ideas. El temporizador periódico es su ciclo interno, en el que engancha sus comprobaciones condicionales para iniciar servicios adicionales.


buen tutorial (PDF): eventmachine introduction (blog post)

+0

Gracias, por lo que para mí eso implica que no puede agregar más servidores durante el tiempo de ejecución si es necesario. ¿Es eso correcto? – david

+0

No diría que es imposible. Puede implementar un bucle donde luego puede agregar servicios en tiempo de ejecución, pero esto necesita una mirada más profunda en eventmachine. Útil en este caso podría ser 'EM.add_periodic_timer' para verificar cada x segundos si una determinada condición cumple y tiene que iniciar un nuevo servidor EM, pero aún no se ha probado. – asaaki

+0

Eche un vistazo a la respuesta actualizada, allí obtendrá una primera idea de los inicios en tiempo de ejecución de los servicios. – asaaki

Cuestiones relacionadas