服务器通常会执行以下操作:
-Netty服务器在tcp端口接收clientX绑定。(所有非常简单的文本协议)。
-Netty接收身份验证请求。
-Netty现在将创建一个名为clientX的通道组 - 在此通道组内,它将创建4个tcp连接(每个外部服务器一个)在服务器上为用户执行auth,并向clientX发送1个ACK。
- 接收来自clientX的下一个请求,它会将消息路由/中继到clientX的通道组中的connection1。
- 在clientX的通道组中接收下一条消息和路由/中继请求到connection2。
- 接收注销请求,断开通道组,从而断开clientX通道组内的所有连接。
- 从任何外部服务器收到的消息必须路由/中继回clientx(mux)
答案 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);
}
}
知道可能出现什么问题以及在哪里解决这个问题?谢谢