RabbitMQ的使用

这篇文章会介绍一些RabbitMQ的基本概念和使用注意,避免初学者掉入使用不规范的坑里。

首先看一张大图

声明:图片摘自https://mp.weixin.qq.com/s/OABseRR0BnbK9svIPyLKXw

上图介绍了RabbitMQ消息队列的基本流程,下面说一下基本概念:

Connection: TCP协议连接,不管是消费者还是生产者都需要连接到RabbitMQ服务上。

Channel: 频道,一个双向数据流通道,它是建立在Connection真是TCP连接下的虚拟连接(因为TCP连接的建立和销毁对与操作系统是一个很大的开销 ),RabbitMQ的命令 包括 发送消息、接收消息、订阅队列都要使用Channel完成。

Exchange: 交换器,在服务中将收到的消息(message)根据规则分发给指定的队列。

Binding:绑定,将交换器和消息队列关联,需要注意的是不同类型的交换器 Binding规则不同,下面会写区别。

Message: 发送一条消息包含信息有 交换器名称(Exchange)、路由键(routing-key)、配置参数、要传递的消息(字节数组 byte[])

Queue 消息队列,一种先进先出的数据结构,在RabbitMQ服务中存储 由生产者发来经过交换器分派后的消息(Message)。

Produce: 一条消息的生产者,使用频道(Channel)将Message发送到RabbtMQ服务的交换器(Exchanage)中。

Consume: 消息的消费者,使用频道(Channel)订阅消息队列(Queue),在handleDelicery方法中处理。

 

Exchange交换器的类型区分:

headers: 它匹配的是Message中的 BasicPropertis 中的headers参数,而不是匹配路由键(routing-key)。

direct:它是判断生产者发送的Message 中路由键(routing-key)和 消费者监听的队列的绑定键(binding-key)是否一致。如果满足条件就将消息放入该消息队列中,等待消费者消费。

fanout:它是扇形的,它与消息队列是一对多的关系。每一个绑定到fanout交换器上的队列,都能收到消息(message)中交换器类型是fanout的消息。

topic:它是和direct是类似的,也是匹配路由键(routing-key)和绑定键(binding-key),它的路由键和绑定键命名需要字符串中间用点隔开,例如("routing.key"、"binding.key"),它会根据点将字符串切割成多个单词,其中绑定键命名可以使用通配符(*、#)例如("binding.* 、binding.#")*通配符只匹配一个单词、#通配符匹配0或多个单词。例如:(路由键:"aaa.bbb"、绑定键可已有:"aaa.*"、"aaa.#"、"*.bbb"、"#.bbb")

 

说一说使用注意:

1、在RabbitMQ中,如果一个消息队列被多个消费者订阅,由于RabbitMQ内置实现了负载均衡的deliver机制,一个消息只能被一个消费者消费,所以多个消费者会轮流消费该消息队列的消息。如果想要一条消息被多个消费者消费,可以使用fanout交换器。

2、RabbitMQ有两种消息确认机制,自动确认 和 手动确认,rabbitmq默认自动确认。

手动确认

笔者阅读的同类精彩文章:

http://www.javashuo.com/article/p-ffwcpfwr-ez.html

https://mp.weixin.qq.com/s/OABseRR0BnbK9svIPyLKXw

https://blog.csdn.net/liman65727/article/details/102520614