持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天,点击查看活动详情
消息队列简介
消息是指两个应用间传递的数据。
“消息队列(Message Queue)”是在消息的传输过程中保存消息的容器。在消息队列中,通常有生产者和消费者两个角色。生产者只负责发送数据到消息队列。消费者只负责从消息队列中取出数据处理。
使用消息队列的原因
解耦、异步、削峰
RabbitMQ的特点
实现AMQP(高级消息队列协议)的开源消息中间件。
- 可靠性。支持持久化,传输确认,发布确认等保证了MQ的可靠性。
- 灵活的分发消息策略。这应该是RabbitMQ的一大特点。在消息进入MQ前由Exchange(交换机)进行路由消息。分发消息策略有:简单模式、工作队列模式、发布订阅模式、路由模式、通配符模式。
- 支持集群。多台RabbitMQ服务器可以组成一个集群,形成一个逻辑Broker。
- 多种协议。RabbitMQ支持多种消息队列协议,比如 STOMP、MQTT 等等。
- 支持多种语言客户端。RabbitMQ几乎支持所有常用编程语言,包括 Java、.NET、Ruby 等等。
- 可视化管理界面。RabbitMQ提供了一个易用的用户界面,使得用户可以监控和管理消息 Broker。
- 插件机制。RabbitMQ提供了许多插件,可以通过插件进行扩展,也可以编写自己的插件。
RabbitMQ中的组成部分
Broker:消息队列服务进程。此进程包括两个部分:Exchange 和 Queue。
Exchange:消息队列交换机。按一定的规则将消息路由转发到某个队列。
Queue:消息队列,存储消息的队列。
Producer:消息生产者。生产方客户端将消息同交换机路由发送到队列中。
Consumer:消息消费者。消费队列中存储的消息。
协同工作的流程:
- 消息生产者连接到RabbitMQ Broker,创建connection,开启channel
- 生产者声明交换机类型、名称、是否持久化等
- 生产者发送消息,并指定消息是否持久化等属性和 routing key
- exchange 收到消息之后,根据 routing key 路由跟当前交换机绑定的相匹配的队列里面。
- 消费者监听接收到消息之后开始业务处理。
Exchange 的四种类型以及用法
消息发送到RabbitMQ 后首先要经过 Exchange 路由才能找到对应的 Queue。
Direct Exchange
此交换机需要绑定一个队列,要求该消息与一个特定的路由键完全匹配。简单来说就是一对一的,点对点的发送。
Fanout exchange
这种类型的交换机需要将队列绑定到交换机。一个发送到交换机的消息都会被转发到与该交换机绑定的所有队列上。很像子网广播,每台子网内的主机都获得了一份复制的消息。简单来说就是发布订阅。
Topic Exchange
主题交换机,又名通配符交换机。使用通配符去匹配相应的队列。通配符有两种:”*“、”#“。需要注意通配符前面需要加上“ . ”符号。
* 符号:有且只匹配一个词。比如 a.*可以匹配到"a.b"、"a.c",但是匹配不了"a.b.c"。
# 符号:匹配一个或多个词。比如"rabbit.#"既可以匹配到"rabbit.a.b"、"rabbit.a",也可以匹配到"rabbit.a.b.c"。
比较常用的就是以上三种:直连(DirectExchange),发布订阅(FanoutExchange),通配符(TopicExchange)。熟练运用这三种交换机类型,基本上可以解决大部分的业务场景。
实际上稍微思考一下,可以发现通配符(TopicExchange)这种模式其实是可以达到直连(DirectExchange)和发布订阅(FanoutExchange)这两种的效果的。
FanoutExchange不需要绑定routingKey,所以性能相对TopicExchange会好一点。