【奈学教育】| 公开课RocketMq学习笔记七、延时需求业务场景分析及实现
一、延时需求场景
1:延时需求:由业务场景或现实情况决定,需要在当前时候之后某一时间触发指定的业务逻辑或操作。
2、即时通讯消息重发:IM系统为了确保消息触达接收方,消息发出几秒后没有收到ack,需要重发消息。
3、订单状态流转:取消规定时间内未付款的订单商家发货后,长时间未确认的订单自动确认收货。
4、外置索引更新:信息发布后外置索引更新相对滞后,立刻查询可能会查不到。
二、解决方案
1、Sleep:线程睡眠然后去处理:不靠谱
2、定时扫描数据库的更新时间和创建时间
1)增大数据库压力
2)不精准
3、实现延时触发
1)时间轮询算法
a:可以用于高效的执行大量的定时任务,实现简单并且有非常高的精度。
b:利用数据结构==> 数组+链表
c:基本概念:事件、桶、游标、时间精度、循环数组
三、即时通讯业务场景
1、描述:服务端将消息推送到客户端后,如果15秒之内没有收到客户端的ACK 确认,则重新发送消息。
2、逻辑设计
1)构造内存时间轮
桶数量:15、时间粒度:秒
2)执行逻辑
a:消息发出后,将事件放入游标的前一个桶;
b:收到ACK后记录ACK事件
c:遍历当前桶,重发没有ACK的消息
3、细节分析
1)发消息与ACK事件配对
a:全局唯一消息ID
2) 数据量与计算量
a:每条消息都要放入轮子
b:每条ACK都要保存
c:当前桶的消息都要查找一边ACK 是否存在
3)优化
a:已超时ACK忽略
b:收到ACK 从时间轮里清楚发送事件数据
创建消息id到事件轮中事件的索引
4、分析、优化
1)内存时间轮问题
a:可靠性差:重启、机器掉电、宕机上线数据丢失
b:不易维护:扩容/缩容、服务迁移
四、时间轮询存储选择
1、数据模型
KV/KList
2、数据特性
时效性
3、Redis 时间轮设计
1)KList存储桶
2)String存储游标
3)主从部署避免单点故障
五、功能到服务化
1、适用更多场景
1)支持不同跨度的延时
2、高可用方案
1)多个节点提供服务
3、调用方式
4、长时间跨度
1)大轮子
2)存活周期
3)文件+内存
六、高可用方案
1、数据高可靠:Redis存储
2、服务高可用:冗余部署