新年第一篇,写点有关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中。

结束

疫情还在继续,大家保重。