RabbitMQ原理RabbitMQ各组件作用RabbitMQ使用场景
RabbitMQ原理
RabbitMQ介绍
- MQ全称为Message Queue, 是一种分布式应用程序的的通信方法,它是消费-生产者模型的一个典型的代表
- producer往消息队列中不断写入消息,而另一端consumer则可以读取或者订阅队列中的消息
- RabbitMQ是一个遵循AMQP协议的消息中间件,它从生产者接受消息并传递给消费者,在这和过程中,根据路由规则就行路由、缓存和持久化
- 业务上,可以实现服务提供者和消费者之间的数据解耦,提供高可用性的消息传输机制,在实际生产中应用相当广泛
Rabbitmq系统最核心的组件:Exchange和Queue
- clientA生产消息,发送给服务器端的Exchange1
- Exchange1收到消息,根据ROUTINKEY,将消息转发给匹配的Queue1
- Queue1收到消息,将消息发送给订阅者Client1
- Client1收到消息,发送ACK给队列确认收到消息
- Queue1收到ACK,删除队列中缓存的此条消息
RabbitMQ各组件作用:
# 1、Publisher:是Message的生产者,Publisher这个Clients产生了一些Message。# 2、Consumer:Message的消费者,Publisher产生的Message,最终要到达Consumer这个Clients,进行消费。# 3、Exchange:指定消息按什么规则,路由到哪个Queue,Message消息先要到达Exchange,在Server中承担着从Produce接收Message的责任。# 4、Queue:到达Exchange的消息,根据制定的规则(Routing key)到达对应的Queue,
# 在Server中承担着装载Message,是Message的容器,等待被消费出去。# 5、Routing key:在Exchange和Queue之间隐藏有一条黑线,可以将这条黑线看成是Routing key,
# Exchange就是根据这些定义好的Routing key,将Message送到对应的Queue中去,是Exchange和Queue之间的桥梁。# 6、Broker:之前一直不理解这个Broker,其实Broker就是接收和分发消息的应用,也就是说RabbitMQ Server就是Message Broker。# 7、VirtualHost:虚拟主机,一个Broker里可以开有多个VirtualHost,它的作用是用作不同用户的权限分离。 # 8、Connection:是Publisher/Consumer和Broker之间的TCP连接。
# 断开连接的操作只会在Publisher/Consumer端进行,Broker不会断开连接,除非出现网络故障或者Broker服务出现问题,Broker服务宕了。# 9、Connection: Channel: 如果每一次访问RabbitMQ就建立一个Connection,那在消息量大的时候建立TCP Connection的开销就会很大,
# 导致的后果就是效率低下。
Queue(组件1)
- 消息队列,提供了FIFO的处理机制,具有缓存消息的能力,rabbitmq中,队列消息可以设置为持久化,临时或者自动删除
- 设置为持久化的队列,queue中的消息会在server本地硬盘存储一份,防止系统crash,数据丢失
- 设置为临时队列,queue中的数据在系统重启之后就会丢失
- 设置为自动删除的队列,当不存在用户连接到server,队列中的数据会被自动删除
Exchange(组件2)
- Exchange类似于数据通信网络中的交换机,提供消息路由策略
- rabbitmq中,producer不是通过信道直接将消息发送给queue,而是先发送给Exchange
- 一个Exchange可以和多个Queue进行绑定,producer在传递消息的时候,会传递一个ROUTING_KEY
- Exchange会根据这个ROUTING_KEY按照特定的路由算法,将消息路由给指定的queue
- 和Queue一样,Exchange也可设置为持久化,临时或者自动删除
RabbitMQ使用场景
1、异步处理
- 在注册服务的时候,如果同步串行化的方式处理,让存储数据、邮件通知等挨着完成,延迟较大
- 采用消息队列,可以将邮件服务分离开来,将邮件任务之间放入消息队列中,之间返回,减少了延迟,提高了用户体验
2、应用解耦
- 电商里面,在订单与库存系统的中间添加一个消息队列服务器,在用户下单后,订单系统将数据先进行持久化处理
- 然后将消息写入消息队列,直接返回订单创建成功,然后库存系统使用拉/推的方式,获取订单信息再进行库存操作
3、流量削锋
- 秒杀活动中,一般会因为流量过大,导致流量暴增,应用挂掉。为解决这个问题,一般需要在应用前端加入消息队列
- 服务器在接收到用户请求后,首先写入消息队列,这时如果消息队列中消息数量超过最大数量,则直接拒绝用户请求或返回跳转到错误页面
- 秒杀业务根据秒杀规则读取消息队列中的请求信息,进行后续处理
4、日志处理:Kalfka消息中间件
RabbitMQ如何保证可靠消费
确认种类
1)一种是消息发送确认
- 这种是用来确认生产者将消息发送给交换器,交换器传递给队列的过程中,消息是否成功投递
- 发送确认分为两步,一是确认是否到达交换器,二是确认是否到达队列
2)第二种是消费接收确认
- 这种是确认消费者是否成功消费了队列中的消息
消息发送确认(第一种)
- 如果设置了Mandatory属性则当消息不能被正确路由到队列中去时将会触发ReturnCallback
- 是否到达交换器
- 是否到达队列
1)ReturnCallback接口当消息从交换器发送到对应队列失败时触发(比如根据发送消息时指定的routingKey找不到队列时会触发)
2)一旦消息被投递到所有匹配的队列之后Broker就会发送一个确认给生产者(包含消息的唯一ID),这就使得生产者知道消息已经正确到达目的队列了
消费接收确(确认)
- 一旦发布一条消息生产者应用程序就可以在等信道返回确认的同时继续发送下一条消息
- 当消息最终得到确认之后,生产者应用可以通过回调ACK方法来处理该确认消息
- 如果RabbitMQ因为自身内部错误导致消息丢失,生产者应用可以通过回调NACK方法来处理该确认消息
RabbitMQ原理RabbitMQ各组件作用RabbitMQ使用场景相关推荐
- 末学者笔记--openstack共享组件:rabbitmq(3)
openstack共享组件:消息队列rabbitmq 一.MQ 全称为 Message Queue, 消息队列( MQ ) 是一种应用程序对应用程序的通信方 ...
- RabbitMQ原理及集群的深入剖析
RabbitMQ原理及集群的深入剖析 说在前面 RabbitMQ应用场景剖析 RabbitMQ的组件剖析 说一说绑定过程: Exchange类型 一些事项 一些思考 关于持久化 RabbitMQ的集群 ...
- [RabbitMQ]RabbitMQ原理与相关操作(一)
2019独角兽企业重金招聘Python工程师标准>>> RabbitMQ原理与相关操作(一) 小编是菜鸟一枚,最近想试试MQ相关的技术,所以自己看了下RabbitMQ官网,试着写下自 ...
- 【重难点】【RabbitMQ 01】消息队列的作用、主流的消息队列、RabbitMQ 基于什么传输消息、RabbitMQ 模型架构、死信队列和延迟队列
[重难点][RabbitMQ 01]消息队列的作用.主流的消息队列.RabbitMQ 基于什么传输消息.RabbitMQ 模型架构.死信队列和延迟队列 文章目录 [重难点][RabbitMQ 01]消 ...
- 消息队列-rabbitmq原理
RabbitMQ是什么 面向消息的中间件,用于组件间的解耦(主要体现在消息的发送者 与接收者 没有强依赖) RabbitMQ特点 高可用,易扩展,多语言客户端,管理界面. RabbitMQ原理 架构图 ...
- RabbitMQ原理构成分析以及实战应用
一.RabbitMQ使用场景 为什么要使用RabbitMQ,可以通过以下场景来说明 场景: 比如用户在购物的时候,选中一件物品下单了,这时候就会发一个请求给我们的订单系统(Order),此时订单系统再 ...
- 使用EasyNetQ组件操作RabbitMQ消息队列服务
RabbitMQ是一个由erlang开发的AMQP(Advanved Message Queue)的开源实现,是实现消息队列应用的一个中间件,消息队列中间件是分布式系统中重要的组件,主要解决应用耦合, ...
- RabbitMQ原理
文章目录 1 RabbitMQ原理 1.1 RabbitMQ原理图 1.2 原理讲解 1.2.1 Message消息 1.2.2 Publisher消息生产者 1.2.3 Consumer消息消费者 ...
- RabbitMq原理及应用
一.简介 MQ(Message Queue),即消息队列,是一种实现应用级别之间的通信手段.不同应用之间可以通过读写消息,以消息为媒介传递应用数据,不需要应用之间建立强连接.此方式与远程调用(RPC) ...
最新文章
- 某程序员求助:隔壁组组长常常微信骚扰自己怎么办?组长和自己都是男生,自己是双性恋,但想找个年轻的!网友:信息量太大!...
- 【追一科技校招】AI浪潮已来,你不可错过的澎湃风口!
- 机器学习中数据集的拆分
- 天涯明夜刀手游微信第一服务器,天涯明月刀手游微信哪个区人多 微信一区选哪个好[多图]...
- Android WebView注入js文件,判断当前HTML有没有某个js然后再注入
- C语言——确定char、short、int和short变量有符号和无符号时的取值范围
- JS正则验证邮箱的格式
- 软件测试用例质量不高?我教你如何编写高质量的测试用例!
- css_selector定位总结
- 框架-vue-cli
- (转载)Fiddler 教程
- ntsd调试dump文件
- sublime中PyV8问题
- MGS摄像头:USF56S335_3238_V2 IMX335 5MP UVC应用手册
- 常见视频输出接口类型
- 微信扫二维码跳转网页链接如何制作
- 20170321多益在线笔试(二笔)
- Ubuntu 设置默认播放器、浏览器、图片查看器
- BUUCTFweb比赛做题记录
- JUC编程java多线程并发详细总结
热门文章
- 预测2019:数据中心将有哪些变化
- DL之DeepLabv2:DeepLab v2算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
- Keras之DNN:利用DNN【Input(8)→(12+8)(relu)→O(sigmoid)】模型实现预测新数据(利用糖尿病数据集的八个特征进行二分类预测
- Ubuntu18.04 CUDA与cudnn安装
- app 崩溃测试 (转:CSDN 我去热饭)
- XGBoost的理解
- ---Mybatis3学习笔记(2)
- 统一的定义导航栏的背景颜色(NavigationController)
- 字符串中统计单词个数
- 配置错误定义了重复的“system.web.extensions/scripting/scriptResourceHandler” 解决办法...