开心一刻
今天坐在太阳下刷着手机
老妈走过来问我:这么好的天气,怎么没出去玩
我:我要是有钱,你都看不见我的影子
老妈:你就不知道带个碗,别要边玩?
我:......
优先级队列
说到队列,相信大家一定不陌生,是一种很基础的数据结构,它有一个很重要的特点:先进先出
但说到优先级队列,可能有些小伙伴还不清楚,因为接触的不多嘛
示例基于: RabbitMQ 3.9.11
业务场景
我手头上正好有一个项目,系统之间通过 RabbitMQ 通信,调度系统 是消息生产者, 文件生成系统 是消息消费者
默认情况下,先下发的消息会先被消费,也就是先进队列的消息会先出队列
业务高峰期,重要程度不同的文件都需要生成,那如何保证重要文件先生成了?
1、调整调度
1.1 将重要文件的调度提前,保证重要文件的消息先进入队列;但需要考虑调度能否提前,如果生成文件依赖的上游数据还未就绪了?
1.2 将普通文件的调度延后,有点围魏救赵的感觉,万一某一天不需要生成重要文件,那服务器岂不是有一段时间的空置期,而这段空置期本可以生成普通文件
总的来说就是不够灵活:有重要文件的时候先生成重要文件,没有重要文件的时候生成普通文件
2、提高服务器配置
这个就不用过多解释了把,加大 文件生成系统 的硬件配置,提高其文件生成能力
保证文件(不论重要还是普通)都能在调度的时间开始生成,也就无需区分重要与普通了
那么重要文件先生成这个命题就不成立了
想想都美,可实际情况,大家都懂的!
3、优先级队列
RabbitMQ 的 Priority Queue 非常契合这个业务场景,详情请往下看
队列优先级
相较于普通队列,优先级队列肯定有一个标志来标明它是一个优先级队列
这个标志就是参数: x-max-priority ,定义优先级的最大值
我们先来看下 RabbitMQ 控制台如何配置
相关参数配置好之后,点击 Add queue 即创建出了一个 优先级队列
创建完成之后,你会发现队列上有一个 Pri 标志,说明这是一个优先级队列
实际开发工程中,一般不会在 RabbitMQ 控制台创建队列,往往是服务启动的时候,通过服务自动创建 exchange 、 queue
实现也非常简单
@Configuration public class RabbitConfig { @Bean public DirectExchange directExchange() { return new DirectExchange(QSL_EXCHANGE, true, false); } @Bean public Queue queue() { Map<String, Object> args = new HashMap<>(); args.put("x-max-priority", 5); return new Queue(QSL_QUEUE, true, false, false, args); } @Bean public Binding bindingQueue() { return BindingBuilder.bind(queue()).to(directExchange()).with("com.qsl"); } }
发表评论
侧栏公告
寄语
譬如朝露博客是一个分享前端知识的网站,联系方式11523518。
热评文章
标签列表
热门文章
友情链接