2011-04-22 3 views
6

У меня есть вопрос, который меня беспокоит. Например, у меня есть многопоточный сервер, когда он получает запрос, он передает этот запрос обработчику, этот обработчик обработает этот запрос. Одна из причин, почему мы создаем многопоточность сервера: , если он не является многопоточным, когда сервер обрабатывает этот запрос, в течение значащего времени приходит другой запрос, тогда этот запрос будет удален, так как сервер недоступен.Альтернатива MultiThreading в Java

Так что, интересно, существует ли альтернатива многопоточному серверу, например, мы можем создать очередь для сервера без многопоточности? когда он может получить другой запрос из очереди после его завершения.

+0

Если запрашивающий не нуждается в синхронном ответе, просто выполните базовую службу обслуживания сообщений. Компонент, который получает сетевые подключения, по-прежнему должен быть многопоточным, но он просто разрывает данные запроса и выгружает его в очередь (FIFO). У вас есть один поток чтения, чтобы вынести старое сообщение из очереди для фактической обработки. Такая модель использовалась в течение многих лет и является общей для систем обмена сообщениями «точка-точка». – ewh

ответ

1

У вас все еще есть однопоточный двигатель с многопоточным сервером.

Рассмотрите следующий скелет - если у вас есть Двигатель, который работает, он может быть полностью однопоточным, просто передавая запросы в том порядке, в котором они получены. Это позволяет использовать небезобезопасные компоненты в бизнес-логике, и вам удалось отделить ваш сетевой уровень от уровня бизнес-логики! Это беспроигрышный сценарий.

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

Да, у вас может быть event-based server. Эта возможность предлагается пакетом java.nio, хотя вы можете использовать фреймворк вроде netty, а не делать это с нуля.

Однако обратите внимание, что в то время как это считалось способом повышения производительности, он выглядит как обычный многопоточный сервер на самом деле offers better performances с сегодняшним оборудованием и операционными системами.

2

Да, вы можете. Вы считали методы SEDA-like (т. Е. Методы event-driven)? Вы можете также изучить библиотеку Netty. Это делает большую часть работы для вас, когда дело доходит до использования NIO.