1.MQ概念
MQ全程Message Queue(消息队列),是在消息传输过程中保存消息的容器。多用于分布式系统之间进行通信。
2.MQ的优势和劣势
优势:
(1)应用解耦:eg:订单系统不直接调用库存系统,库存系统宕机并不影响下单
(2)异步提速:eg:不需要同步调用库存系统,提升速度
(3)削峰填谷:eg:mq承载了5000请求,系统慢慢消费,就是削峰。但是因为消息积压,高峰过一段时间后消息才能被消费完,这就是填谷。
劣势:
(1)系统可用性降低:一旦mq宕机,就可能对多个业务造成影响。如何保证mq高可用
(2)系统复杂度提高:如何保证消息不被重复消费?怎么处理丢失情况?怎么保证消息传递的顺序性?
(3)一致性问题:A系统给B,C,D系统发送数据,如果B,c处理成功,D系统失败。如何保证消息数据处理的一致性?
3.常见的mq产品
4.AMQP
AMQP,即Advanced Message Queuing Protocol,是一个网络协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。
5.RabbitMQ简介
由Rabbit技术公司基于AMQP协议开发,采用Erlang语言开发(高并发性能高)
基础架构图如下:
(1)Server:接收客户端的连接,实现AMQP实体服务。
(2)Connection:连接,应用程序与Server的网络连接,TCP连接。
(3)Channel:信道,消息读写等操作在信道中进行。客户端可以建立多个信道,每个信道代表一个会话任务。
(4)Virtual Host:虚拟主机,用于逻辑隔离。一个虚拟主机里面可以有若干个Exchange和Queue,同一个虚拟主机里面不能有相同名称的Exchange或Queue。
(5)Exchange:交换器,接收消息,按照路由规则将消息路由到一个或者多个队列。如果路由不到,或者返回给生产者,或者直接丢弃。RabbitMQ常用的交换器常用类型有direct、topic、fanout、headers四种,后面详细介绍。
(6)Queue:消息队列,用来保存消息,供消费者消费
(7)Message:消息,应用程序和服务器之间传送的数据,消息可以非常简单,也可以很复杂。有Properties和Body组成。Properties为外包装,可以对消息进行修饰,比如消息的优先级、延迟等高级特性;Body就是消息体内容。
(8)Binding:绑定,交换器和消息队列之间的虚拟连接,绑定中可以包含一个或者多个RoutingKey。
(9)RoutingKey:路由键,生产者将消息发送给交换器的时候,会发送一个RoutingKey,用来指定路由规则,这样交换器就知道把消息发送到哪个队列。路由键通常为一个“.”分割的字符串,例如“com.rabbitmq”。
6.RabbitMQ工作模式
(1)简单模式 (2)work queues (3)Publish/Subscribe发布与订阅模式 (4)Routing路由模式 (5)Topic主题模式 (6)RPC远程调用模式
1.简单模式
一个生产者发送消息到队列,一个消费者接收
2.工作队列模式(work queues)
(1)概念:多一个或一些消费者,多个消费端共同消费同一个队列中的消息(多个消费者对同一个消息是竞争关系)
(2)应用场景:应用场景:对于 任务过重或任务较多情况使用工作队列可以提高任务处理的速度。
(3)简单模式的基础上再复制一个消费者
3.订阅模式(pub/sub)
(1)概念:每个消费者监听自己的队列。生产者将消息发给broker,由交换机将消息转发到绑定此交换机的每个队列,每个绑定交换机的队列都将接收到消息
(2)交换机:
Exchange:交换机,图中的X。一方面,接收生产者发送的消息。另一方面,知道如何处理消息,例如递交给某个特别队列、递交给所有队列、或是将消息丢弃。到底如何操作,取决于Exchange的类型。Exchange有常见以下3种类型:
Fanout:广播,将消息交给所有绑定到交换机的队列
Direct:定向,把消息交给符合指定routing key 的队列
Topic:通配符,把消息交给符合routing pattern(路由模式) 的队列
Exchange(交换机)只负责转发消息,不具备存储消息的能力,因此如果没有任何队列与Exchange绑定,或者没有符合路由规则的队列,那么消息会丢失!
4.路由模式(Routing)
(1)概念
队列与交换机的绑定,不能是任意绑定了,而是要指定一个RoutingKey(路由key)
消息的发送方在 向 Exchange发送消息时,也必须指定消息的 RoutingKey。
Exchange不再把消息交给每一个绑定的队列,而是根据消息的Routing Key进行判断,只有队列的Routingkey与消息的 Routing key完全一致,才会接收到消息
5.通配符模式 Topics
(1)概念:Topic类型Exchange可以让队列在绑定Routing key 的时候使用通配符
Routingkey 一般都是有一个或多个单词组成,多个单词之间以”.”分割,例如: item.insert
(2)通配符规则:
#:匹配一个或多个词
*:匹配不多不少恰好1个词
原文:https://www.cnblogs.com/muacheng/p/14774660.html