【发布时间】:2014-01-28 08:47:15
【问题描述】:
我们有一个服务器程序构建来处理来自客户端程序的数据。
此服务器构建为每分钟接受 50K 连接数据。当我们在服务器上没有巨大的负载时,它工作得很好。如果我们遇到负载时的移动,我们开始获得许多 close_wait 连接,这些连接永远不会被服务器释放。
这是我们正在做的方法。
- 只有在读写都有 3 分钟的空闲时间时,服务器才会关闭通道。
- 只有在完成将数据发送到云时,客户端才负责关闭连接。服务器被构建为在同一个套接字通道中接受多个消息
这是我们使用的示例代码
public class Server {
public void start() {
bossGroup = new NioEventLoopGroup(bossThreads);
workerGroup = new NioEventLoopGroup(workerThreads);
bootstrap = new ServerBootstrap();
bootstrap.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.childHandler(new PipelineFactory())
.option(ChannelOption.SO_BACKLOG, serverBackLog);
try {
// Bind and start to accept incoming connections.
bootstrap.bind(new InetSocketAddress("127.0.0.1",6754));
} catch (Exception e) {
throw new RuntimeException(e.getMessage(), e.getCause());
}
}
}
class PipelineFactory extends ChannelInitializer<SocketChannel>{
private static final int SESSION_IDLE_TIME_MIN = 3;
public void addPipeline(ChannelPipeline pipeline) {
// Idle Timer
pipeline.addLast("timeout", new CustomTimeoutHandler(SESSION_IDLE_TIME_MIN, SESSION_IDLE_TIME_MIN, 0, TimeUnit.MINUTES));
// Message Decoder
pipeline.addLast("decoder", new SomeDecoder());
// Message Encoder
pipeline.addLast("encoder", new SomeEncoder());
// Protocol Handler
pipeline.addLast("handler", new DataHandler());
}
@Override
protected void initChannel(SocketChannel ch) throws Exception {
ChannelPipeline p = ch.pipeline();
addPipeline(p);
}
}
我们仍然不知道为什么它会产生许多 close_wait 连接。
请有人指出我们在这里做错了什么?
【问题讨论】:
标签: netty