2013-04-02 49 views
1

我们在我们的游戏公司中使用Netty3.2.1进行客户端和服务器之间的连接管理。我们的目标是提高在blip场景中处理Netty连接

  1. 能够处理昙花一现场景,如网络中断,并必须能够从这一尽快恢复。
  2. 增加单个服务器可以处理的连接数量,而不必删除现有的连接套接字。

昙花一现方案 在实时环境中,人们是由于ISP故障光点的机会,所以所有现有客户(我们的客户火重新连接后,现有的连接断开)连接将打破,并在同一重新连接时间 。例如,如果服务器连接到25000个客户端,则所有25000个客户端都会在blip期间同时尝试连接到服务器,这会给服务器带来巨大的压力。由于Netty旧版本不提供启用/禁用功能,所以我们开始将连接限制在超过100个并发连接ssl握手的限制之外。当限制超出限制时,我们暂停老板线程。我们尚未准备好使用提供该功能的Netty 4.0 Beta版本。

我们在压力测试期间观察到的其他情况是,如果服务器上有大量传入连接,则需要很多时间才能接受所有传入连接并稳定(25 K连接约30分钟,全部25 K尝试同时连接)。但是,如果我们缓慢加载负载,netty能够在很短的时间内(大约3到5分钟)轻松接受所有连接。我们希望建立这样一个系统,以便我们能够灵活地处理blip场景。

  • 我在现有的Netty Jar中添加了一些日志,当客户端在巨大负载下断开连接时,它似乎在read()方法中失败。
  • 使用Netty3.6最终的jar,没有多大帮助
  • 将使用执行处理程序的帮助吗?
  • 禁用限制导致服务器上出现OOM异常。

请提出任何可能的方法来解决此问题。 有没有其他的方法来节制连接?

设置细节和配置

客户 - JMeter的框架 - 2个GB机 负载 - 50000个客户 没有每秒消息 - 12000个消息/秒。消息以客户端hello和sever hello作为字符串。 的ulimit在所有机器上是1,00,000

服务器 - 12核心,HT和48 GB RAM 工作线程 - 50(两次没有与核HT它没有核成为24) 所有TCP内部linux机器的缓冲区被配置为使用峰值限制。

我们的管道处理程序有以下处理

  • 管道。addLast(sslHadler) - 构建的处理程序中的Netty
  • pipeline.addLast(messageEncoder) - 只对字节进行编码和解码,并根据需要将它们转换为消息帧。
  • pipeline.addLast(messageDecoder)
  • pipeline.addLast(Businesshandler)

回答

0

我觉得没有太多你可以用网状3.x的在这里做的,也许旁边设置的积压数量少所以客户端需要稍后重新连接。

所以我认为你最好的选择是一旦可能就升级到Netty 4。对不起....

+0

嗨诺曼非常感谢答复。最后一件事,在这个blip场景中,我们看到现有的套接字也正在关闭。发生这种情况的地方是在Nioworker.java read()方法{if(ret <0 || failure){0,关闭(channel,succeededFuture(channel)); return false;}}请让我知道为什么会出现这种情况。这里,ret值为0,决定“ret”值的代码类似于{while((ret = ch.read(bb))> 0)readBytes + = ret; if(!bb.hasRemaining()){ break;}}}为什么会发生这种情况?3.2.1 vers中的任何错误? – codeninja