- 业务场景背景:
客户业务上云过程中,对于云上一些大型分布式应用系统,存在业务场景复杂、并发请求量大、处理流程长等特征,而且基于实际应用生产需要,不同业务场景的任务工单处理其优先级也不同(如不同优先级的业务订单)。对于这些具有不同执行优先级的处理(或者操作指令),传统做法往往是采用队列方式进行调度,这种做法简洁、处理快,但是弊端是在有优先级情况下,往往会造成低优先的操作指令堵塞高优先级的操作指令,影响业务处理进度,而且也难以做到根据业务规模进行动态调度。
- 实践:
我们可以采用分布式消息组件的消息队列隔离机制,针对不同优先级任务工单类型,构建不同的消息队列,实现不同优先级的任务通过不同的消息通道进行消费,实现不同任务优先级的独立消费调度,互不影响:
1)根据业务特征及其应用生产需要,把要执行的业务队列分为不同的优先级,如:level1、level2、level3 …;
2)根据业务队列优先级类型,在分布式消息(如:RocketMQ、CTGMQ等)中动态创建相应消息队列TOPIC(如topic1、topic2、topic3…);
3)在进行业务队列调度时,根据业务队列的优先级类型(如:level1、level2、level3 …), 自动推送到相应的消息队列topic中;
4)对于不同消息队列,采用不同的消费端服务进行消费,实现不同优先级业务队列的隔离调度:
对于上述处理,实现不同优先级的隔离调度,避免不同优先级的任务队列互相堵塞,特别是低优先级堵塞高优先级任务队列的处理。
但是,上述做法仍会存在由于消息消费侧服务集群算力不同造成低优先级任务队列会优先处理,高优先级后处理情况. 因此,为了实现尽量保证高优先级的任务队列优先尽快处理,则需要对消息队列的消费服务集群算力按照一定比例进行分配,如最低优先级消费服务算力规模为1,则中高优先级消费服务集群资源规模为分别为n、m,其中,n>1、m>1,从而实现高优先级任务队列比低优先级任务队列处理更快更高效,同时也不会造成低优先级任务堵塞高优先级情况。
由于云上应用系统实际生产中,各种业务订单的任务队列不是均衡分布的,会存在波峰波谷情况,如在波谷时,高优先级任务队列的消息堆积量可能会为0,而此时消费服务集群却又占用大量资源,造成资源浪费,因此,需要对消费服务集群资源考虑动态调度,在波峰时动态扩容,波谷时动态缩容,即保证业务的高效处理,又能提高资源利用率。