首页 > 其他分享 >一个故事理解消息队列-上

一个故事理解消息队列-上

时间:2024-07-18 13:07:08浏览次数:14  
标签:异步 请求 故事 队列 订单 理解 MQ 消息

前段时间,知识星球里一位同学给我分享了他对消息队列的理解,并且用一个故事形象的表述了消息队列的作用。

看完他的表述,我觉得用故事来描述技术组件作用的方式很有意思,也更容易让人理解。

这篇文章,借用他的故事,为大家简单介绍一下消息队列。

 

消息队列的故事

假设现在有一本技术百科全书,我们将其称之为一个集群。如果你想看互联网IT技术方面的内容,首先你需要去翻看目录寻找它,这里的目录就是消息队列里的Topic(主题)。

找到对应目录后,你想了解IT技术里面关于系统架构的内容,那只需要按照目录索引翻到对应的页码即可,这个页码就可以理解为Partition(分区)。

这本百科全书的内容来自于作者,作者会不定时更新内容,这里可以将作者视为Producer(生产者)。而翻看阅读这些内容的你,就是Consumer(消费者)。和你类似的都喜欢看这方面内容的人群,就可以称之为Consumer Group(消费组)。

如果书本太厚或者一时没有看完,我们的习惯是折一个页码作为标记,方便我们下次继续从这里开始阅读,这里的标记就是所谓的offset(偏移量),你可以将其视为对消息进行标记。

不论是各种MQ还是Kafka,都是消息缓存的中间件,统称为消息队列,他们都有发布、存储和订阅消费消息的能力。

好了,故事讲完了,这就是关于消息队列的借物理解方式,是不是很形象。

下面的内容是关于消息队列这一中间件的详细介绍。

 

消息队列功能概述

消息队列(Message Queue,简称MQ)是指保存消息的一个容器,其本质是一个保存数据的队列。

消息队列时分布式系统中重要的技术组件,主要解决应用解耦、异步消息、流量削峰等问题,实现高性能、高可用、可伸缩和最终一致性的系统架构。

目前使用较多的消息队列有ActiveMQ、RabbitMQ、RocketMQ、Kafka等。

 

消息队列的应用场景

消息队列的特点就是利用高效可靠的消息传递机制,对软件系统中上下游应用服务间的数据交互进行解耦。

它的主要应用场景有四种,分别是:应用解耦、异步处理、消息通讯和流量削峰填谷。

应用解耦

如下图所示,是一个典型的电商订单业务链路图:

正常来说,用户想要购买一件商品,点击下单后,需要经过如上多个环节。且每个环节都要进行校验,比如库存是否足够,商品是否参与会员折扣,是否有优惠券等。只要其中一个强依赖的下游应用调用超时或者失败,那这笔订单就无法创建成功。

采用消息队列之后,订单服务只需要将下单的消息发送到MQ中,然后下游各个服务从MQ中获取消息并执行对应的业务逻辑即可。这种异步方式降低了各应用服务之间的耦合程度,订单服务的开发同学只需要搞定自己负责部分的逻辑即可。

且MQ本身就具备的高可用性可以保证数据不丢失,而且它还具备重试机制,即使请求超时依然可以尝试再次调用,以确保业务逻辑闭环。

异步处理

异步处理和同步是相对的。所谓同步,就是发送方发起请求调用,接收方接收并进行处理然后返回数据给发送方,在没有得到结果之前,该请求调用不会返回。

我们常见的方法调用大部分都是同步处理,比如SendMessage。但同步处理的方式相对来说效率太低,特别是对一个复杂且高并发的系统中,这种低下的效率是难以接受的。

消息队列具有异步通信机制,可以使发送消息的应用组件不需要等待接收消息的组件处理完毕并返回数据,从而提高系统的响应速度和处理效率。

比如最近天气很热,你朋友请你去享受足道服务,店里会提供泡脚、按摩,同时还有免费的水果零食和空调。如果是在自己家里,你需要打水,清洗水果,打开空调,购买零食,这样无疑效率很低。

但去了足道店,你只需要刷卡付钱就可以直接享受这些服务,效率高的同时,用户体验也能提升很多。

流量削峰填谷

还是以电商业务为例,每次双11大促,对系统的性能和稳定性都是一大考验,很多公司的系统在面临这种高并发场景时都跪了。

而消息队列的特性可以让它在面临高并发和大流量场景时,充当系统应用和数据库之间缓冲层,让瞬时的峰值流量较为平滑的传递到下游,避免系统被瞬时高并发请求打挂。

如上图所示,假设每秒有1W的下单请求,即10000并发,而订单服务当前的性能每秒最多处理4000个请求,即订单服务的TPS为4000。如果不对请求加以缓冲处理,那如此高的并发会很快把订单服务和下游的数据库搞崩。

消息队列这个时候就可以派上用场:将用户下单请求都统一放进队列里,订单应用按照自己的性能慢慢处理这些请求,也给数据库喘口气的时间。这也是性能优化中很有意思的一个概念:用空间换时间。

 

如上就是关于消息队列最基本的介绍和应用场景。下一篇文章,我会以Kafka为例,详细介绍消息队列的功能特性,大家敬请期待。

标签:异步,请求,故事,队列,订单,理解,MQ,消息
From: https://www.cnblogs.com/imyalost/p/18309313

相关文章

  • SSR理解(vite与nuxt比较)
    一、SSR的概念与理解(什么是SSR?)定义:SSR是指在服务器端完成页面的渲染工作,将最终生成的HTML内容发送给浏览器。简单来说,就是在服务器端将网页内容渲染成HTML,然后将这个渲染好的HTML发送到客户端,也就是我们的浏览器。原理:(渲染过程)传统的Web应用是在客户端(浏览器)通过Jav......
  • 【final 关键字的理解】
    final关键字final关键字主要作用为防止数据被修改,保证代码安全。可以用于修饰:类、类中方法、变量、参数;修饰类相关代码代码解读finalclassPerson{}//错误,不可以继承被final修饰的类classStudentextendsPerson{}概念当使用final关键字修饰类的时候,表......
  • 【CAN通讯系列2】与CAN通讯的故事
    3年前在知乎撰写很多CAN通讯相关的文章,那时主要偏于软件视角,反馈还不错。3年过去了,随着系统与软件的增加,对CAN通讯的认识有所加深,那就在此基础上,重新更新一个CAN通讯系列文章。先从我与CAN通讯的故事说起:1初始CAN通讯最初接触CAN通讯,那时刚工作,在主机厂的研发部门,经常需要......
  • 用数组模拟环形队列——2
    在上一篇的文章中我们介绍了队列的使用,但是普通的队列存在资源浪费的问题,为了解决这个问题,又提出了环形队列,今天,我们就详细介绍一下环形队列的使用方法。环形队列的特点:1.队列的存储结构是一个环形结构,即队列的头尾相连,形成一个环形。2.队列有固定的大小,通常用数组来实现。......
  • 解锁AI潜能:fabric,你的智能助手,让AI理解你的需求
    探索AI新境界:fabric——你的智能助手在这个人工智能飞速发展的时代,我们每天都在见证着技术的革新。但你是否曾感到困惑,如何让这些看似冷冰冰的AI真正理解我们的需求,为我们提供帮助?今天,我要向大家介绍一款名为fabric的神器,它将彻底改变你与AI的互动方式!1.什么是fabric?fabric......
  • linux进程——父子进程层面的PID,fork的原理与理解
        前言:本篇内容主要讲解进程中系统调用fork和父子进程的概念与原理,想要系统学习linux进程的友友们只管看本篇文章是不行的。还要学习一些linux进程的周边知识以及linux进程其他方面的知识,博主的linux专栏中已经加入了这些文章方便友友们进行学习。感兴趣或者想要......
  • 【AI原理解析】—生成对抗网络(GAN)原理
    目录一、基本原理二、核心算法原理和数学模型三、训练过程四、GAN的优缺点生成对抗网络(GenerativeAdversarialNetwork,简称GAN)是一种深度学习模型,自2014年由IanGoodfellow等人提出以来,在人工智能领域得到了广泛应用。GAN的基本原理是通过两个神经网络——生成器(Genera......
  • redis学习-12(实现分布式锁、消息队列、缓存一致性问题、单线程快的原因、跳跃表)
    引用以下内容:redis实现分布式锁:Redis分布式锁-这一篇全了解(Redission实现分布式锁完美方案)Redis实现分布式锁的7种方案,及正确使用姿势!redis实现消息队列Redis的学习教程(十)之使用Redis实现消息队列缓存一致性问题想要保证数据库和Redis缓存一致性,推荐采用先更新数......
  • 知识图谱与LLMs:实时图分析(通过其关系的上下文理解数据点)
    大型语言模型(LLM)极大地改变了普通人获取数据的方式。不到一年前,访问公司数据需要具备技术技能,包括熟练掌握各种仪表板工具,甚至深入研究数据库查询语言的复杂性。然而,随着ChatGPT等LLM的兴起,随着所谓的检索增强型LLM应用程序的兴起,隐藏在私人数据库中或可通过各种AP......
  • 如何从浅入深理解 Transformer
    如何从浅入深理解 Transformer附赠自动驾驶最全的学习资料和量产经验:链接本回答分为三个部分:Transformer,Attention,论文学习顺序按照排列顺序,不过还是看个人自由。如果对attention了解,就可以跳过。AttentionAttention based model 是什么,它解决了什么问题?深度学......