Сколько подключений может выбрать селектор в java.nio по одному за раз? - PullRequest
1 голос
/ 22 ноября 2010

Я провел небольшое исследование о новом сокете Java NIO. Я использую MINA для построения имитируемого сервера, который принимает соединение от многих клиентов (около 1000) и обрабатывает данные, полученные от них. Я также настроил клиентский симулятор, который создает около 300 клиентских подключений и отправляет данные на сервер, используя поток. И в результате часть соединения прерывается сервером. Код ниже

 try {
  listener = new NioSocketAcceptor(ioThread);

  listener.getFilterChain().addLast("codec", new ProtocolCodecFilter(new MessageCodecFactory()));
  listener.getFilterChain().addLast("thread", new ExecutorFilter(100, 150));
  listener.setHandler(new IncomingMessageHandler(serverMessageHandler));

  listener.bind(new InetSocketAddress(PORT));
 }
 catch (IOException ioe) {
 }

А вот обработчик, Session - мой класс для каждого соединения с клиента

 @Override
 public void sessionCreated(IoSession session) throws Exception {
  new Session(session.getRemoteAddress(), handler, session);
  super.sessionCreated(session);
 }

 @Override
 public void messageReceived(IoSession session, Object message)
   throws Exception {

  Message m = Message.wrap((MessagePOJO)message);
  if (m != null) {
   Session s = SessionManager.instance.get(session.getRemoteAddress());
   if (s != null) {
    s.submit(m);
    ArmyServer.instance.tpe.submit(s);
   }
  }

  super.messageReceived(session, message);
 }

 @Override
 public void sessionClosed(IoSession session) throws Exception {
  Session s = SessionManager.instance.get(session.getRemoteAddress());
  if (s != null)
   s.disconnect();
  super.sessionClosed(session);
 }

И клиентский симулятор, РАЗМЕР ~ 300 - 400

     for (int i = 0; i < SIZE; i++) {
  clients[i] = new Client(i);
  pool[i] = new Thread(clients[i]);
  pool[i].start();
 }

Итак, вопрос в том, сколько соединений может принять Мина по одному за раз? Или в моем коде что-то не так?

Ответы [ 2 ]

3 голосов
/ 10 декабря 2010

Возможно, вы просто перегружаете сервер. Он сможет принимать столько запросов одновременно из-за ограничений ОС и ЦП. Если в ServerSocket будет больше ожидающих запросов, чем длина очереди прослушивания, соединения будут отклонены.

Попробуйте увеличить длину очереди прослушивания (параметр backlog в ServerSocket.bind()) и / или добавить небольшое количество sleep () в клиентском цикле for.

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

2 голосов
/ 22 ноября 2010

Из того, что я вижу, нет задокументированного ограничения на количество каналов, из которых может выбирать селектор. Обычно будет предел реализации на Integer.MAX_VALUE или что-то подобное. Для этого конкретного случая я предполагаю, что предел заключается в том, как реализован SelectorProvider, и я уверен, что он является родным для большинства JVM ...

Похожие вопросы:

Статья по теме:

...