《消息队列高手课》课程笔记(一)

news2024/11/19 3:29:36

消息生态系统全景图

在这里插入图片描述

为什么需要消息队列?

异步处理

  • 大多数程序员在面试中,应该都问过或被问过一个经典却没有标准答案的问题:如何设计一个秒杀系统?
    • 这个问题可以有一百个版本的合理答案,但大多数答案中都离不开消息队列。
    • 秒杀系统需要解决的核心问题是,如何利用有限的服务器资源,尽可能多地处理短时间内的海量请求。
  • 处理一个秒杀请求包含了很多步骤,例如:
    • 风险控制;
    • 库存锁定;
    • 生成订单;
    • 短信通知;
    • 更新统计数据。
  • 如果没有任何优化,正常的处理流程是:App 将请求发送给网关,依次调用上述 5 个流程,然后将结果返回给 APP。
  • 对于这 5 个步骤来说,能否决定秒杀成功,实际上只有风险控制和库存锁定这 2 个步骤。
    • 只要用户的秒杀请求通过风险控制,并在服务端完成库存锁定,就可以给用户返回秒杀结果了,对于后续的生成订单、短信通知和更新统计数据等步骤,并不一定要在秒杀请求中处理完成。
    • 所以当服务端完成前面 2 个步骤,确定本次请求的秒杀结果后,就可以马上给用户返回响应,然后把请求的数据放入消息队列中,由消息队列异步地进行后续的操作。
    • 处理⼀个秒杀请求,从 5 个步骤减少为 2 个步骤,这样不仅响应速度更快,并且在秒杀期间,我们可以把大量的服务器资源用来处理秒杀请求。
    • 秒杀结束后再把资源用于处理后面的步骤,充分利用有限的服务器资源处理更多的秒杀请求。
      在这里插入图片描述
  • 可以看到,在这个场景中,消息队列被用于实现服务的异步处理。

流量控制

  • 我们已经使用消息队列实现了部分秒杀系统工作的异步处理,但我们还面临一个问题:如何避免过多的请求压垮我们的秒杀系统?
    • 我们的设计思路是,使用消息队列隔离网关和后端服务,以达到流量控制和保护后端服务的目的。
    • 加入消息队列后,整个秒杀流程变为:
      • 网关在收到请求后,将请求放入请求消息队列;
      • 后端服务从请求消息队列中获取 APP 请求,完成后续秒杀处理过程,然后返回结果。
        在这里插入图片描述
    • 秒杀开始后,当短时间内大量的秒杀请求到达网关时,不会直接冲击到后端的秒杀服务,而是先堆积在消息队列中,后端服务按照自己的最大处理能力,从消息队列中消费请求进行处理。
      • 对于超时的请求可以直接丢弃,APP 将超时无响应的请求处理为秒杀失败即可。
      • 运维人员还可以随时增加秒杀服务的实例数量进行水平扩容,而不用对系统的其他部分做任何更改。
    • 这种设计的优点是:能根据下游的处理能力自动调节流量,达到“削峰填谷”的作用。
    • 但这样做同样是有代价的:
      • 增加了系统调用链环节,导致总体的响应时延变长。
      • 上下游系统都要将同步调用改为异步消息,增加了系统的复杂度。
  • 如果我们能预估出秒杀服务的处理能力,就可以用消息队列实现⼀个令牌桶,更简单地进行流量控制。
    • 网关在收到请求后,将请求放入请求消息队列;

    • 后端服务从请求消息队列中获取 APP 请求,完成后续秒杀处理过程,然后返回结果。
      在这里插入图片描述

    • 令牌桶控制流量的原理是:单位时间内只发放固定数量的令牌到令牌桶中,规定服务在处理请求之前必须先从令牌桶中拿出一个令牌,如果令牌桶中没有令牌,则拒绝请求。这样就保证单位时间内,能处理的请求不超过发放令牌的数量,起到了流量控制的作用。

服务解耦

  • 消息队列的另外⼀个作用,就是实现系统应用之间的解耦。
  • 所有的电商都选择用消息队列来解决系统耦合过于紧密的问题。
    • 引入消息队列后,订单服务在订单变化时发送一条消息到消息队列的一个主题 Order 中,所有下游系统都订阅主题 Order,这样每个下游系统都可以获得一份实时完整的订单数据。
    • 无论增加、减少下游系统或是下游系统需求如何变化,订单服务都无需做任何更改,实现了订单服务与下游服务的解耦。

该如何选择消息队列?

选择消息队列产品的基本标准

  • 首先,必须是开源的产品,这个非常重要。
    • 开源意味着,如果有⼀天你使用的消息队列遇到了一个影响你系统业务的 Bug,你至少还有机会通过修改源代码来迅速修复或规避这个 Bug,解决你的系统火烧眉毛的问题,而不是束手无策地等待开发者不一定什么时候发布的下一个版本来解决。
  • 其次,这个产品必须是近年来比较流行并且有一定社区活跃度的产品。
    • 流行的好处是,只要你的使用场景不太冷门,你遇到 Bug 的概率会非常低,因为大部分你可能遇到的 Bug,其他人早就遇到并且修复了。
    • 还有一个优势就是,流行的产品与周边生态系统会有一个比较好的集成和兼容。
  • 最后,作为一款及格的消息队列产品,必须具备的几个特性包括:
    • 消息的可靠传递:确保不丢消息;
    • Cluster:支持集群,确保不会因为某个节点宕机导致服务不可用,当然也不能丢消息;
    • 性能:具备足够好的性能,能满足绝大多数场景的性能要求。

可供选择的消息队列产品

  • RabbitMQ
    • RabbitMQ 是使用一种比较小众的编程语言:Erlang 语言编写的,它最早是为电信行业系统之间的可靠通信设计的,也是少数几个支持 AMQP 协议的消息队列之一。
    • RabbitMQ 是⼀个相当轻量级的消息队列,非常容易部署和使用
    • RabbitMQ 一个比较有特色的功能是支持非常灵活的路由配置,和其他消息队列不同的是,它在生产者(Producer)和队列(Queue)之间增加了一个 Exchange 模块,你可以理解为交换机。
    • RabbitMQ 的几个问题。
      • RabbitMQ 对消息堆积的支持并不好,当大量消息积压的时候,会导致 RabbitMQ 的性能急剧下降。
      • RabbitMQ 的性能比较差,它大概每秒钟可以处理几万到十几万条消息。
      • RabbitMQ 使用的编程语言 Erlang,这个编程语言不仅是非常小众的语言,更麻烦的是,这个语言的学习曲线非常陡峭。
  • RocketMQ
    • RocketMQ 有着不错的性能,稳定性和可靠性,具备⼀个现代的消息队列应该有的几乎全部功能和特性,并且它还在持续的成长中。
    • RocketMQ 有非常活跃的中文社区,大多数问题你都可以找到中文的答案,也许会成为你选择它的⼀个原因。
    • 另外,RocketMQ 使用 Java 语言开发,它的贡献者大多数都是中国人,源代码相对也比较容易读懂,你很容易对 RocketMQ 进行扩展或者二次开发。
    • RocketMQ 对在线业务的响应时延做了很多的优化,大多数情况下可以做到毫秒级的响应,如果你的应用场景很在意响应时延,那应该选择使用 RocketMQ。
    • RocketMQ 的性能比 RabbitMQ 要高⼀个数量级,每秒钟大概能处理几十万条消息。
    • RocketMQ 的一个劣势是,作为国产的消息队列,相比国外的比较流行的同类产品,在国际上还没有那么流行,与周边生态系统的集成和兼容程度要略逊⼀筹。
  • Kafka
    • Kafka 与周边生态系统的兼容性是最好的没有之⼀,尤其在大数据和流计算领域,几乎所有的相关开源软件系统都会优先支持 Kafka。
    • Kafka 使用 Scala 和 Java 语言开发,设计上大量使用了批量和异步的思想,这种设计使得 Kafka 能做到超高的性能。
    • Kafka 的性能,尤其是异步收发的性能,是三者中最好的,但与 RocketMQ 并没有量级上的差异,大约每秒钟可以处理几十万条消息。
    • Kafka 这种异步批量的设计带来的问题是,它的同步收发消息的响应时延比较高,因为当客户端发送一条消息的时候,Kafka 并不会立即发送出去,而是要等一会儿攒一批再发送,在它的 Broker 中,很多地方都会使用这种“先攒一波再一起处理”的设计。
    • 当你的业务场景中,每秒钟消息数量没有那么多的时候,Kafka 的时延反而会比较高。所以,Kafka 不太适合在线业务场景。

消息队列的选择

  • 如果说,消息队列并不是你将要构建系统的主角之一,你对消息队列功能和性能都没有很高的要求,只需要一个开箱即用易于维护的产品,我建议你使用 RabbitMQ。
  • 如果你的系统使用消息队列主要场景是处理在线业务,比如在交易系统中用消息队列传递订单,那 RocketMQ 的低延迟和金融级的稳定性是你需要的。
  • 如果你需要处理海量的消息,像收集日志、监控信息或是前端的埋点这类数据,或是你的应用场景大量使用了大数据、流计算相关的开源产品,那 Kafka 是最适合你的消息队列。

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

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

相关文章

马蹄集oj赛(第五次)

目录 围栏木桩 某农场有一个由按编号排列的根木桩构成的首尾不相连的围栏。现要在这个围栏中选取一些木桩,按照原有的编号次序排列之后,这些木桩高度成一个升序序列。 大厨小码哥 附庸的附庸 最长子段和 旅费 纸带 暧昧团 上楼梯 上楼梯2 采蜜 围栏…

Spring 学习总结(36)—— Spring 状态机优雅实践

1、什么是状态机 1.1 什么是状态 先来解释什么是“状态”( State )。现实事物是有不同状态的,例如一个自动门,就有 open 和 closed 两种状态。我们通常所说的状态机是有限状态机,也就是被描述的事物的状态的数量是有限个,例如自动门的状态就是两个 open 和 closed 。 状…

Mybatisplus真实高效批量插入附容错机制

文章目录 概要优化技术细节小结 概要 提示:mybatisplus自带真实批量插入 在mybatisplus已知常用批量插入为继承Iservice里的saveBatch方法和saveOrUpdateBatch方法, 进入源码可知,此两种方法的插入均为单条插入,如图: 其中可看出&#xff0…

果汁脱色树脂,制糖行业脱色,医药行业脱色

具有控制孔径的大孔强碱性Ⅰ型阴特种脱色用离子交换树脂 Tulsimer A-722是一款具有便于颜色和有机物去除的控制孔径的,专门开发的大孔强碱性Ⅰ型阴离子交换树脂。 Tulsimer A-722 (氯型)专门应用于糖浆脱色。 Tulsimer A-722由于其本身…

字节真的是宇宙尽头吗?

身边在字节的朋友很多人抱怨很卷,但卷到何种程度?很多人没有直观感受。某乎上一个问题(在字节跳动工作是怎样的?)点赞排名第一的回答生动的解释了字节的卷。 租房的舍友在字节工作。 舍友主卧,我次卧。 合租两个月了,我没见过舍友长什么样。…

Python实现ACO蚁群优化算法优化Catboost回归模型(CatBoostRegressor算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 蚁群优化算法(Ant Colony Optimization, ACO)是一种源于大自然生物世界的新的仿生进化算法&#xff0c…

Bark(Suno AI) 搭建及使用

前言 Bark 是由Suno AI创建的基于转换器的文本到音频模型。Bark 可以生成高度逼真的多语言语音以及其他音频 - 包括音乐、背景噪音和简单的音效。该模型还可以产生非语言交流,如大笑、叹息和哭泣。 1: 环境 win10 rtx 3060TI bark 下载地址 https://github.com/sun…

Jenkins配置Powershell脚本,通过脚本控制开发/测试服务器

📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!📢本文作者:由webmote 原创📢作者格言:无尽的折腾后,终于又回到了起点,工控,我来了 !序言 因为需要在Windows上编译和部署程序,因此需要借助PowerShell的脚本力量完成这些事情。 目标…

3年工作经验裸辞,有点后悔了

2019年毕业,现在有3年的软件测试工作经验,刚毕业前半年在一家知名上市公司,后面则进入一家传统行业公司待到现在2年半。 由于看不到技术成长以及其他原因,上上周辞职了,目前交接中,下个月中旬就得离开了&a…

Call for Papers丨第十七届全国知识图谱与语义计算大会,AI Open联合征稿

第十七届全国知识图谱与语义计算大会(CCKS 2023)征稿中,并与《AI Open》开展联合征稿,征稿截止日期为2023年6月2日。 全国知识图谱与语义计算大会(China Conference on Knowledge Graph and Semantic Computing&#x…

推荐一个AI导航网站 - 收录的都是热门AI工具

AI导航 | AI工具 | AI之旅导航是只收录最新最实用AI工具的人工智能导航网站 最近半年使用了大量的AI人工智能工具,收藏夹已经收藏不过来了。 所以搭建这个导航网站,管理所有收藏的热门AI网站,同时像大家分享, 网站没有任何广告…

esp32 下蓝牙播放音乐歌词的获得

以esp32 或者esp8266 作为蓝牙音乐接收端是可以获取到歌词的。 走了不少弯路,这方面还是资料有缺失,其实这是很简单的事情。 使用了A2DP这个库,GitHub - pschatzmann/ESP32-A2DP: A Simple ESP32 Bluetooth A2DP Library (to implement a M…

微信外h5跳转小程序3中方式

1.转短链接跳转小程序(支持微信内外) 目前限制50wc次 先转短链接 文档:获取scheme码 | 微信开放文档 2.微信公众号h5内跳转小程序(支持微信内) 微信公众号h5页面跳转微信小程序_程序007的博客-CSDN博客 3.使用云函…

对Android 说Hello ——Qt For Android

1. Qt 安卓环境搭建 平台:Qt5.15.2 官网教程: Getting Started with Qt for Android | Qt 5.15 网上的教程: qt5.15.2配置android_加油吧,小杜的博客-CSDN博客 注意 :注意ndk的路径中不能有空格,我之前…

【AIGC】AI欺诈,做好以下几点,无需忧虑

文章目录 前言列举几种AI欺诈的形式以及其识别方法1.AI深度学习生成的假视频、假图片2.AI自动生成的德文或语音3.AI自动注册账号和刷数据4.AI智能防御机制 如何预防?1.提高公众警惕性2.发展AI监测技术3.加强关键领域的人工审核4.完善法律法规5.国际合作与交流6.开源…

图表控件LightningChart .NET v.10.4.1已经发布!新增DataCursor功能、ZoomBar自定义控件

LightningChart.NET原名LightningChart Ultimate SDK,是一款高性能WPF和Winforms图表,可以实时可视化多达1万亿个数据点。LightningChart完全由GPU加速,并且性能经过优化,可用于实时显示海量数据-超过10亿个数据点。 LightningChart包括广泛的…

bmp转jpg怎么转?bmp转换jpg的几个方法

bmp转换jpg的几个方法~什么是BMP呢?BMP是位图文件格式的一种,全称为Bitmap(位图),是一种基于像素的图像文件格式。BMP是Windows操作系统中最常用的图像格式之一,通常以.bmp或.dib作为文件扩展名。BMP文件格…

LabVIEWCompactRIO 开发指南32 确保无损数据传输

LabVIEWCompactRIO 开发指南32 确保无损数据传输 如果无损数据传输很重要,或者如果要将数据从多个I/O通道传输到同一DMA FIFO,则必须能够监控DMA机制的状态并对发生的任何故障做出反应。在FPGADMA写入节点上,超时通常表示DMA缓冲器已满。当…

华为OD机试之处理器问题(Java源码)

处理器问题 题目描述 某公司研发了一款高性能AI处理器。每台物理设备具备8颗AI处理器,编号分别为0、1、2、3、4、5、6、7。 编号0-3的处理器处于同一个链路中,编号4-7的处理器处于另外一个链路中,不通链路中的处理器不能通信。 如下图所示。…

IEEE独立出版 | 第七届计算机科学与智能控制国际会议(ISCSIC 2023)

会议简介 Brief Introduction 第七届计算机科学与智能控制国际会议(ISCSIC 2023) 会议时间:2023年10月27日-29日 召开地点:中国南京 大会官网: ISCSIC 2023-2023 7th International Symposium on Computer Science and Intelligent Control(I…