2015-10-29 2 views
2

Я новичок в netty. Я хотел бы создать сервер, который будет получать запросы от немногих (скажем, Max из 2) клиентов. Но каждый клиент будет отправлять много запросов на сервер непрерывно. Сервер должен обрабатывать такие запросы и отвечать клиенту. Итак, здесь я предполагаю, что даже если я настрою несколько рабочих threds, это может быть не полезно, поскольку есть только 2 активных соединения. Рабочий поток снова блокируется, пока он не обработает и не ответит на клиента. Поэтому, пожалуйста, дайте мне знать, как справиться с этими проблемами. Если я использую threadpoolexecutor в рабочем потоке для обработки запросов клиентов в многопоточном режиме, будет ли он эффективным? Или, если его трость достигнута с помощью netty framework, PLZ сообщите мне, как это сделать? Заранее спасибо ...Netty multi threading для подключения

ответ

0

Если я правильно понимаю: ваши клиенты (2) отправят много сообщений, каждое из которых будет как можно быстрее отвечать на сервере с сервера.

2 варианта можно увидеть:

  1. Процесс answear является короткий промежуток времени (достаточно коротким, чтобы не быть isssue для скорости вы хотите достичь, то есть 1 нить может answear так же быстро, как вы требуется для 1 клиента): тогда вы можете оставаться со стандартными потоками от Netty (1 рабочий поток для 1 клиента за раз), установленным в загрузочном буфере сервера. Это самый короткий путь.

  2. Процесс ответа не является достаточно коротким (скорость будет ужасной, например, потому что существует «длительный процесс», такой как блокировка вызова, доступ к базе данных, запись в файле ...): тогда вы может добавить пул потоков (группу) в конвейере Netty для вас, ChannelHandler делает такой блокирующий/длительный процесс.

Вот выдержка из документации API, взятой из ChannelPipeline: http://netty.io/4.0/api/io/netty/channel/ChannelPipeline.html

// Tell the pipeline to run MyBusinessLogicHandler's event handler methods 
// in a different thread than an I/O thread so that the I/O thread is not blocked by 
// a time-consuming task. 
// If your business logic is fully asynchronous or finished very quickly, you don't 
// need to specify a group. 
pipeline.addLast(group, "handler", new MyBusinessLogicHandler()); 
+0

Я реализовал DefaultEventExecutorGroup и добавил мой обработчик для запуска под этой группы трубопровода, как указано. Просто добавьте S.O.P для печати имени потока и Thread.sleep (2000), чтобы увидеть имя потока и запущены ли параллельные потоки и отправить 3 сообщения на сервер от одного клиента. Но он всегда показывает тот же номер потока для всех 3 сообщений на сервере. Если я добавлю threadpoolexecutor в свой обработчик и отправлю сообщения в threadpoolexecutor, он будет работать параллельно. Могу ли я использовать структуру исполнителей пула потоков? будет ли какая-то разница? PLZ помощь ... –