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

news2024/9/25 19:18:40

快速导航

  • 面试题:
  • 为什么使用消息队列?
    • 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:阿里出品,现在捐给Appache了,社区和github活跃度差点意思,公司技术实力强推荐
  4. Kafka:大数据领域实时计算、日志采集等场景的业界标准,社区活跃,必用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2121357.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Python机器学习系列】使用SMAC优化SVC分类模型的超参数(案例+源码)

这是我的第352篇原创文章。 一、引言 在机器学习和人工智能领域,优化超参数以提升模型性能是一项至关重要的任务。SMAC3,全称Sequential Model-based Algorithm Configuration,是一个强大且灵活的贝叶斯优化包,专注于高效地寻找算…

SpringBoot依赖之Spring Boot Admin(二)

本文核心:集成Prometheus 指标实现应用指标图表监控 作者语录: 我们一直在追逐需求和迭代的路上,却不曾回头看自己曾经的作品是否给自己留下经验和遗憾。技术永远没有边界,但个人必须对自己过往的行为买单,无论对与错…

TestNet 资产管理信息收集系统,附下载链接

我们团队在进行例行的安全活动时,信息管理和监控变得越来越重要了。尤其是在 hvv 和 zb 的任务中,我们需要对公司的资产有一个全貌的了解,以便及时识别和修复潜在的安全漏洞。这个过程通常涉及到大量的信息收集和数据分析,往往会消…

基于多技术融合下生态系统服务权衡与协同动态分析及论文写作方法

生态系统服务是指生态系统所形成的用于维持人类赖以生存和发展的自然环境条件与效用,是人类直接或间接从生态系统中得到的各种惠益。联合国千年生态系统评估(Millennium ecosystem assessment,MA)提出生态系统服务包括供给、调节、…

Vue——day13之脚手架

目录 概述 创建一个脚手架 首先下载脚手架 创建文件 脚手架中代码分析 main.js index.html render 为什么要用render 脚手架的默认配置 总结 概述 Vue的脚手架是一个快速构建Vue项目的工具,它集成了一系列的开发工具和配置,提供了一种标准化的…

MFC修改控件ID的详细说明

控件的ID可以在该对话框的.rc中修改 首先需要开启资源视图 然后在资源视图中打开该对话框 选中某个控件,就可以在属性面板中修改ID了 在此处修改ID后,对应Resource.h中也会发生变化 若在.rc中创建了一个控件时,Resource.h中会生成一个对应…

XML 保存 显示XML 方式 encoding=“UTF8“

XML 保存 encoding“UTF8” 将文件另存为 编码 UTF8 , 跟encoding“UTF8” 保持一致 。

NVDLA专题13:NVDLA软件部分设计和Compiler library

NVDLA拥有完整的软件生态,包括从编译神经网络到推理的支持。这个生态的一部分包括on-device软件栈(software stack),它是NVDLA开源版本的一部分。此外,英伟达将提供完整的training infrastructure,用来构建…

基于yolov8的肺炎检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv8的肺炎检测系统是一项前沿的深度学习应用,该系统利用YOLOv8这一先进的目标检测算法,能够高效地分析病人的X射线肺部图像,从而快速识别出肺炎的征状。YOLOv8作为Ultralytics公司开发的最新版本,引入了多项…

猎板通信PCB动态:苹果16系列多款设备上线,PCB供应商的机遇与挑战!

在最新的苹果供应链动态中,苹果公司对于PCB供应商的选择标准非常严格,主要考虑因素包括技术能力、生产规模、质量控制、成本效益、供应链稳定性以及环境和社会责任等。随着苹果产品技术的不断进步,PCB供应商也需要具备相应的技术升级能力&…

安泰功率放大器在微纳光固化3D打印中的具体应用

随着科技的进步,3D打印技术已经渗透到各个领域,尤其是微纳光固化3D打印技术。这种技术结合了光学、材料科学和微电子学的知识,能够制造出具有微米级精度的复杂物体。本文Aigtek安泰电子将带你探索功率放大器在微纳光固化3D打印中的应用&#…

太简单,用这个例子详解TCP协议你肯定不知道

号主:老杨丨11年资深网络工程师,更多网工提升干货,请关注公众号:网络工程师俱乐部 下午好,我的网工朋友 当你在微信上给你的朋友发送一条消息,或者在淘宝浏览商品时,这些信息是如何安全、准确地…

LLM - 理解 多模态大语言模型 (MLLM) 的架构与相关技术 (二)

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/142063880 免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。 多模态…

CDGA|推动数据治理与传统产业深度融合:策略与实践路径

在数字化浪潮席卷全球的今天,数据已成为推动经济社会发展的关键生产要素。传统产业,作为国民经济的基石,正面临着前所未有的转型挑战与机遇。如何让数据治理这一现代管理理念与实践方法深度融入传统产业,促进其转型升级与高质量发…

K均值聚类

根据到给点样本的距离,来聚类。 1.曼哈顿距离、 2.欧几里得距离 直线距离 3.切比雪夫距离 4.闵氏距离 5.余弦相似度 对数据大小/长度等不关注,只关注相似度。 6.汉明距离 二进制距离 二、密度聚类 DBSCAN 前提是样本是根据紧密程度分布的。 先用超参…

Go语言概述

1.Go语言的特点 1)从语言层面支持并发,实现简单 2)goroutine,轻量级线程,可实现大并发处理,高效利用多核 3)垃圾回收机制,内存自动回收,不需要开发人员管理 4&#xff0…

【网络】DNS协议、ICMP协议

DNS协议与ICMP协议 文章目录 1.DNS协议1.1DNS背景1.2域名简介1.3域名解析过程(了解)1.4使用dig工具分析DNS过程 2.ICMP协议2.1ICMP的功能2.2ping命令2.3traceroute命令 1.DNS协议 DNS(Domain Name System,域名系统)协…

idear获取git项目

最近想下载个ruoyi项目来包装简历,结果打开idear总是上一个项目,找不到get for vcs只好自己捣鼓了,顺便记录留着下次用。 步骤: 1. 2. 3.输入我们想访问的地址 eg: 点击克隆,我们就能获取项目到本地了。

C语言 | Leetcode C语言题解之第396题旋转函数

题目&#xff1a; 题解&#xff1a; #define MAX(a, b) ((a) > (b) ? (a) : (b))int maxRotateFunction(int* nums, int numsSize){int f 0, numSum 0;for (int i 0; i < numsSize; i) {f i * nums[i];numSum nums[i];}int res f;for (int i numsSize - 1; i &g…

教师节重磅福利!《动手学强化学习》作者亲自带你学强化学习

作为大模型的核心技术之一&#xff0c;强化学习越来越受到人们的重视。强化学习&#xff08;Reinforcement Learning, RL&#xff09;是机器学习的一个领域&#xff0c;主要研究智能主体&#xff08;agent&#xff09;在环境中应该怎样采取行动以最大化所获得的累积奖励。目前强…