MQ全称为Message Queue-消息队列,是一种应用程序对应用程序的消息通信,一端只管往队列不断发布信息,另一端只管往队列中读取消息,发布者不需要关心读取消息的谁,读取消息者不需要关心发布消息的是谁,各干各的互不干扰。多用于分布式系统之间进行通信
使用消息MQ后,只需要保证消息格式不变,不需要关心发布者及消费者之间的关系,这两者不需要彼此联系
在一些不需要即时(同步)的返回结果操作,通过消息队列来实现异步。
在大量请求时(秒杀场景),使用消息队列做缓冲处理,削弱峰值流量,防止系统在短时间内被峰值流量冲垮。
场景:在大量流量涌入高峰,如数据库只能抗住2000的并发流量,可以使用MQ控制2000到数据库中
日志存储在消息队列中,用来处理日志,比如kafka。
在还未引进MQ之前,系统只需要关系生产端与消费端的接口一致性就可以了,现在引进后,系统需要关注生产端、MQ与消费端三者的稳定性,这增加系统的负担,系统运维成本增加。
引入了MQ,需要考虑的问题就增加了,如何保障消息的一致性,消费不被重复消费等问题,
A系统发送完消息直接返回成功,但是BCD系统之中若有系统写库失败,则会产生数据不一致的问题。
AMQP协议(Advanced Message Queuing Protocol,高级消息队列协议)是一个网络协议。它支持符合要求的客户端应用(application)和消息中间件代理(messaging middleware broker)之间进行通信。主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。
说简单点就是在异步通讯中,消息不会立刻到达接收方,而是被存放到一个容器中,当满足一定的条件之后,消息会被容器发送给接收方,这个容器即消息队列(MQ),而完成这个功能需要双方和容器以及其中的各个组件遵守统一的约定和规则,AMQP就是这样的一种协议,消息发送与接受的双方遵守这个协议可以实现异步通讯。这个协议约同时规定了消息的格式和工作方式。
消息代理(message brokers)从发布者(publishers)亦称生产者(producers)那儿接收消息,并根据既定的路由规则把接收到的消息发送给处理消息的消费者(consumers)。
由于AMQP是一个网络协议,所以这个过程中的发布者,消费者,消息代理 可以存在于不同的设备上。
消息(message)被发布者(publisher)发送给交换机(exchange),交换机常常被比喻成邮局或者邮箱。然后交换机将收到的消息根据路由规则分发给绑定的队列(queue)。最后AMQP代理会将消息投递给订阅了此队列的消费者,或者消费者按照需求自行获取。
Broker:又称 Server,接收客户端的连接,实现AMQP实体服务,接收和分发消息的应用,RabbitMQ Server 就是 Message Broker
Connection:连接,应用服务与Server的连接
Channel:信道,客户端可建立多个Channel,每个Channel代表一个会话任务
**Message:**消息,由 MessageProperties 和 body 构成
MessageProperties (SpringBoot)、AMQP.BasicProperties (基本API)可对消息的优先级、过期时间等参数进行设置,其中参数 correlation_id 一般作为消息主键
Exchange:交换机,消息将根据 routeKey 被交换机转发给对应的绑定队列
Queue:队列,消息最终被送到这里等待消费者取走,参数中的Auto-delete意为当前队列的最后一个消息被取出后是否自动删除
Binding:绑定 exchange 和 queue 之间的虚拟连接,二者通过 routingkey 进行绑定
**Routingkey:**路由规则,交换机可以用它来确定消息改被路由到哪里
Virtual host:虚拟主机,用于进行逻辑隔离,是最上层的消息路由,一个虚拟主机中可以有多个 Exchange 和 Queue,同一个虚拟主机中不能有名称一样的 Exchange 和 Queue