netty
新年第一篇,写点有关netty和websocket推送相关的。
这些年用到netty的项目挺多的,但也一直没有仔细研究一下,最近在做websocket的测试,
所以就用netty分别写了client端和server端,只是一个简单的应用。
hydra
Hydra 项目在这里,代码细节我就不介绍了,大家在网上都可以搜到。
关于websocket的压缩
我在性能测试过程中,曾经开启过WebSocketServerCompressionHandler,发生了缓慢内存泄露。
经排查,Jvm堆内、外都没有问题,但free -m显示的内存剩余一直在降低,直到被OS-Kill掉。
在netty的git-issue上搜索找到了相关信息(见ISSUE-9803)。
推送
说到推送,肯定会提到socket.io这个项目,这几年非常火,值得研究一下。
推送里有一个非常常见的问题,就是同一个账号的多端推送。
举例:你在手机和网页都登录了,当你的账号有新的订单成交时,都应获得通知消息的推送。
所以在推送服务器的内存中,就要维护一个Map,Key为Uid,Value是多端的Channels集合。
在编写这段逻辑时,我希望尽量少的使用lock,但是uid所在的entry,需要保持原子性。
如果手机端退出登录和网页端登录,在同一时刻发生,维护这个channels在map中的原子性就非常困难。
解决方案有两种:
1、当channels集合为空时,并不把它从map中remove掉,会导致Map中有一些垃圾信息。
2、使用ConcurrentSkipListMap来替代Map<String,Set
最后我选择了方案2,在Hydra项目中的Server模块ChannelManager中。
结束
疫情还在继续,大家保重。