【RabbitMQ-4】拉模式和推模式

本文深入探讨了RabbitMQ的拉模式(pull),包括实时拉取和批量拉取消息的场景与实现方法。详细解释了如何使用basicGet方法逐个或批量获取消息,以及在SpringBoot中使用AmqpTemplate或RabbitMqTemplate拉取消息的实践。
摘要由CSDN通过智能技术生成

1. rabbitMQ的推模式和拉模式

我们知道,消费者有两种方式从消息中间件获取消息:
推模式:消息中间件主动将消息推送给消费者
拉模式:消费者主动从消息中间件拉取消息

推模式:将消息提前推送给消费者,消费者必须设置一个缓冲区缓存这些消息。好处很明显,消费者总是有一堆在内存中待处理的消息,所以效率高。缺点:是缓冲区可能会溢出。

实现推模式:推荐的方式是继承DefaultConsumer基类,也可以使用Spring AMQPSimpleMessageListenerContainer

拉模式:在消费者需要时才去消息中间件拉取消息,这段网络开销会明显增加消息延迟,降低系统吞吐量。

实现拉模式:RabbitMQChannel提供了basicGet方法用于拉取消息。

push更关注实时性,pull更关注消费者消费能力

推模式是做最常用的,但是某些情况下推模式并不适用:

  • 由于某些限制,消费者在某个条件成立时才能消费消息。
  • 需要批量拉取消息进行处理。

1.1 实时拉(pull)模式

With AMQP 0-9-1 it is possible to fetch messages one by one using the basic.get protocol method. Messages are fetched in the FIFO order. It is possible to use automatic or manual acknowledgements, just like with consumers (subscriptions).
Fetching messages one by one is not necessary in most cases as it is inefficient and has all the downsides of polling. When in doubt, prefer registering a consumer.

官方对pull的定义是:可以使用basic.get协议方法逐个获取消息。消息以FIFO(先进先出)顺序获取,可以使用手动确定,就像消费者(订阅)一样。
大多数情况下,不需要逐个获取消息。因为它的效率低,并且具有轮询的所有缺点。

使用basicGet拉模式需要注意:

  1. Queue中没有消息是basicGet返回null,此时应用应当适当休眠。
  2. 如果需要实现消息的可靠消费,应当传递autoAck为false。
  3. GetResponseenvelope属性的deliveryTag属性用于ACK消息传递给basicAck
  4. 使用拉模式需要自己实现线程池。

1.2. 批量拉取(pull)消息

RabbitMQ支持客户端批量拉取消息,可以连续调用basicGet方法拉取多条消息,处理完毕一次性返回ACK。
需要注意:

  1. 批量拉取循环的退出条件:达到数量上限,basicGet返回null。
  2. 使用basic批量ACK传递的参数是最后一条消息的deliveryTag。

1.3 SpringBoot中使用pull拉取消息

可以通过AmqpTemplate或者RabbitMqTemplate拉取消息,当queue没有消息时,会立刻返回null,传入timeoutMillis参数可阻塞等待一段时间。

Message receive() throws AmqpException;

Message receive(String queueName) throws AmqpException;

Message receive(long timeoutMillis) throws AmqpException;

Message receive(String queueName, long timeoutMillis) throws AmqpException;

若是想直接在queue获取到java对象,可以调用receiveAndConvert方法。

测试代码:

@Test
public void receive() {
   Object o = rabbitTemplate.receiveAndConvert("queue_direct");
   System.out.println(o.hashCode());
   System.out.println(o);
}

SpringBoot2.x处理消息详见:【RabbitMQ-6】消费端获取消息(SpringBoot2.0版本)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值