RabbitMQ初步学习笔记

不管现实多么惨不忍睹,都要持之以恒地相信,这只是黎明前短暂的黑暗而已。不要惶恐眼前的难关迈不过去,不要担心此刻的付出没有回报,别再花时间等待天降好运。真诚做人,努力做事!你想要的,岁月都会给你。RabbitMQ初步学习笔记,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

1、RabbitMQ

建议,在学习RabbitMQ 之前先去学习一下ActiveMQ,ActiveMQ是基于JMS java message service协议的一种MQ实现,它的使用相对来说较为简单,且更符合初始学习MQ的一个流程规范,RabbitMQ 需要一点小基础。

 

1、            AMQP

开放标准,支持不同语言和不同的产品

AMQP,即Advanced Message Queuing Protocol,一个提供统一消

息服务的应用层标准高级消息队列协议

 RabbitMQ初步学习笔记

2、            生产者

消息的创建者,发送到amqp的消息中间件

3、            消费者

连接到amqp的消息中间件,订阅到队列上,进行消息的消费。分为持续订阅(basicConsumer)和单条订阅(basicGet)

4、            消息

包括有效载荷和标签。有效载荷就是要传输的数据。标签描述有效载荷的属性,rabbitmq用标签来决定谁获得当前消息。消费者只能拿到有效载荷。

5、            信道

虚拟的连接,建立在真实的tcp连接之上的。信道的创建没有限制的。

6、            交换器、队列、绑定、路由键

队列通过路由键(routingkey,某种确定的规则)绑定到交换器,生产者把消息发送到了交换器,交换器根据绑定的路由键将消息路由到特定的队列,订阅了队列的消费者进行接收。

 

如果消息达到无人订阅的队列会怎么办

 消息会一直在队列中等待,rabbitmq会默认队列是无限长度的。

多个消费者订阅到同一队列怎么办

消息会轮询的方式发送给消费者,每个消息只会发送给一个消费者

消息路由到了不存在的队列怎么办?

会忽略,当消息不存在,消息丢失了。

消息的确认机制

消费者收到的每一条消息都必须进行确认。

(分为自动确认和消费者自行确认)

消费者在声明队列时,指定autoAck参数,true自动确认,false时rabbitmq会等到消费者显示的发回一个ack信号才会删除消息。

autoAck=false,有足够时间让消费者处理消息,直到消费者显示调用basicAck为止。Rabbitmq中消息分为了两部分:1、等待投递的消息;2、已经投递,但是还没有收到ack信号的。如果消费者断连了,服务器会把消息重新入队,投递给下一个消费者。

未ack的消息是没有超时时间的,

 

如何明确拒绝消息?

 1、消费者断连,2、消费者使用reject命令(requeue=true,重新分发消息,false移除消息),3、nack命令(批量的拒绝)

 

创建队列

(生产/消费)declareQueue。消费者订阅了队列,不能再声明队列了。相关参数(exclusive 队列为应用程序私有,auto-delete 最后一个消费者取消订阅时,队列会自动删除,durable 队列持久化)

检测队列是否存在

 Declare时的passive参数

四种交换器:

direct,fanout,topic,headers

RabbitMQ初步学习笔记

direct:路由键完全匹配时,消息投放到对应队列。Amqp实现都必须有一个direct交换器(默认交换器),名称为空白字符。队列不声明交换器,会自动绑定到默认交换器,队列的名称作为路由键。

RabbitMQ初步学习笔记

Fanout:可以理解为广播

 RabbitMQ初步学习笔记

Topic:主题,使来自不同源头的消息到达同一个队列

 

Headers: 匹配消息头,其余与direct一样,实用性不大

日志处理场景:

7、             有交换器(topic)log_exchange,日志级别有 error,info,warning,应用模块有 user,order,email,路由键的规则是 日志级别+“.”+应用模块名(例如info.user)

8、             发送邮件失败,报告一个email的error,basicPublic(message,’log-exchange’,’error.email’)

队列的绑定:queueBind(“email-error-queue”,’log-exchange’,’error.email’)

要监听email所有的日志怎么办?

queueBind(“email-log-queue”,’log-exchange’,’*.email’)

监听所有模块所有级别日志?

queuebind(“all-log-queue”,’log-exchange’,’#’)

“.”会把路由键分为好几个标识符,“*”匹配一个标识符,“#”匹配一个或者多个(xxx.yyy.zzzz 可以: xxx.*. zzzz , xxx.# , #.zzzz)。

 本文未完,待继续编写:部分图文来自网络

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/160957.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!