2015-02-11 4 views
0

Я пытаюсь обвести голову вокруг создания асинхронного (не блокирующего) HTTP-сервера с использованием java NIO. В настоящее время я имею реализацию threadpool и хотел бы сделать ее в Event Driven с помощью одного потока.Сервер, управляемый событиями, используя Java NIO

Как работает сервер, управляемый событиями? Нужны ли нам потоки?

Я читал на каналах, буферах и селекторах Java. Итак, после создания serverSocketChannel и селектора и прослушивания запросов, мне нужно передать запрос другим потокам, чтобы они могли обрабатывать их и обслуживать запрос. Если да, то как он отличается от реализации threadpool.

И если я не создаю больше потоков, которые могут обрабатывать запрос, как один поток может продолжать прослушивать запросы и обрабатывать их. Я говорю SCALABLE, скажем, 1 миллион запросов в общей сложности и 1000 поступающих одновременно.

+1

Вы видели [Netty] (http://netty.io/)? Если нет, я не могу рекомендовать библиотеку достаточно высоко для асинхронной сети. Вам все равно придется обернуть вокруг асинхронного ввода-вывода как концепцию, но Netty поможет вам понять, что ваш дизайн более ясен, на мой взгляд. – Dev

+0

Спасибо, я попробую. Но сейчас я должен сделать это, не используя никакой библиотеки. Поэтому я просто искал концепцию, чтобы начать. –

ответ

0

Я читал на каналах, буферах и селекторах Java. Поэтому после того, как я создаю serverSocketChannel и селектор и слушаю запросы, мне нужно передать запрос другим потокам, чтобы они могли обрабатывать их и обслуживать запрос.

Нет, идея состоит в том, что вы обрабатываете данные по мере их использования, не обязательно используя потоки.

Устранение возникает из-за необходимости обрабатывать данные по мере того, как наступает. Например, вы можете не получить полный запрос сразу. В этом случае вам нужно буферизировать его где-нибудь, пока не получите полный запрос, или обработайте его по частям.

Как только у вас есть запрос, вам необходимо отправить ответ. Опять же, весь ответ обычно не может быть отправлен сразу. Вы отправляете столько, сколько можете, без блокировки, затем используйте селектор, чтобы ждать, пока вы не сможете отправить больше (или произойдет другое событие, например, другой запрос).

+0

означает ли это, если сервер обстрелялся запросами, такими как 1000 одновременных запросов, а затем еще до миллиона, он не сможет написать никому? Означает ли это, что размер буфера должен быть достаточно большим для 1000 запросов? –

+0

Обычно запросы буферизуются на уровне ОС. Я не уверен, что вы подразумеваете под буферизацией 1000 запросов; вы обычно связываете отдельный буфер с каждым запросом (если вы не можете обрабатывать запрос по частям). Вы можете выбрать, какие каналы вы хотите обработать, поэтому нет причин, по которым вы не сможете писать каналы, ожидающие ответа, даже если у вас было огромное количество входящих запросов. – davmac

+0

О, это имеет смысл. Итак, я могу создать новую пару канала-буфера для каждого запроса, который я получил? –