当前位置: 首页 > news >正文

RabbitMQ应用场景及特性

RabbitMQ是一款开源的消息队列中间件,拥有非常好用的管理控制面板,类似使用navicat一样,简便的操纵数据库。

应用场景

一、流量削峰

在一些并发量较高的场景下,比如秒杀活动,抢票等,同一时间访问量急剧增大,处理业务的服务器由于业务比较繁琐,比较脆弱,此时可以使用消息队列作为中转,大量请求先发送到消息队列,处理业务的服务器再根据自己的节奏,从消息队列中获取消息并处理。

二、解耦

如果服务器A直接与服务器B进行通信,当A这边想要修改代码,或者A服务挂了, 可能会导致服务器B需要修改代码。如果使用消息队列,服务器B只需要关注消息队列中的数据,不需要管服务器A中是怎么去写代码的。

三、异步

当我们想要将数据写入到数据库中,然后再同步到缓存中,此时我们发现,这是一条线性的方式,如果使用消息队列,将数据发送到消息队列,写入缓存的服务器和写入数据库的服务器去订阅消息队列,一旦有数据,就可以并行执行。

四、消息分发

当我们的系统想要再添加一个模块来获取之前的数据,就可以直接去订阅消息队列,后续消息就会被转发过来,然后就可以执行处理了。一旦下游想要上游的数据了,就添加一个订阅者即可。

工作流程

使用rabbitmq主要分为如下几部:

1)创建连接:Producer连接到RabbitMQ服务器,通过ConnectionFactory建立Connection,开启一个channel。

2)声明交换机队列以及绑定关系:Producer声明⼀个交换机(Exchange)和队列(Queue),并将队列绑定到交换机。

3)发布消息:Producer发送消息⾄RabbitMQ服务器。

4)消息存储及转发:RabbitMQ接收到消息,根据绑定关系进行消息分发,存储到相应队列中。

5)消费消息::消费者监听Queue,当消息到达时,从Queue中获取消息,处理后,向RabbitMQ发送消息确认。

6)消息删除:消息被确认后,RabbitMQ会把消息从Queue中删除。

特性

在RabbitMQ中主要有这么几个特性:

1)发布确认:用来保证可靠性的方式之一,运用在生产者一方。解决的是保证发布的消息能到达消息队列服务器以及消息能被交换机正确转发到队列。对应着两种模式:confirm和return模式。

2)持久化:用来保证可靠性的方式之一,运用在消息队列服务器。可以对交换机、队列、消息进行持久化,当服务器挂了,后续重启恢复消息。

3)消息确认:用来保证可靠性的方式之一,运用在消费者一方。可以通过配置的方式来选择,消息者在获取到消息时,是自动应答,还是手动应答,当接收到应答时,删除消息。

4)重试机制:在消息传递的过程中,可能会遇到网络故障等问题,rabbitmq还提供了重试机制,当消息发送失败,会进行重新发送。

5)TTL:过期时间,RabbitMQ提供了可以设置队列和消息的过期时间。设置队列的TTL,即队列中的所有消息的过期时间都为队列的TTL,或者可以单独设置消息的TTL。但需要注意设置消息TTL后,消息到了过期时间不一定会立马删除,需要等待队列前面的消息都过期了,才会删除。

6)死信队列:用来存放无法被消费的队列。当消息过期或者nack或者队列到达最大长度无法接收,此时消息会变成死信,然后根据配置,发送到死信交换机,再到死信队列中。

7)延迟队列:即等待一定时间后,消费者才可以消费这条消息。但RabbitMQ本身没有直接提供延迟队列的功能,但可以通过TTL+死信队列的方式进行实现或者添加一个RabbitMQ的官方延迟插件。

8)事务:将操作变成原子的,要么全部成功,要么相当于没执行。

9)负载均衡、限流:可以通过参数配置的方式来限定消费者所能保持最大未确认消息的数量。以此达到限流或者负载均衡的效果。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • PointMC: Multi-instance Point Cloud Registration based on Maximal Cliques 论文解读
  • 经典算法KMP讲解,包含C++解法ACM模式
  • Python脚本实现USB自动复制文件
  • ADC模数转换在stm32上的应用
  • C语言基础题:硬币问题(C语言版)
  • 蚂蚁0511笔试-选择题
  • 9-springCloud集成nacos config
  • btslab靶场-通过xss获取他人cookie并利用
  • 【vue2+elementui】记录el-upload导入文件:只上传一个文件,且再次上传会覆盖上一个文件
  • 机械学习—零基础学习日志(高数18——无穷小与无穷大)
  • C++笔记---类和对象(中)
  • 【Matlab】快速傅里叶变换fft代码(单边谱)
  • 猫头虎分享疑难杂Bug:error: subprocess-exited-with-error 解决方案
  • docker 建木 发版 (详细教程)
  • Open Interpreter - 开放解释器
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 【Linux系统编程】快速查找errno错误码信息
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • Java面向对象及其三大特征
  • k8s 面向应用开发者的基础命令
  • linux安装openssl、swoole等扩展的具体步骤
  • maven工程打包jar以及java jar命令的classpath使用
  • MySQL的数据类型
  • spring学习第二天
  • vue 个人积累(使用工具,组件)
  • vue总结
  • Vultr 教程目录
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 创建一个Struts2项目maven 方式
  • 给新手的新浪微博 SDK 集成教程【一】
  • 警报:线上事故之CountDownLatch的威力
  • 深入浅出Node.js
  • 小程序01:wepy框架整合iview webapp UI
  • 用jquery写贪吃蛇
  • 由插件封装引出的一丢丢思考
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​configparser --- 配置文件解析器​
  • ​Linux·i2c驱动架构​
  • ‌JavaScript 数据类型转换
  • #、%和$符号在OGNL表达式中经常出现
  • #mysql 8.0 踩坑日记
  • #数据结构 笔记一
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (Python) SOAP Web Service (HTTP POST)
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (精确度,召回率,真阳性,假阳性)ACC、敏感性、特异性等 ROC指标
  • (算法)区间调度问题
  • (新)网络工程师考点串讲与真题详解
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .Mobi域名介绍
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查
  • .NET 回调、接口回调、 委托
  • @Autowired标签与 @Resource标签 的区别
  • @converter 只能用mysql吗_python-MySQLConverter对象没有mysql-connector属性’...