作者回复: 基本没错,不过这里有一点说一下:不管是不是网关机维护本地状态的方式,消息最终下发都是需要通过网关机推下去的哈,只是网关机本地维护状态的方式会浪费掉一些其他网关机的计算。
作者回复: 不需要建连时耦合群信息相关内容,这个问题可以采用分批下发给网关来解决,比如一批100这样。
作者回复: 嗯,是的,私有消息是聚合,删除是剔除。
作者回复: 之前有提到微信手机端应该走的是tcp私有协议,不是websocket。另外你提到的websocket弱网下容易掉线这个得具体case分析一下,不能把这个归结到websocket协议本身,底层一样都是基于tcp来传输的。连接不稳定和很多因素有关,连接入口的是否够快,有没有故障转移通道,能否快速识别到连接断开然后快速进行重连,网络传输的数据是否够小够精简,这些都有关系。微信有一些公开对外演讲的资料,可以查一下。
作者回复: 哈哈,感谢支持和肯定~
作者回复: 这个方案的问题在于:群聊的使用场景并不存在说“某个用户在某个群在线”这么个说法,和直播的房间概念是不一样的。可以认为只要用户上线就应该处理所有群的消息。
作者回复: 其实就是把群聊消息删除这个单独记录一下,比如一个list里面,key是 uid_群id,value是这个uid在这个群删除的消息id。最后这个用户获取群消息时,从群维度的全量消息里剔除掉这个用户在这个群删除的这些消息id。
作者回复: 这里的意思是一个群有一万人的这种超大规模群。只有在线的用户才会建立长连
作者回复: 1. 是的。
2. 一般这种情况可以只下推离线消息,历史消息通过用户来触发拉取。
3. 不保存消息记录是指客户端不在本地存储所有消息?这种方式不太好呀,要不没网就看不了所有聊天记录了。
作者回复: 这个是个问题,实际上也可以不需要按照uid维度来存储消息,按照消息维度存储已上报过 阅读事件的uid就可以。
作者回复: 理论上出现极端情况是会的,但在我们的实践里很少出现大量用户删除某个群的群消息的情况。
作者回复: 像微博是千万级在线,微信具体数据不太清楚。单台网关机虽然理论上能到百万级别,但线上一般控制在几十万比较正常,如果是类似直播的业务会控制在更低水平。
作者回复: 没问题的,非扇出类型的场景可以直接通过在线状态来精确下发,减少网关机负载。
作者回复: 整个这个buffer组件是一个in jvm的组件,timer和flusher是两个功能实现类。可以参考我们前同事开源出去的一个实现:github搜bufferslayer。