MQ 概述:
MQ 全称 message queue (消息队列) ,是在消息的传输过程中保存消息的容器。多用于分布式系统之间进行通信。
MQ 消息队列,存储消息的中间件
分布式系统的通信两种方式:直接远程调用和借助第三方完成间接通信
发送方称为生产者,接收放称为消费者
MQ 优势和劣势
优势:
应用解耦
异步提速
削峰填谷
劣势:
系统可用性降低:系统引入的外部系统越多,系统稳定性越差。一旦MQ 宕机,就会对业务造成影响。如何保证 MQ 的高可用?
系统复杂度提高:MQ 的加入大大增加了系统的复杂度,以前系统之间是远程调用的,现在是通过MQ 异步调用。如何保证消息没有被重复消费?如何处理消息丢失情况?如何保证消息传递的顺序性?
一致性问题:A 系统处理完业务,通过 MQ 给 B、C、D 三个系统发消息数据,如果 B 系统、C系统处理成功,D系统处理失败。如何保证数据处理的一致性。
常见的MQ 产品
目前叶节有很多的MQ产品,例如 RabbitMQ、RocketMQ、ActiveMQ、Kafka、ZeroMQ、MetaMQ 等,也有直接使用 Redis 充当消息队列的案例。
RabbitMQ 概述
AMQP, 即 Advanced Message Queuing Protocol (高级消息队列协议), 是一个网络协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。2006 年, AMQP 规范发布。类比 HTTP。
2007 年, Rabbit 技术公司基于 AMQP 标准开发的 RabbitMQ。RabbitMQ 采用 Erlang 语言开发。,专门为开发高并发和分布式系统的一种语言。
有很多虚拟服务器,完成了逻辑分区的功能。
Broker
: 接收和分发消息的应用,RabbitMQ Server 就是 Message Broker
Virtual host
:出于多租户和安全因素设计的,把 AMQP 的基本组件划分到一个虚拟的分组中,类似于网络中的 namespace 概念。当多个不同的用户使用同一个 RabbitMQ server 提供的服务时,可以划分出多个 vhost, 每个用户在自己的 vhost 创建 exchange / queue 等。
Connection
:publisher / consumer 和 broker 之间的 TCP 链接。
Channel
:如果说每一次访问 RabbitMQ 都建立一个 Connection,在消息量大的时候建立 TCP Connection 的开销将是巨大的,效率也较低。 Channel 是在 connection 内部建立的逻辑连接, 如果应用程序支持多线程,通常每个 thread 创建单独的 channel 进行通讯, AMQP method 包含了 channel id 帮助客户端和 message broker 识别 channel, 所以 channel 之间是完全隔离的。 Channle 作为轻量级的 Connection 极大减少了操作系统建立 TCP connection 的开销。
Exchange
:message 到达 broker 的第一站,根据分发规则,匹配查询表中的 routing key,分发消息到 queue 中去。 常用的类型有:direct(point-to-point) , topic (publish-subscribe)and fanout( multicast).
Queue
: 消息最终被送到这里等待 consumer 取走。
Binding
: exchange 和 queue 之间的虚拟连接, binding 中可以包含 routing key。 Binding 信息被保存到 exchange 中的查询表中, 用于 message 的分发依据
RabbitMQ 提供了6种工作模式
:简单模式、work queues、Publish/Subscribe 发布于订阅模式、Routing 路由模式、Topics 主题模式、RPC 远程调用模式(远程调用,不太算MQ;)
JMS
JMS 即 Java 消息服务(JavaMessage Service)应用程序接口,是一个Java 平台中关于面向消息中间件的 API
JMS 是 JavaEE 规范中的一种,类比 JDBC
很多消息中间件都实现了 JMS 规范,例如: ActiveMQ。RabbitMQ 官方没有提供 JMS 的实现包,但是开源社区有
RabbitMQ 的安装和配置
CentOS7安装RabbitMQ_huayang183的博客-CSDN博客
Linux下安装RabbitMQ_零碎de記憶的博客-CSDN博客_linux安装rabbitmq
找了几个博客都没装成功,最后从各自官网下载的最新的装上了,根据上面这两个装上了
这几个命令前得加上 ./
rabbitMQ教程(五)rabbitmq 指令 以及解决web管理界面无法使用guest用户登录_dieweidong5625的博客-CSDN博客
rabbitmq-server -detached 开启rabbitmqctl stop 停止rabbitmqctl status 状态还有就是我用的阿里云搭的,需要在阿里的防火墙开一下端口。
没有的可以暂时用这个如果这个还在的话。
账户:rabbit1
密码:123456
RabbitMQ 快速入门
1. 入门程序
需求:使用简单模式完成消息传递
步骤1:创建工程(生产者、消费者)
步骤2:分别添加依赖
步骤3:编写生产者发送消息
RabbitMQ 快速入门 – 生产者
1. 创建连接工厂
2. 设置参数
3. 创建Connection
4. 创建 Channel
5. 创建队列 Queue
6. 发送消息
7. 释放资源
RabbitMQ 快速入门-消费者
1. 创建连接工厂
2. 设置参数
3. 创建Connection
4. 创建 Channel
5. 创建Consumer,重写方法对数据进行操作
6. Channel消费消息
7. 不用释放资源(一直保持在监听)
RabbitMQ 的工作模式 – Work queues 工作队列模式
Work Queues: 与入门程序的简单模式相比,多了一个或一些消费端,多个消费端共同消费同一个队列中的消息。
应用场景:对于任务过重或任务较多情况使用工作队列可以提高任务处理速度。
代码编写:Work Queues 与入门程序的简单模式的代码几乎时一样的。可以完全复制,并多复制一个消费者进行多个消费者同时对消费消息的测试。
小结:
1. 在一个队列中如果有多个消费者,那么消费者之间对于同一个消息的关系时竞争的关系。
2. Work Queues 对于任务过重或任务较多情况使用工作队列可以提高任务处理的速度。例如:短信服务部署多个,只需要有一个节点成功发送即可。
Pub/Sub 订阅模式
在订阅模型中,多了一个 Exchange 角色,而且过程略有变化:
P :生产者,也就是要发送消息的程序,但是不在发送到队列中,而是发给 X (交换机)
C :消费者,消息的接收者,会一直等待消息的到来
Queue:消息队列,接受消息,缓存消息
Exchange:交换机(X)。一方面,接受生产者发送的消息。另一方面,知道如何处理消息,例如递交给某个特别队列、或是将消息丢弃。到底如何操作,取决于 Exchange 的类型。 Exchange 有常见一下 3 中类型:
Fanout:广播,将消息交给所有兵丁到交换机的队列
Direct:定向,把消息交给符合指定 routing key 的队列
Topic:通配符,把消息交给符合 routing pattern (路由模式)的队列
Exchange 只负责转发消息,不具备存储消息的能力,因此如果没有任何队列与 Exchange绑定,或者没有符合路由规则的队列,那么消息会丢失
Routing 路由模式
队列与交换机的绑定,不能是任意绑定了,二十要指定一个RoutingKey
消息的发送方在向 Exchange 发送消息时,也不许指定消息的 RoutingKey
Exchange 不在把消息交给每一个绑定的队列,而是根据消息的Routing Key 进行判断,只有队列的 Routingkey 与消息的Routing key 完全一直,才会接收到消息。
小结:Routing 模式要求队列在绑定交换机时要指定 routing key ,消息会转发到符合 routing key 的队列。
Topics 通配符模式
Topic 主题模式可以实现 Pub/Sub 发布与订阅模式和 Routing 路由模式的功能,只是 Topic 在配置 routing key 的时候可以使用通配符,显得更加灵活。
消息可靠投递
在使用 RabbitMQ 的时候,作为消息发送方希望杜绝任何消息丢失或者投递失败场景。RabbitMQ 为我们提供了两种方式用来控制消息的投递可靠性模式。
- confirm 确认模式
- return 退回模式
rabbitmq 整个消息投递的路径为:
producer -> rabbitmq broker -> exchange -> queue -> consumer
- 消息从 producer 到 exchange 则会返回一个 confirmCallback
- 消息从 exchange 到 queue 投递失败则会返回一个 returnCallback
我们将以用这两个 callback 控制消息的可靠性投递