【RabbitMQ-4】拉模式和推模式
发布日期:2022-02-14 16:09:33 浏览次数:27 分类:技术文章

本文共 1857 字,大约阅读时间需要 6 分钟。

文章目录

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方法。

测试代码:

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

SpringBoot2.x处理消息详见:

转载地址:https://blog.csdn.net/qq_29595463/article/details/107859140 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:【RabbitMQ-1】SpringBoot2.x的集成
下一篇:【RabbitMQ-6】消费端获取消息(SpringBoot2.0版本)

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2024年04月06日 22时25分44秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

Base64 加密解密 2019-04-26
Excel表格身份证号显示不完整问题 2019-04-26
今日份实操——(HTML+CSS)浮动布局练习 2019-04-26
ESLint Parsing error: control-character-in-input-stream vue/no-parsing-error 2019-04-26
2011年下半年信息系统项目管理师上午试卷试题及参考答案,考试真题 2019-04-26
2011年下半年信息系统项目管理师考试下午案例分析试题及参考答案,考试真题 2019-04-26
2019年上半年信息系统项目管理师考试真题及答案(包含综合知识,案例分析,论文真题) 2019-04-26
理财启蒙必读书籍《小钱狗狗》心得 2019-04-26
《巴比伦最富有的人》精髓:学会储蓄、谨慎投资,从而走上致富之路 2019-04-26
《经济学通识》:人类会受到“东西不够、生命有限、相互依赖、需要协调”四方面的限制,影响我们的衣食住行 2019-04-26
《不可不知的经济真相》精髓:普通老百姓如何进行楼市和股市的投资 2019-04-26
《中国债券市场》精髓:中国债券市场由政府主导,其最重要的目的是为国家建设筹集资金 2019-04-26
《极简GDP史》精髓:GDP虽有诸多局限性,但是对于社会经济发展仍然有举足轻重的作用 2019-04-26
《经济学是什么》精髓:如何用经济学家的眼光理解个人选择和市场经济? 2019-04-26
《卧底经济学》书中精髓:我们如何正确理解“稀缺”这件事儿? 2019-04-26
《学会花钱》书中精髓:花钱如何掌握分寸,以及如何避开花钱误区 2019-04-26
《定投十年财务自由》书中精髓:我们如何通过定投获得更高的收益? 2019-04-26
《海龟交易法则》精髓:制定对自己有利的交易规则,在风险可控的前提下,当机会出现,你要坚定不移的机械性执行交易 2019-04-26
《彼得·林奇教你理财》书中精髓:如何开始投资,以及我们到底该投资什么? 2019-04-26
《货币简史》书中的精髓:货币产生的起源是什么?货币又是如何发展起来的? 2019-04-26