Netty是服务器多路复用器实现的不错选择吗?

时间:2012-06-14 12:45:51

标签: netty

服务器通常会执行以下操作:

-Netty服务器在tcp端口接收clientX绑定。(所有非常简单的文本协议)。

-Netty接收身份验证请求。

-Netty现在将创建一个名为clientX的通道组 - 在此通道组内,它将创建4个tcp连接(每个外部服务器一个)在服务器上为用户执行auth,并向clientX发送1个ACK。

- 接收来自clientX的下一个请求,它会将消息路由/中继到clientX的通道组中的connection1。

- 在clientX的通道组中接收下一条消息和路由/中继请求到connection2。

- 接收注销请求,断开通道组,从而断开clientX通道组内的所有连接。

- 从任何外部服务器收到的消息必须路由/中继回clientx(mux)

1 个答案:

答案 0 :(得分:2)

这样的事情可以用netty来完成。

我认为一个好的起点是代理示例:

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


我已修改代理示例以实现上述服务器。 设计:使用netty-3.5.3

客户< - > |(s-soc)-MUX_NIO_server-(c-socks)|< - > server1(lb)

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

管道=&GT; framedecoder - &GT; stringdecoder - &GT; ClientHandler的 - &GT; framedecoder - &GT; stringdecoder - &GT; serverHandler-- |

它运行100%直到达到+/- 100 tps,然后来自客户端的相同消息一遍又一遍地发送到服务器,看起来像死锁情况。

在两个处理程序中,我的channelInterestChanged事件如下所示:

// channelInterestChanged  synchronized(trafficLock){

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

        inboundChannel.setReadable(true);

          if (inboundChannel != null) {

             inboundChannel.setReadable(true);
         }

  }

}

在两个处理程序中的消息rx我这样写:

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);
        }

}

知道可能出现什么问题以及在哪里解决这个问题?谢谢