RabbitMQ入门

447 阅读4分钟

什么是消息队列,为什么使用消息队列

什么是消息队列

消息指的是两个应用间传递的数据。数据的类型有很多种形式,可能只包含文本字符串,也可能包含嵌入对象。

“消息队列(Message Queue)”是在消息的传输过程中保存消息的容器。在消息队列中,通常有生产者和消费者两个角色。生产者只负责发送数据到消息队列,谁从消息队列中取出数据处理,他不管。消费者只负责从消息队列中取出数据处理,他不管这是谁发送的数据。

image.png

为什么使用消息队列

解耦

服务A、服务B、服务C都需要服务Q提供的数据,服务D不需要服务Q提供的数据,为了降低代码耦合度,可以将服务Q提供的数据推送到队列中,需要数据的就可以通过队里去取。

提高并发

在短暂时间内同时有5000个请求发送到服务A上,服务A就需要请求5000次数据库,显然这样对数据库是很不友好的。如果服务A5000个请求推送到队列中,消费者每次消费200个请求数据,可以降低并发。    

异步

某一功能需要 系统A 请求系统B、系统C、系统D,返回数据的响应时间就是SA、SB、SC三个服务的和,如果系统A将数据推送到队列中,SA直接从队列中获取数据后响应数据直接返回,就可以降低响应时间。

RabbitMQ特点

RabbitMQ是一款使用Erlang语言开发的,实现AMQP(高级消息队列协议)的开源消息中间件。首先要知道一些RabbitMQ的特点,[官网](https://www.rabbitmq.com/)可查:

-   可靠性。支持持久化,传输确认,发布确认等保证了MQ的可靠性。
-   灵活的分发消息策略。这应该是RabbitMQ的一大特点。在消息进入MQ前由Exchange(交换机)进行路由消息。分发消息策略有:简单模式、工作队列模式、发布订阅模式、路由模式、通配符模式。
-   支持集群。多台RabbitMQ服务器可以组成一个集群,形成一个逻辑Broker。
-   多种协议。RabbitMQ支持多种消息队列协议,比如 STOMP、MQTT 等等。
-   支持多种语言客户端。RabbitMQ几乎支持所有常用编程语言,包括 Java、.NET、Ruby 等等。
-   可视化管理界面。RabbitMQ提供了一个易用的用户界面,使得用户可以监控和管理消息 Broker。
-   插件机制。RabbitMQ提供了许多插件,可以通过插件进行扩展,也可以编写自己的插件。

RabbitMQ组成部分

  • Broke 消息队列服务进程 此进程包括两部分 Exchange和Queue
  • Exchange 消息队列交换机 按一定的规则将消息推送到某个队列
  • Queue 消息队列 存储消息的队列
  • Producer 队列生产者
  • Consumer 队列消费者

image.png

  • 消息生产者连接到RabbitMQ Broker,创建connection,开启channel。
  • 生产者声明交换机类型、名称、是否持久化等。
  • 生产者发送消息,并指定消息是否持久化等属性和routing key。
  • exchange收到消息之后,根据routing key路由到跟当前交换机绑定的相匹配的队列里面。
  • 消费者监听接收到消息之后开始业务处理。

RabbitMQ四种交换机特点

Direct Exchange

点对点 直接将消息推送到对应的队里中

Fanout exchange

广播形式 将消息推送到绑定的消息队列中 发布订阅模式

Topic exchange

通配符推送 将消息推送到符合通配符的队列中
通配符有两种:"*""#"。需要注意的是通配符前面必须要加上"."符号。
`*` 符号:有且只匹配一个词。比如 `a.*`可以匹配到"a.b""a.c",但是匹配不了"a.b.c"`#` 符号:匹配一个或多个词。比如"rabbit.#"既可以匹配到"rabbit.a.b""rabbit.a",也可以匹配到"rabbit.a.b.c"

Headers exchange

这种交换机用的相对没这么多。它跟上面三种有点区别,它的路由不是用routingKey进行路由匹配,而是在匹配请求头中所带的键值进行路由。

常用命令

查看没有确认的消息
rabbitmqctl list_queues name messages_ready messages_unacknowledged

列出所有的交换机
rabbitmqctl list_exchanges