前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >RabbitMQ扩展之消费者优先级

RabbitMQ扩展之消费者优先级

作者头像
Throwable
发布于 2020-06-23 08:22:57
发布于 2020-06-23 08:22:57
83600
代码可运行
举报
文章被收录于专栏:Throwable's BlogThrowable's Blog
运行总次数:0
代码可运行

前提

本文来源于官方文档Consumer Priorities

消费者优先级

消费者优先级的机制:

  • 高优先级的消费者处于活跃状态的情况下优先接收和处理消息。
  • 消息会流入到低优先级的活跃消费者仅当高优先级的消费者处于阻塞状态。

正常情况下,所有订阅同一个队列的活跃消费者以循环的(round-robin)方式从队列中接收消息。当使用了消费者优先级,如果多个活跃消费者使用了相同的高优先级属性,那么消息投递也是以循环的方式进行(其实使用了相同的优先级类似于没有启用优先级)。

活跃消费者的定义

活跃的消费者就是可以在不用等待的情况下接收和处理消息的消费者,也就是消费者如果无法接收消息,那么它就是出于非活跃状态(或者说阻塞状态),阻塞的常见原因有:

  • 使用了basic.qos之后,消费者在信道中未确认的预读取消息达到了上限。
  • 网络阻塞。

因此,对于每个存在的队列,必定至少出现下面三种情况的其中一种:

  • 队列没有活跃的消费者。
  • 队列是空的。
  • 队列正在忙于向消费者投递消息。

消费者可能在一秒内多次在活跃和阻塞状态之间切换,只要消费处理速度足够快。RabbitMQ不会通过Web管理插件或者**rabbitmqctl**命令公开消费者当前是活跃还是阻塞状态,换言之,只能通过客户端感知。

启用消费者优先级的时候,RabbitMQ会优先投递消息到优先级属性比较高的消费者,但是如果所有优先级高的消费者都处于阻塞状态,RabbitMQ会把消息投递到活跃的优先级稍低的消费者,而不是一直等待优先级高的消费者解除阻塞,造成优先级低的消费者一直处于饥饿状态。

使用消费者优先级特性

在使用**basic.consume**方法可以设置参数**x-priority**的值为整数,数字越大则优先级越高,未设置则使用默认值0

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ConsumerPriorityMain extends BaseChannelFactory {

	public static void main(String[] args) throws Exception {
		provideChannel(channel -> {
			Map<String, Object> consumerArgs = new HashMap<>(8);
			consumerArgs.put("x-priority", 10);
			channel.basicConsume("throwable.queue.direct", true, consumerArgs, new DefaultConsumer(channel) {
			});
			consumerArgs.put("x-priority", 100);
			channel.basicConsume("throwable.queue.direct", true, consumerArgs, new DefaultConsumer(channel) {
			});
		});
	}
}

上面的例子设置了两个消费者,后者的优先级为100,而前者的优先级为10。

本文是Throwable的原创文章,转载请提前告知作者并且标明出处。 博客内容遵循 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议 本文永久链接是:https://cloud.tencent.com/developer/article/1650081

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年11月30日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
RabbitMQ扩展之消费者消息预读取
AMQP 0-9-1协议中定义了basic.qos方法用于限制信道或者连接上的未确认消息数量,这个消息数据量命名为prefetch_count。不幸的是,信道其实并不是限制未确认消息数量的理想范畴,因为单个信道有可能有多个消费者订阅多个不同的队列,所以信道和队列需要为发送的每个消息相互协调,以确保消息总数量不超过限制,造成了性能下降,单机性能出现瓶颈,在集群方案中耗时更加严重。
Throwable
2020/06/23
1.6K0
RabbitMQ扩展之消费者取消通知
当一个信道上建立的消费者订阅了一个队列,有可能出现各种原因导致消费停止。一个很明显的原因就是客户端在同一个信道上发出basic.cancel命令,消息中间件代理响应basic.cancel-ok,将会导致消费者被取消。还有其他的事件如队列的删除或者集群方案所在队列的集群节点失败也有可能导致消费者被取消,消费者被取消这个事件并不会通知客户端对应的信道,这样子会造成客户端无法感知消费者被取消。
Throwable
2020/06/23
1.8K0
RabbitMQ消息发送、消费和确认
前一篇文章介绍到RabbitMQ相关组件的声明,组件声明完成之后,就可以发送消息和消费消息,消费消息的时候需要考虑消息的确认。
Throwable
2020/06/23
4.5K0
RabbitMQ扩展之直接回复(Direct reply-to)
直接回复(Direct reply-to)是一种可以避免声明回复队列并且实现类似于RPC功能的一种特性。RabbitMQ中允许使用客户端和RabbitMQ消息代理中间件实现RPC模式,典型的做法是:RPC客户端发送请求(消息)到一个持久化的已知服务端队列,RPC服务端消费该服务端队列的消息,然后使用消息属性中的reply-to属性对应的值作为客户端回复队列发送回复消息到RPC客户端。
Throwable
2020/06/23
2.5K1
RabbitMQ中的消息优先级是如何实现的?
RabbitMQ中的消息优先级是通过设置消息的优先级属性来实现的。在RabbitMQ中,每条消息都可以附带一个优先级属性,该属性的值在0到255之间,其中0表示最低优先级,255表示最高优先级。
GeekLiHua
2025/01/21
1120
RabbitMq消费消息
rabbitmq的消息消费有两种方式,推模式和拉模式。推模式采用basic.consume进行消费,而拉模式则是调用的basic.Get进行消费。
写一点笔记
2022/08/11
1.4K0
消息队列——RabbitMQ的基本使用及高级特性
Rabbit是基于AMQP协议并使用Erlang开发的开源消息队列中间件,它支持多种语言的客户端,也是目前市面上使用比较广泛的一种消息队列,因此学习并掌握它是非常有必要的。本文主要基于Java客户端进行讲解,不涉及环境搭建部分。
夜勿语
2020/09/07
8070
RabbitMQ入门案例
RabbitMQ入门案例 Rabbit 模式 https://www.rabbitmq.com/getstarted.html 实现步骤 构建一个 maven工程 导入 rabbitmq的依赖 启动 rabbitmq-server服务 定义生产者 定义消费者 观察消息的在 rabbitmq-server服务中的进程 初步实现 前期准备 1.构建项目 2.导入依赖 <dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-
张小驰出没
2021/12/06
4410
RabbitMQ入门案例
RabbitMQ的五种常见消费模型
小尘要自信
2023/10/19
5100
RabbitMQ的五种常见消费模型
Rabbitmq小书
1.生产者(Publisher): 发布消息到RabbitMQ中的交换机(Exchange)上
大忽悠爱学习
2022/10/04
3.4K0
Rabbitmq小书
RabbitMQ如何保证队列里的消息99.99%被消费?
其实,还有1种场景需要考虑:当消费者接收到消息后,还没处理完业务逻辑,消费者挂掉了,那消息也算丢失了?,比如用户下单,订单中心发送了1个消息到RabbitMQ里的队列,积分中心收到这个消息,准备给这个下单的用户增加20积分,但积分还没增加成功呢,积分中心自己挂掉了,导致数据出现问题。
Java_老男孩
2019/06/11
7250
RabbitMQ优先级队列机制(八)
在服务级级别的测试中需要考虑被执行任务的优先级机制,也就是通过线程优先级来进行,设置优先级的目的是在资源非常紧张的情况下,让优先级高的任务优先执行,而优先级低的任务排后执行,当然这样的一种设置机制只能是异步的模式下执行,如果是设计在同步的模式下执行,那这个设计从系统上来说就缺少宏观维度的思考。在RabbitMQ的机制中也是提供了队列的优先级机制,这样设计的目的也是在在生产者生产过快,而消费者消费不过来的情况下,也就是资源在紧张或者说是在有限的情况下,设置的队列优先级高的任务它的消息优先进行消费,而优先级低的消息排后消费。当然,如果是在资源不紧张的情况下,设置优先级其实没多大的意义,因为这个时候优先过来的消息先进行消费,也谈不上排队的机制和优先级的机制。
无涯WuYa
2022/03/29
4090
RabbitMQ优先级队列机制(八)
RabbitMQ交换器Exchange介绍与实践
有了Rabbit的基础知识之后(基础知识详见:深入解读RabbitMQ工作原理及简单使用),本章我们重点学习一下Rabbit里面的exchange(交换器)的知识。
磊哥
2018/08/02
6580
RabbitMQ交换器Exchange介绍与实践
RabbitMQ基础使用
生产消息的应用,生产者需要指定将消息发送到哪个exchange,并且指定routingkey(这是为了exchange可以将消息路由到相关的队列)。
shysh95
2019/07/23
1.1K0
RabbitMQ实战-消费端ACK、NACK及重回队列机制
当连接失败时,消息可能还在客户端和服务器之间传输 - 它们可能处于两侧的解码或编码的中间过程,在 TCP 堆栈缓冲区中,或在电线上飞行。
JavaEdge
2022/11/30
4.1K0
RabbitMQ实战-消费端ACK、NACK及重回队列机制
RabbitMq 总结
不依赖于路由键的匹配规则路由消息,根据发送的消息内容headers属性进行完全匹配(键值对形式)。性能差,基本不使用。
leon公众号精选
2022/04/27
4710
RabbitMq 总结
rabbitmq之rabbitmq工作模型与Java编程(一)
1、跨系统的异步通信 人民银行二代支付系统,使用重量级消息队列 IBM MQ,异步,解耦,削峰都有体现。 2、应用内的同步变成异步 秒杀:自己发送给自己 3、基于Pub/Sub模型实现的事件驱动 放款失败通知、提货通知、购买碎屏保 系统间同步数据 摒弃ELT(比如全量同步商户数据); 摒弃API(比如定时增量获取用户、获取产品,变成增量广播)。 4、利用RabbitMQ实现事务的最终一致性
周杰伦本人
2022/10/25
3930
rabbitmq之rabbitmq工作模型与Java编程(一)
RabbitMQ In JAVA 介绍及使用
  RabbitMQ是开源的消息中间件,它是轻量级的,支持多种消息传递协议,可以部署在分布式和联合配置中,以满足高级别、高可用性需求。并且可在许多操作系统和云环境上运行,并为大多数流行语言提供了广泛的开发工具。(这里只介绍JAVA下的RabbitMQ的使用,感兴趣的可以查看官方文档:http://www.rabbitmq.com/getstarted.html);
2019/02/21
7370
RabbitMQ In JAVA 介绍及使用
【RabbitMq 篇五】-要点概念(优先级、顺序性、消息分发、持久化)
本文介绍RabbitMq几个重要的概念。分别是优先级队列、消息顺序性、消息分发、持久化。
胖虎
2019/06/26
4.6K0
SpringBoot: RabbitMq队列之优先级
在我们系统中有一个订单催付的场景,我们的客户在天猫下的订单,淘宝会及时将订单推送给我们,如果在用户设定的时间内未付款那么就会给用户推送一条短信提醒,很简单的一个功能对吧,但是,tmall商家对我们来说,肯定是要分大客户和小客户的对吧,比如像苹果,小米这样大商家一年起码能给我们创造很大的利润,所以理应当然,他们的订单必须得到优先处理,而曾经我们的后端系统是使用 redis 来存放的定时轮询,大家都知道 redis 只能用 List 做一个简简单单的消息队列,并不能实现一个优先级的场景,所以订单量大了后采用 RabbitMQ 进行改造和优化,如果发现是大客户的订单给一个相对比较高的优先级,否则就是默认优先级。
Freedom123
2024/03/29
2560
SpringBoot: RabbitMq队列之优先级
相关推荐
RabbitMQ扩展之消费者消息预读取
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文