环境:springwebsocket,tomcat7,8
最近再做直播的项目,大家知道直播都有弹幕。
在技术选型的时候没多考虑,就选了springwebsocket,网上demo很多。
基本功能就是聊天。开发,测试都没啥问题,可有两次活动人数比较多,直播过程中有几个并发量很大的游戏功能,导致Broken pipe ,服务崩溃,搞的现场很尴尬。
回来开始重现,业务场景:用户进入直播间给房间每个人发送通知(XX来了),用户退出直播间给房间每个人发送通知(XX离开)。
最终发现是大量用户进入直播间和大量用户退出直播间时,有些用户退出了还给他发发消息导致。
如果用户退出不广播消息也不会出现这个问题,但是这个功能必须要有,没办法,只好研究。
这个问题非常恶心(研究了4天),是在linux下出现,Windows是报java.io.IOException: Key must be cancelled,道理都是一样的。网上案例很少,国外论坛都说是tomcat7,8的bug。
https://bz.apache.org/bugzilla/show_bug.cgi?id=57489
http://tomcat.10.x6.nabble.com/Bug-57489-New-java-util-concurrent-ExecutionException-java-io-IOException-Key-must-be-cancelled-td5028703.html
之后开始捣鼓jboss,为什么要研究jboss呢?据说jboss的并发支持很好,集群也稳定,以前也用过,很久没弄了。这东西也搞了一天,从7(好像不支持websocket)到8,然后到wildfly,最后启动成功,发现ws协议请求不到,没时间在耽误了。最终换了tomcat9,然后测试,可以暂时解决问题,服务不会挂掉,后续还要继续测试。
期间空余时间都在研究websocket方案,看来以后要换nodejs或netty。
8种websocket框架比较:
http://mp.weixin.qq.com/s?__biz=MzA5ODM5MDU3MA==&mid=2650861883&idx=1&sn=e87d99fc442314c6a55cc638c6abfda5&mpshare=1&scene=1&srcid=0223HHzJmV1Zam5jZn2pJ7z4#rd