MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。

RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而集群和故障转移是构建在开放电信平台框架上的。本身支持很多的协议:AMQP,XMPP, SMTP, STOMP,也正是如此,使的它变的非常重量级,更适合于企业级的开发

RabbitMq支持多种模式 , 支持集群 主从等多种部署 .

RabbitMQ 使用场景

1. 解耦(为面向服务的架构(SOA)提供基本的最终一致性实现)

场景说明:用户下单后,订单系统需要通知库存系统。传统的做法是,订单系统调用库存系统的接口。

传统模式的缺点:

假如库存系统无法访问,则订单减库存将失败,从而导致订单失败订单系统与库存系统耦合引入消息队列

订单系统:用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回用户订单下单成功库存系统:订阅下单的消息,采用拉/推的方式,获取下单信息,库存系统根据下单信息,进行库存操作假如:在下单时库存系统不能正常使用。也不影响正常下单,因为下单后,订单系统写入消息队列就不再关心其他的后续操作了。实现订单系统与库存系统的应用解耦为了保证库存肯定有,可以将队列大小设置成库存数量,或者采用其他方式解决。基于消息的模型,关心的是“通知”,而非“处理”。

短信、邮件通知、缓存刷新等操作使用消息队列进行通知。

消息队列和RPC的区别与比较:

RPC: 异步调用,及时获得调用结果,具有强一致性结果,关心业务调用处理结果。消息队列:两次异步RPC调用,将调用内容在队列中进行转储,并选择合适的时机进行投递(错峰流控)2. 异步提升效率

场景说明:用户注册后,需要发注册邮件和注册短信。传统的做法有两种1.串行的方式;2.并行方式

(1)串行方式:将注册信息写入数据库成功后,发送注册邮件,再发送注册短信。以上三个任务全部完成后,返回给客户端

(2)并行方式:将注册信息写入数据库成功后,发送注册邮件的同时,发送注册短信。以上三个任务完成后,返回给客户端。与串行的差别是,并行的方式可以提高处理的时间

引入消息队列,将不是必须的业务逻辑,异步处理。改造后的架构如下:

流量削峰

流量削峰也是消息队列中的常用场景,一般在秒杀或团抢活动中使用广泛

应用场景:系统其他时间A系统每秒请求量就100个,系统可以稳定运行。系统每天晚间八点有秒杀活动,每秒并发请求量增至1万条,但是系统最大的处理能力只能每秒处理1000个请求,于是系统崩溃,服务器宕机。

之前架构:大量用户(100万用户)通过浏览器在晚上八点高峰期同时参与秒杀活动。大量的请求涌入我们的系统中,高峰期达到每秒钟5000个请求,大量的请求打到MySQL上,每秒钟预计执行3000条SQL。但是一般的MySQL每秒钟扛住2000个请求就不错了,如果达到3000个请求的话可能MySQL直接就瘫痪了,从而系统无法被使用。但是高峰期过了之后,就成了低峰期,可能也就1万用户访问系统,每秒的请求数量也就50个左右,整个系统几乎没有任何压力。

引入MQ:100万用户在高峰期的时候,每秒请求有5000个请求左右,将这5000请求写入MQ里面,系统A每秒最多只能处理2000请求,因为MySQL每秒只能处理2000个请求。系统A从MQ中慢慢拉取请求,每秒就拉取2000个请求,不要超过自己每秒能处理的请求数量即可。MQ,每秒5000个请求进来,结果只有2000个请求出去,所以在秒杀期间(将近一小时)可能会有几十万或者几百万的请求积压在MQ中。

关于流量削峰:秒杀系统流量削峰这事儿应该怎么做?

这个短暂的高峰期积压是没问题的,因为高峰期过了之后,每秒就只有50个请求进入MQ了,但是系统还是按照每秒2000个请求的速度在处理,所以说,只要高峰期一过,系统就会快速将积压的消息消费掉。我们在此计算一下,每秒在MQ积压3000条消息,1分钟会积压18万,1小时积压1000万条消息,高峰期过后,1个多小时就可以将积压的1000万消息消费掉。

引入消息队列的优缺点

优点

优点就是以上的那些场景应用,就是在特殊场景下有其对应的好处,解耦、异步、削峰。

缺点

系统的可用性降低系统引入的外部依赖越多,系统越容易挂掉,本来只是A系统调用BCD三个系统接口就好,ABCD四个系统不报错整个系统会正常运行。引入了MQ之后,虽然ABCD系统没出错,但MQ挂了以后,整个系统也会崩溃。

系统的复杂性提高引入了MQ之后,需要考虑的问题也变得多了,如何保证消息没有重复消费?如何保证消息不丢失?怎么保证消息传递的顺序?

一致性问题A系统发送完消息直接返回成功,但是BCD系统之中若有系统写库失败,则会产生数据不一致的问题。

Redis消息队列和RabbitMQ对比

可靠消费

Redis:没有相应的机制保证消息的消费,当消费者消费失败的时候,消息体丢失,需要手动处理
RabbitMQ:具有消息消费确认,即使消费者消费失败,也会自动使消息体返回原队列,同时可全程持久化,保证消息体被正确消费

可靠发布

Reids:不提供,需自行实现
RabbitMQ:具有发布确认功能,保证消息被发布到服务器

高可用

Redis:采用主从模式,读写分离,但是故障转移还没有非常完善的官方解决方案
RabbitMQ:集群采用磁盘、内存节点,任意单点故障都不会影响整个队列的操作

持久化

Redis:将整个Redis实例持久化到磁盘
RabbitMQ:队列,消息,都可以选择是否持久化

消费者负载均衡

Redis:不提供,需自行实现
RabbitMQ:根据消费者情况,进行消息的均衡分发

队列监控

Redis:不提供,需自行实现
RabbitMQ:后台可以监控某个队列的所有信息,(内存,磁盘,消费者,生产者,速率等)

流量控制

Redis:不提供,需自行实现
RabbitMQ:服务器过载的情况,对生产者速率会进行限制,保证服务可靠性

出入队性能

对于RabbitMQ和Redis的入队和出队操作,各执行100万次,每10万次记录一次执行时间。
测试数据分为128Bytes、512Bytes、1K和10K四个不同大小的数据。

应用场景分析
Redis:轻量级,高并发,延迟敏感
即时数据分析、秒杀计数器、缓存等

RabbitMQ:重量级,高并发,异步
批量数据异步处理、并行任务串行化,高负载任务的负载均衡等

RabbitMq使用场景解析以及优缺点相关推荐

  1. RabbitMQ(三):RabbitMQ 使用场景

    一. RabbitMQ 简介 二. RabbitMQ 使用场景 2.1 解耦 2.2 异步提升效率 2.3 流量削峰 三. 引入消息队列的优缺点 优点 缺点 总结 一. RabbitMQ 简介 MQ全 ...

  2. MQ(消息队列)常见的应用场景解析

    MQ(消息队列)常见的应用场景解析 原文:MQ(消息队列)常见的应用场景解析 前言 提高系统性能首先考虑的是数据库的优化,之前一篇文章<数据库的使用你可能忽略了这些>中有提到过开发中,针对 ...

  3. 物联网常见协议之Amqp协议及使用场景解析

    摘要:本文围绕AMQP协议,为大家详细解析AMQP协议.核心技术亮点.多协议之间的对比以及使用实践. 本文分享自华为云社区<物联网常见协议之Amqp协议及使用场景解析>,作者:张俭. 引言 ...

  4. 读后感与机翻《整体的三维场景解析和重建从单一的RGB图像》

    以下是研究朱松纯FPICU概念中F(functionality)的第一篇论文记录: 读后感: 文章做了什么事? 提出一种3D室内场景解析和重建的算法,可以从单个RGB图像同时重建出室内场景的功能层次和 ...

  5. ECCV2020 oral | 基于语义流的快速而准确的场景解析

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 论文地址:https://arxiv.org/abs/2002.10120 代码地址:https:// ...

  6. felzenszwalb算法_学习图像场景解析的理论和应用(二)场景解析的经典算法分析之SLIC...

    2003 年,任晓峰教授在图像分割技术层面上提出了超像素分割的这一概念,是指具有相似纹理.颜色.亮度等特征的相邻像素构成的有一定视觉意义的不规则像素块.它利用像素之间特征的相似性将像素分组,用少量的超 ...

  7. RabbitMQ原理RabbitMQ各组件作用RabbitMQ使用场景

    RabbitMQ原理 RabbitMQ介绍 MQ全称为Message Queue, 是一种分布式应用程序的的通信方法,它是消费-生产者模型的一个典型的代表 producer往消息队列中不断写入消息,而 ...

  8. 面试官系统精讲Java源码及大厂真题 - 42 常用的 Lambda 表达式使用场景解析和应用

    42 常用的 Lambda 表达式使用场景解析和应用 引导语 我们日常工作中,Lambda 使用比较多的场景,就是 List 或 Map 下的 Lambda 流操作,往往几行代码可以帮助我们实现多层 ...

  9. 自动驾驶场景解析:图像分割开发实战

    企业管理者说, 我想尝试在业务场景中应用AI,但没有资深算法工程师,怎么办? 业务场景复杂,数据积累不足.质量参差不齐,如何快速优化? 各大厂商的AI芯片和硬件层出不穷,性能.功耗.价格,我该如何选择 ...

最新文章

  1. 【GLib】GLib学习笔记(二):源码编译
  2. java float 加法_Java-杂项:Float 加减精度问题
  3. 我的总结SVN的使用
  4. Dockerfile创建自定义Docker镜像以及CMD与ENTRYPOINT指令的比较
  5. 【转】全排列算法非递归实现和递归实现
  6. python-base64编码与解码
  7. What's VPC (by quqi99)
  8. centos下mysql更改数据存放目录_CentOS下mysql更改数据存放目录 --转载
  9. Yii源码解读 - 事件
  10. java类和对象的生命周期
  11. 《XTWJ自强不息十月纯净版》ISO下载
  12. TFIDF之python实现
  13. 推荐一个视频网站-播布客
  14. 学习teardrop攻击并伪造一个ip包
  15. HTML表单标签,总结到位
  16. java导出excel问题记录
  17. :6W2H八何分析法
  18. ANASYS Fluent保存的文件打不开或打开出现错误,解决方法
  19. 【IT领导力】IT灾难的8个预警信号
  20. 爬虫之基本原理及简单使用、请求库之requests库及小案例

热门文章

  1. 华为畅享20se和oppok7x哪个好 oppok7x和华为畅享20se区别
  2. Redis6通信协议升级至RESP3,一口气看完13种新数据类型
  3. MySQL之索引失效情况
  4. python给变量赋值中文_Python变量与赋值的图文详解
  5. html自适应+手机宽度和高度,手机页面宽度自适应
  6. Python: PS 滤镜-- 极坐标变换到平面坐标
  7. c++实验三—百计百钱
  8. vue+mock+axios模拟post请求
  9. Transformer - 李宏毅笔记
  10. 软件架构最佳实践和案例分析——笔记摘要