RabbitMQ之Consumer消费模式(Push Pull)
概述
消息中間件有很多種,進(jìn)程也會(huì)拿幾個(gè)來對(duì)比對(duì)比,其中一種對(duì)比項(xiàng)就是消費(fèi)模式。消息的消費(fèi)模式分Push、Pull兩種,或者兩者兼具。RabbitMQ的消費(fèi)模式就是兼具Push和Pull。
本文通過demo代碼以及借助wireshark抓包工具來觀察RabbitMQ的消費(fèi)模式。
歡迎支持筆者新作:《深入理解Kafka:核心設(shè)計(jì)與實(shí)踐原理》和《RabbitMQ實(shí)戰(zhàn)指南》,同時(shí)歡迎關(guān)注筆者的微信公眾號(hào):朱小廝的博客。
歡迎跳轉(zhuǎn)到本文的原文鏈接:https://honeypps.com/mq/rabbitmq-consumer-consumption-pattern/
push模式
發(fā)送端向broker端發(fā)送數(shù)據(jù),數(shù)據(jù)內(nèi)容為:RabbitMQ Demo Test, Send Messages 0;RabbitMQ Demo Test, Send Messages 1;RabbitMQ Demo Test, Send Messages 2,一次類推……
下面是消費(fèi)端的示例代碼:
運(yùn)行輸出:RabbitMQ Demo Test, Send Messages 0
通過wirkshark工具來查看上面示例代碼的整個(gè)AMQP的過程(圖1):
上圖可以對(duì)照實(shí)例代碼來看,比如圖中:Basic.Qos和Basic.Qos-Ok就是示例代碼中的:channel.basicQos(1);
再比如圖中的Basic.Ack就是示例代碼中的channel.basicAck(delivery.getEnvelope().getDeliveryTag(),false);
對(duì)于上圖中的帶藍(lán)色背影的那行(即No.545,展開如下圖,broker to client)
可以看到Delivery-Tag = 1, 消息內(nèi)容:“RabbitMQ Demo Test, Send Messages 0”。
展開No.546,即Basic.Ack這行:
可以看到client to broker的Ack:delievery-tag=1,和上面的符合。
仔細(xì)的朋友可以看到No.548同樣是broker向client發(fā)送了一條數(shù)據(jù),通過展開數(shù)據(jù)可知:
其內(nèi)包含的數(shù)據(jù)正好是下一條的消息——“RabbitMQ Demo Test, Send Messages 1”。但是在運(yùn)行實(shí)例的時(shí)候是沒有打印出來的,可以看圖1,是broker端主動(dòng)向client端發(fā)送的數(shù)據(jù),client端沒有請(qǐng)求。在broker端發(fā)送第一條數(shù)據(jù),即"RabbitMQ Demo Test, Send Messages 0"之后發(fā)送Ack,之后關(guān)閉Channel,到真正關(guān)閉完channel之間,broker端還是會(huì)發(fā)送(push)數(shù)據(jù)給Client, 此時(shí)Client不會(huì)在Ack此條數(shù)據(jù)了。那么這樣這條消息會(huì)不會(huì)丟失呢?答案是否定的,你可以再運(yùn)行下consumer程序,就能消費(fèi)到這條消息,rabbitmq對(duì)設(shè)置autoAck=false之后沒有被Ack的消息是不會(huì)清除掉的。
實(shí)際上如果不設(shè)置channel.basicQos(1),那么broker端會(huì)一次推送多條數(shù)據(jù)
RabbitMQ的每一數(shù)據(jù)幀(Frame)都是以0xCE結(jié)尾。
pull模式
同樣采用wirkshark工具來觀察pull模式的AMQP過程,pull模式主要是通過channel,basicGet方法來獲取消息,示例代碼如下:
GetResponse response = channel.basicGet(QUEUE_NAME, false); System.out.println(new String(response.getBody())); channel.basicAck(response.getEnvelope().getDeliveryTag(),false);wireshark抓包結(jié)果:
可以觀察No.122, No.123, No.124,這些對(duì)于上面的示例代碼。
首先是client端發(fā)送Get請(qǐng)求,然后broker響應(yīng)請(qǐng)求回傳消息,最后client端發(fā)送Ack. 可以看到有別于push模式,broker端不會(huì)在client端沒有請(qǐng)求的情況下來回傳消息。
歡迎跳轉(zhuǎn)到本文的原文鏈接:https://honeypps.com/mq/rabbitmq-consumer-consumption-pattern/
歡迎支持筆者新作:《深入理解Kafka:核心設(shè)計(jì)與實(shí)踐原理》和《RabbitMQ實(shí)戰(zhàn)指南》,同時(shí)歡迎關(guān)注筆者的微信公眾號(hào):朱小廝的博客。
總結(jié)
以上是生活随笔為你收集整理的RabbitMQ之Consumer消费模式(Push Pull)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RabbitMQ之监控(1)
- 下一篇: [一]RabbitMQ-客户端源码之Co