最常用的两个协议:消息发送和消息拉取。
消息发送,我们看过源码,消息发送时,先缓存到累加器,然后 sender 线程拉取,组装成按分区划分的数据结构(Node,list<>)这种的,然后在组装成 request 发送出去。这里的把消息,进行分区划分,组装起来,客户端去完成。省的服务器再去做消息分区的事情了。
消息拉取,消息拉取是需要维护一个 topics,这个 topics 变化不大,但是每次请求都发送浪费带宽,因此想到去维护状态,使用 session。第一次发送是保存 session,之后就请求都不用带 topics,等到 topics 有变化,再去全量发送请求,更新 session。这样当请求量非常大时,是这一个 topics 字段是节约了很多空间的。
看到这个 sessionid。
timer 和 delayQueue 插入和删除都是 nlogn 的时间复杂度。(timer 维护一个二叉平衡堆,delayQueue维护一个优先级队列,优先级队列维护一个堆)
TimingWheel
scala 源码
看不懂,不知道 delayQUeue 和时间轮怎么配合使用的。
timeWheel 和 delayqueue 配合使用,时间轮做任务的插入和删除,delayQueue 来做时间的计量。