目录
概述
基本简要
MQ(Message Queue)消息队列,是在消息的传输过程中保存信息的容器,多用于分布式系统之间进行通信
优势
应用解耦
系统的耦合性越高,容错性就越低,可维护性就越低
异步提速
削峰填谷
AMQP协议简述
AMQP(高级消息队列协议),是一个网络协议,是应用层协议的一个开放标准,为面向消息的中间件设计
模型组成:
- exchange(交换机):从publisher程序中收取消息,并把消息根据一些规则路由到消息队列(Message Queue)中
- queue(消息队列):存储消息,直到消息被安全的投递给了消费者Consumer
- binding:定义了queue和exchange之间的关系,提供了消息路由(Routes)的规则
简要说明:
- 一个AMQP消息类似于一封邮件消息
- 消息队列类似于一个邮箱
- 消费者类似一个邮件客户端,能够拉取和删除邮件
- 交换机类似于一个邮件服务器。检查邮件,基于邮件的路由信息,路由表,来决定如何把邮件发送到一个或多个邮箱里
- Routing key类似于邮件中的地址
- binding通过Routing key告诉你如何走下一步
概述:生产者生产一封邮件消息,交换机检查邮件的路由信息,binding拿到路由信息进行放入到指定的收件箱(queue)消费者取出并消费
RabbitMQ架构
rabbitmq基于AMQP协议
模型组成:
- Broker:接收和发小消息的应用
- Virtual host:当多个不同的用户使用一个RabbitMQ server提供的服务时,可以划分多个vhost,每个用户在自己的vhost创建exchange/queue
- Connection:publisher/consumer和broker之间的tcp连接
- channel:是connection内部建立的逻辑连接,为了减少操作系统建立TCP connection的开销
- Exchange:消息到达broker的第一站,根绝分发规则,匹配查询表中的routing key,分发消息到队列中去
- Queue:消息最终被送到这里等待consumer取走
- binding:exchange和queue之间的虚拟连接,binding中可以包含routing key,binding信息被保存到exchange中的查询表,用于message的分发依据
工作模型
简单模式
- P:生产者,也就是发送消息的程序
- 消费者:消息的接收者,会一直等待消息到来
- queue:消息队列,图中红色部分,类似一个邮箱,可以缓存消息;生产者向其中投递消息,消费者从其中取出消息
工作队列模型
- Work Queues:多个或一个消费端,多个消费端共同消费同一个队列的消息
- 在同一个队列中如果有多个消费者,那么消费者之间同一个消息的关系是竞争的关系
- Work Queues对于任务过重或任务较多情况使用工作队列可以提高处理的速度
Pub/Sub订阅模式
- P:生产者,也就是发送消息的程序,但是不再发送到队列中,而是发给X(交换机)
- C:消费者,消息的接收者,会一直等待消息到来
- Queue:消息队列,接收消息,缓存消息
- Exchange:交换机(X),一方面,接收生产者发送的消息,另一方面,直到如何处理消息,例如递交给某个特别队列、递交给所有队列,或是将消息丢弃。Exchange的三种类型
-
- Fanout:广播,将消息交给所有绑定到交换集的队列
- Direct:定向,把消息交给符合指定routing key的队列
- Topic:通配符,把消息交给routing pattern(路由模式)的队列
Exchange(交换机)只负责转发消息,不具备存储消息的能力,因此如果没有任何队列与Exchange绑定,或者没有符合路由规则的队列,那么消息会丢失
Routing路由模式
模式说明:
- 队列与交换机的绑定,不能是任意绑定了,而是要指定一个RoutingKey
- 消息的发送方向在向Exchange发送消息时,也必须指定消息的RoutingKey
- Exchange不再是把消息交给每一个绑定的队列,而是根据RoutingKey进行判断,只有队列的RoutingKey与消息的RoutingKey与消息的Routingkey完全一致,才会接收到消息
对象说明:
- P:生产者,向Exchange发送消息,发送消息时,会指定一个routingKey
- X:Exchange(交换机):接收生产者的信息,然后会把消息递交给routingKey完全匹配的队列
- C1:消费者,其所在队列指定了需要routingKey为error的信息
- C2:消费者,其所在队列指定了需要routingKey为info,error,warning的消息
Topics通配符模式
模式说明:
- topic主题模式可以实现Pub/Sub发布于订阅模式和Routing路由模式的功能,只是在配置Routingkey的时候可以使用通配符,显得更加灵活
总结
- 简单模式:一个生产者,一个消费者,不需要设置交换机
- 工作队列模式Work Queue:一个生产者、多个消费者(竞争关系)、不需要设置交换机
- 发布订阅模式Publish/subscribe:需要设置类型为fanout的交换机,并且交换机和队列进行绑定,当发送消息到交换机后,交换机会将消息发送到绑定队列
- 路由模式Routing:需要设置类型为direct的交换机,交换机和队列进行绑定,并且指定routing key,当消息到交换机后,交换机会根绝routing key将消息发送到对应的队列
- 通配符模式Topic:需要设置类型为topic的交换机,交换机和队列进行绑定,并且指定通配符方式和routing key,当发送消息到交换机后,交换机会根据 routing key将消息发送到对应的队列