文章目录
本地消息调度框架业务适配参考指南
作者:赵世攀
一、解决的目标问题
- 消息最终一致性解决方案。
- 微服务化的调度服务,强化生产侧的一致性和即时性。
二、demo演示
1、架构说明
1)职能图
2、调度全流程演示
1)环境准备
a.源码下载
git clone https://github.com/FantasyZsp/msg-schedule.git
git checkout feature_example_delay & git pull
b.表准备
执行src/main/resources/db
目录下的脚本。
-
error_message.sql
-
错误消息记录表
-
local_delay_message.sql
-
本地延时消息表
-
在实际的业务中,可以根据需要设定多张表,表名自定义。
注意:表名需要和yml文件中调度的表名大体保持一致以便区分调度对象。
所有调度框架中自定义的表实体和调度组件,其相关的targetTableName的字段值应该是完全一样的,否则将会无法正确调度。
-
-
-
local_instant_message.sql
-
本地即时消息表,同延时注意事项。
-
order.sql
- 业务订单表,模拟业务入库。
c.外部化配置说明
详见config-template.yml文件内置说明。
application.yml文件给出了对应表的配置信息。相关配置可参考源码注释。
2)mq准备
https://gitee.com/fantasyzsp/deploy-collection/tree/master/rocketmq-deploy
根据网络环境配置https://gitee.com/fantasyzsp/deploy-collection/blob/master/rocketmq-deploy/data/brokerconf/broker.conf#L32后拉起镜像
3)服务调度演示
a.启动时调度
b.即时消息调度
c.延时消息调度
store、pushlisher、listener、porterrouter、porter组件
d.组件工作说明
三、业务适配
1、适配场景演示
效果参考服务调度演示。
几乎所有现有业务都可以采用此种方式。
2、业务接入说明
用户如果接入表,需要做的事情
参考example模块做法点击查看
-
引入依赖。
<dependency> <groupId>xyz.mydev</groupId> <artifactId>msg-scheduling-autoconfigure</artifactId> <version>${msgSchedulingVision}</version> </dependency>
-
根据需要仿照LocalDelayMessage实现接口消息,例OrderMessage
-
实现消息实体需要的MessageRepository,并注入spring容器中
-
在yml中配置调度的信息,参考LocalDelayMessage的相关配置
-
注意保证MessageRepository的实现里, getTableName()返回值使用OrderMessage中值,并保证yml中配置的表名和 getTableName()返回值完全一致。
-
在yml中,配置合适的调度间隔。目前仅限5, 10, 15, 20, 30调度级别。
- 调度级别仅代表部分后台定时任务的执行间隔,不会影响消息时延。
- 一般在消息量大或总是较集中爆发时考虑配置较小的间隔,以减轻延时消息场景的预调度压力。
四、个别实现细节
时间处理
时间矫正
检查点处理
定时维护检查点
TODO 与调度联动,实现快速纠正失败投递
任务调度
检查点调度
加载调度
分布式调度与锁粒度
五、更多特性
1、支持用户根据表特点自己实现Porter接口以调整调度行为。
六、TODO
- 框架对于MessageRepository的api是固定的,考虑BaseMapper的做法,提供简单快捷的实现而不必用户CV模板样例实现。
- checkpoint模块与porter调度模块通讯,以提供即时故障恢复的机制,而不必等下次服务重启才做失败消息的failover
- 延时消息特例判定即时调度
- 处于过去时间点的延时消息投递时走即时投递流程
- 更严谨的配置校验。
- 组件生命周期管理
- 防止过早启动调度。
- 更优雅的抽象实现
- 装饰器模式实现Porter以复用底层能力同时,方便增强调度特性。
- 多样MQ的多种发送消息api支持。
- 不是所有调度都需要rocketmq的事务消息投递才能保证一致性,可以考虑异步回调的方式进一步降低时延增大吞吐。
- 提供消费流程的接入或者demo
- 处理框架级别消费幂等处理。