文章目录
消息队列:RabbitMQ
相关文章以及知识点
- rabbitmq讲解:
- 文章:https://www.cnblogs.com/pyedu/p/11866829.html
- 视频:https://www.bilibili.com/video/av328394153?p=1
- rabbitmq后台
- http://127.0.0.1:15672/#/queues
- username:guest
- password:guest
- RPC(remote procedure call):远程程序调用,一个应用程序调用另一个地址空间(共享网络的另外一台机器)的过程或函数
- https://www.cnblogs.com/pyedu/p/12196027.html
- 负载均衡:替服务器分担压力
一 什么是消息队列(MQ)
- Message Queue 消息队列是一种应用程序对应用程序的通信方式
- MQ是消费者-生产者模型的一个典型的代表
- 生产者往消息队列里面插入数据,消费者从消息队列里取数据。双方都不知道对方的存在
二 为什么要用消息队列
-
消息队列可以充当一个中间组件,存储并管理数据。
-
消息队列中间件是分布式系统中的重要组件,主要解决应用解耦,异步消息,流量削峰等问题,实现高性能,高可用,可伸缩和最终一致性架构。目前使用较多的消息队列有ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ
-
解耦:减少订单系统与配送系统,商家系统以及后台系统之间的代码联系,订单系统只需要将数据传递给消息队列即可,无需编写对应其他系统的API调用代码
-
异步消息:订单系统将用户下单的数据插入消息队列后就可以返回“订单成功”的消息给用户了,无需等待其他三个系统处理完用户发过来的数据,才将“订单成功”信息返回给用户,提升了用户的体验
-
流量削峰:若没有消息队列,当用户量太大,用户数据超出了配送系统,商家系统以及后台系统处理能够处理的最大数据量,则可能会导致系统崩溃。有消息队列,则可以起到缓冲的作用
三 RabbitMQ的使用
-
这里省略安装过程,可自行搜索完成
-
生产者与消费者程序执行顺序没有先后之分
-
简单模式流程图:
1 简单模式
1-1 生产者
- 1 链接rabbitmq消息队列
- 2 在消息队列中创建一个队列queue
- 3 将数据插入队列中
1-2 消费者
- 1 链接rabbitmq
- 2 同样在消息队列中创建一个队列queue(防止生产者程序未启动而导致没有queue可以获取数据)
- 3 定义回调函数(对队列中获取到的数据进行操作)
- 4 监听队列
1-3 机制讲解
- 1 应答机制
- 作用在于防止消费者程序将队列中的数据取走了而后消费者在处理数据的过程中程序崩溃了而导致数据丢失。
- 启动手动应答的话,消费者将数据从队列中取走时队列会copy一份数据,需要消费者返回一个应答标识,此时才可以确定消费者处理消息成功。
- 增加数据的安全性,缺点在于会影响处理数据的速率
- 2 持久化机制
- 作用在于防止消息队列在接收到数据后崩溃而导致数据丢失,开启持久化机制,消息队列在获取到数据时会将数据保存到磁盘中
- 3 分发机制
- 1 轮询分发(数据一个一个分发)
- 由于队列queue是先进先出,所以当队列有5个数据时,ABC获得数据的顺序是A->B->C->A->B
- 缺点:ABC三个系统性能不同时,处理数据速度也不一样时,会导致处理快的系统空闲下来,造成资源浪费,影响总体处理速度
- 2 公平分发(会判断ABC系统的处理速度从而将数据发给已经处理完数据的系统)
- 1 轮询分发(数据一个一个分发)
2 交换机模式
- 交换机模式流程图
2-1 发布订阅模式
- 发布订阅和简单的消息队列区别在于
- 发布订阅会将消息发送给所有的订阅者,而简单模式的消息队列中的数据被消费一次便消失
- 所以,RabbitMQ实现发布订阅模式时,会为每一个订阅者创建一个队列,而发布者发布消息时,会将消息放置在所有相关队列中
2-2 关键字模式(发布订阅模式上增加了功能)
- 关键字模式是在发布订阅模式上增加了通过关键字筛选数据的功能
- 消费者将队列绑定到交换机时可以通过配置参数routing_key来说明该队列所对应的关键字是什么,相当于给队列指定了一个类型
- 生产者在向交换机插入数据时通过参数routing_key来指定该数据只有哪些关键字队列才可以接收到
- 这样的话就可以对数据进行分类发送,就不会形成将某些对于消费者A是无关竟要的数据发送消费者系统A
2-3 通配符模式(对关键字模式进行了改进)
- 类似于关键字,差别在于消费者给队列指定的关键字可以是模糊的,相当于正则表达式,生产者发送的数据所对应的队列类型也可以是模糊的。
四 基于rabbitmq的RPC实现
未完待续…