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

【白话MQ】消息队列MQ的使用和选型

快速导航

  • 面试题:
  • 为什么使用消息队列?
    • 1. 解耦
    • 2. 异步
    • 3. 削峰
  • 消息队列的优缺点?
    • 1. 系统可用性可能会降低
    • 2. 系统复杂度提高
    • 3. 一致性的挑战
  • Kafka、ActiveMQ、RabbitMQ、RocketMQ 的区别和适合的场景?
    • 区别:
    • 使用建议:

面试题:

  • 为什么使用消息队列?
  • 消息队列的优缺点?
  • Kafka、ActiveMQ、RabbitMQ、RocketMQ 的区别和适合的场景?

为什么使用消息队列?

回答这个问题,为什么要使用消息队列?
答案肯定是因为使用它有好处,或是能解决业务痛点、或是能提升系统性能、或是能提升开发效率。

而使用消息队列能做到:解耦、异步、削峰

1. 解耦

作为一个开发人员,想必我们对设计原则多多少少也有一些了解,高内聚低耦合是软件工程中对设计好坏判断的一个标准。

这里说的解耦的意思,就是降低耦合度。

想象一下,系统A同时和系统B、C、D等多个系统存在业务联系,使用的最简单的方式,就是接口直接调用。

这个过程有两个特点:同步阻塞

系统A对数据的修改,实时同步更新到B、C、D系统中,且在同步过程中,系统A在当前线程中不能做任何其他的操作。

  1. 一旦同步过程出现一点点的问题,则整个系统的业务就无法继续进行下去。
  2. 新增或者删除同步的系统(系统D不需要更新系统A的状态了,新系统E需要根据系统A的状态同步更新),都需要修改系统A的接口调用代码,这违反了开闭原则

而使用MQ作为一个消息的缓冲区,系统A把所有对其他系统的同步通知消息都交给MQ,然后再由需要消息的其他B、C、E系统消费消息,可以有效的降低系统之间的耦合度。避免系统A调用其他系统时可能出现的全部系统奔溃。

2. 异步

在解耦的部分,已经对系统间的调用过程有了讲解,其中一个特点就是:同步

同步的一个好处是,简单

这个好处是站在开发人员的角度上来说的,一个请求调用链路的代码一气呵成。

但是在用户看来这样真的好吗?

回答这个问题之前,可以想想对用户来说最重要的是什么?

响应速度,一个页面刷新的时间是10ms,另一个页面刷新的时间是10s,用户更倾向于哪个想必显而易见了。

假设一个场景,系统A接口请求时间是5ms,调用系统B耗时500ms、调用系统C耗时350ms、调用系统D耗时200ms。(为什么耗时差距这么大?可能是代码质量问题、可能是网络问题,谁说的准呢?)

那么使用接口调用的总耗时是多少呢?

sum = 5ms + 500ms + 350ms + 200ms = 505ms(别问我是怎么算出来的这个数,问就是多线程调用,水桶理论)

而加入MQ的效果呢?

系统A将消息交给MQ后,就标志着这次请求成功了。

总耗时是:

sum = 5ms + MQ (我只管把消息给MQ,由MQ保证消息的可靠性和可用性) = 5ms

这就是异步调用的好处。

3. 削峰

削峰,削的是什么峰?
答:流量的峰,http请求的峰,数据的峰

两种众所周知的场景:

双十一抢购/春运抢票:同一时刻会有几百万上千万甚至上亿的下单请求

在用户看来顶多是没抢到,但是在系统运维人员的眼中,这不只是破天的富贵,而且是惊心动魄的生死时刻。

我们常用的MySQL也好,Oracle也好,都是处理能力的上限的。每秒几K,甚至几十K的数据处理能力,也就差不多了。

那么在上面的两种场景下,会发生什么现象呢?

数据库直接奔溃,世界一片黑暗。 为什么世界黑暗了?因为你的眼中冒着星星了。

那么怎么解决这个问题呢?好巧不巧的,MQ出场了。

淘宝/12306的订单请求来了,任你是每秒多大的请求,通通交给我MQ缓冲起来。你来多少请求,我不一定非要立即同时就给你处理。就像你去银行办业务,银行只有5个窗口,你带着100个人,那不可能同时给你这100个人办理呀。

怎么办?

就让你排队吧,按你们进门的时间先后,排个5队,业务员依次处理。

MQ的全称就是消息队列,是不是豁然开朗了?它就是一个队列么。

在系统中加入MQ之后,就不需要关注每秒来多少请求了。

消息队列的优缺点?

前面讲为什么使用MQ,已经讲了它的优点。

这里再说说它的缺点:

1. 系统可用性可能会降低

可用性降低这个情况,和业务有关。
若系统A同步的系统数量很多的时候,任何同步都可能出现问题,本身可用性就会降低。
使用MQ之后,无非是多了一个外部依赖,影响微乎其微,但是当MQ挂掉之后,整个系统都将奔溃,这是我们所不能承受的。
所以就需要考虑MQ的高可用

2. 系统复杂度提高

系统架构加进来了MQ,对其他的业务系统A、B、C等来说是减负了,但是责任总得有人承担呀。
在架构设计时,我们假定的情况就是MQ是可用的,交给MQ的消息都以符合我们心意的方式来为其他系统提供服务。
但是实际中,消息的重复消费、消息丢失处理、保证消息顺序传递 等都是需要考虑的问题

3. 一致性的挑战

使用系统间接口调用的方式,所有的系统调用都是同步的,状态始终是一致的。
而加入MQ以后,系统A将消息交给MQ之后,就宣告请求处理成功。但其他需要消费MQ中消息的系统,可能遇见MQ宕机、系统自身处理失败等问题,这就导致了数据的不一致。使用MQ时需要注意!

Kafka、ActiveMQ、RabbitMQ、RocketMQ 的区别和适合的场景?

区别:

在这里插入图片描述

使用建议:

  1. ActiveMQ:诞生的比较早,缺乏大规模吞吐量的验证,社区不活跃,不推荐使用
  2. RabbitMQ:使用erlang开发,开源,支持稳定,社区活跃,中小型公司推荐
  3. RocketMQ:阿里出品,现在捐给Apache了,社区和github活跃度差点意思,公司技术实力强推荐
  4. Kafka:大数据领域实时计算、日志采集等场景的业界标准,社区活跃,必用。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 油耳用什么掏耳朵比较好?质量最好的可视挖耳勺推荐
  • 智慧黑板:赋能多学科教学,引领教育新风尚
  • CentOS 系统设置与维护教程
  • Apple发布会都有哪些亮点?如何在苹果手机和电脑上录制屏幕?
  • JVM面试真题总结(六)
  • 深入理解Java虚拟机:Jvm总结-垃圾收集器与内存分配策略
  • 保姆级离线+windows环境+大模型前端UI安装(二)
  • ubuntu 和windows用samba服务器实现数据传输
  • 说说深拷贝和浅拷贝?
  • 共享旅游卡,客户旅游云南,真实反馈,全程无删减!
  • 油耳要怎么清洁耳朵才干净?比较推荐哪种可视耳勺
  • 开发适合el-dialog的拉伸拖拽自定义指令和适配自定义的图片查看组件
  • Java使用Apache POI向Word文档中填充数据
  • 深度学习基础--卷积网络
  • 智能语音交互:人工智能如何改变我们的沟通方式?
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • 230. Kth Smallest Element in a BST
  • CAP 一致性协议及应用解析
  • Docker 笔记(2):Dockerfile
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • If…else
  • spark本地环境的搭建到运行第一个spark程序
  • ucore操作系统实验笔记 - 重新理解中断
  • uva 10370 Above Average
  • vue-loader 源码解析系列之 selector
  • 回流、重绘及其优化
  • 理解在java “”i=i++;”所发生的事情
  • 聊聊sentinel的DegradeSlot
  • 如何利用MongoDB打造TOP榜小程序
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 自定义函数
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • (BAT向)Java岗常问高频面试汇总:MyBatis 微服务 Spring 分布式 MySQL等(1)
  • (Qt) 默认QtWidget应用包含什么?
  • (第30天)二叉树阶段总结
  • (二十三)Flask之高频面试点
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (接上一篇)前端弄一个变量实现点击次数在前端页面实时更新
  • (三)模仿学习-Action数据的模仿
  • (十七)Flink 容错机制
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • .bat批处理(六):替换字符串中匹配的子串
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .NET Project Open Day(2011.11.13)
  • .Net 代码性能 - (1)
  • .NET开源快速、强大、免费的电子表格组件
  • .net快速开发框架源码分享
  • .NET微信公众号开发-2.0创建自定义菜单
  • @四年级家长,这条香港优才计划+华侨生联考捷径,一定要看!
  • [ 数据结构 - C++]红黑树RBTree
  • [100天算法】-目标和(day 79)
  • [1127]图形打印 sdutOJ
  • [BZOJ5125]小Q的书架(决策单调性+分治DP+树状数组)