2011-04-22 18 views
6

Tengo una pregunta me molesta un tiempo. Por ejemplo, tengo un servidor multiproceso, cuando recibe una solicitud, pasa esta solicitud a un controlador, este controlador procesará esta solicitud. Una de las razones que hacen multiproceso servidor es: si no es multiproceso, cuando el servidor de procesamiento de esta solicitud, durante el tiempo de significado, otra petición que viene, a continuación, esta solicitud será gota, debido a que el servidor no está disponible ahora.Alternativa de multihilo en Java

así que me pregunto si hay una alternativa de servidor multiproceso, por ejemplo, podemos crear una cola para el servidor no multihilo? cuando puede obtener otra solicitud de la cola una vez que termina una.

+0

Si el solicitante no necesita una respuesta sincronizada, solo implemente un servicio de búsqueda de mensajería básica. El componente que recibe las conexiones de red todavía tiene que ser de subprocesos múltiples, pero simplemente absorbe los datos de solicitud y los deposita en la cola (FIFO). Tiene un hilo de lector único para sacar el mensaje más antiguo de la cola para el procesamiento real. Este tipo de modelo se ha utilizado durante muchos años y es común para los sistemas de mensajería punto a punto. – ewh

Respuesta

1

Aún puede tener un motor de rosca simple con un servidor de subprocesos múltiples.

considere el siguiente esqueleto: si tiene un motor que se ejecuta, puede ser completamente único, simplemente entregando las solicitudes en el orden en que se reciben. Esto le permite utilizar componentes que no sean seguros para subprocesos en la lógica de negocios, y ha logrado separar su capa de red de la capa de lógica de negocios. Es un escenario de ganar-ganar.

class Engine implements Runnable { 

    private final Object requestLock = new Object(); 
    private List<Request> requests = new LinkedList<Request>(); 
    private boolean running = true; 

    private Request nextRequest() { 
     synchronized(requestLock) { return requests.poll(); } 
    } 

    /** 
    * The engine is single threaded. It doesn't care about server connections 
    */ 
    public void run() { 
     while(running) { 
      Request request = nextRequest(); 
      // handle your request as normal 
      // also consider making a mechanism to send Responses 
     } 
    } 
} 
2

Sí, usted puede tener una event-based server. Esta capacidad es ofrecida por el paquete java.nio, aunque podría usar un marco como netty en lugar de hacerlo desde cero.

Sin embargo, tenga en cuenta que si bien esto solía considerarse una forma de obtener un mejor rendimiento, parece ser un servidor multiproceso regular en realidad offers better performances con el hardware y los sistemas operativos actuales.

2

Sí se puede. ¿Ha considerado las técnicas SEDA-like (es decir, las técnicas event-driven)? Es posible que desee investigar la biblioteca Netty también. Hace la mayor parte del trabajo para ti cuando se trata de usar NIO.