2012-06-14 1 views
0

Сервер, как правило, выполняет следующие операции:Будет ли Netty хорошим выбором для реализации мультиплексора сервера?

-Netty сервер получает клиентское соединение XX на порту tcp (все очень простой текстовый протокол).

-Netty получить запрос на авторизацию.

-Netty теперь создаст группу каналов clientX - внутри этой группы каналов он создаст 4 tcp-соединения (по одному на каждый внешний сервер), выполнит auth на серверах для пользователя и отправит обратно 1 ACK в clientX.

-После получения следующего запроса от клиентаX он будет маршрутизировать/ретранслировать сообщение в connection1 в группе каналов clientX.

-Получите следующее сообщение и запрос маршрута/ретрансляции к соединению2 в группе каналов clientX.

-Отключить запрос на выход, отключить группу каналов, которая, в свою очередь, отключит все соединения внутри группы каналов clientX.

-сообщений, полученных от любого из внешних серверов должны быть проложены/ретранслируется обратно в clientx (MUX)

ответ

2

Такие вещи можно сделать с помощью Netty.

Я думаю, хорошая отправная точка является прокси примера:

https://github.com/netty/netty/tree/3/src/main/java/org/jboss/netty/example/proxy


Я изменил прокси пример реализации сервера, как описано выше. design: with netty-3.5.3

Клиенты < -> | (s-soc) -MUX_NIO_server- (c-socks) | < -> сервер1 (фунты)

         |<->server2 
             |<->server3 
             |<->server4 

трубопровода => framedecoder -> stringdecoder -> ClientHandler -> framedecoder -> stringdecoder -> serverHandler-- |

Он работает на 100%, пока не достигнет +/- 100 tps, тогда одно и то же сообщение от клиента снова и снова отправляется на сервер, выглядит как тупиковая ситуация.

В обоих обработчиков мои channelInterestChanged событий выглядит следующим образом:

// channelInterestChanged синхронизирована (trafficLock) {

if (e.getChannel().isWritable()) { 

     inboundChannel.setReadable(true); 

      if (inboundChannel != null) { 

      inboundChannel.setReadable(true); 
     } 

    } 

}

в обоих обработчиков сообщений гх я пишу так:

synchronized (trafficLock) {

final ChannelFutureListener writeListener = 
       new ChannelFutureListener() { 

        @Override 
        public void operationComplete(final ChannelFuture future) 
          throws Exception { 
         if (Consts.DEBUG_ENABLED) { 
          log.debug("Finished Writing message); 
         } 
        } 
       }; 

     /* if channel is write */ 
     if (inboundChannel.isWritable()) { 
       inboundChannel.write(bufferMsg).addListener(writeListener); 
     } 
     // If inboundChannel is saturated, do not read until notified in 
     if (!inboundChannel.isWritable()) { 
      e.getChannel().setReadable(false); 
     } 

}

Любая идея, что может быть не так, и где искать, чтобы это исправить?Спасибо

+0

Спасибо, я сначала должен проработать основные примеры :( – Neels

+0

Думаю, это тоже выглядит как хороший пример? Http://www.littleshoot.org/littleproxy/xref/index.html – Neels