您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

为什么我们需要消息队列?

时间:2023-09-05 12:25:25  来源:微信公众号  作者:小技术君

消息队列有着悠久的历史,它们经常用于不同系统之间的通信。图1通过将其与星巴克的工作方式进行比较,阐述了消息队列的概念。

在星巴克,收银员接受订单并收取款项,然后在咖啡杯上写下顾客的名字,交给下一个步骤。制作咖啡的人拿起订单和杯子,然后制作咖啡。然后顾客在柜台上取走咖啡。这三个步骤是异步进行的。收银员只是将订单以咖啡杯的形式放下,并不等待完成。制作咖啡的人只是将完成的咖啡放在柜台上,并不等待顾客来取。

当您在星巴克下订单时,收银员接受订单并在杯子上写下您的名字,然后转向下一个顾客。然后咖啡师拿起杯子,准备您的饮品,然后留下供您取走。这个过程之所以美妙,是因为每个步骤都是独立运作的。这很像一个异步系统。

 图1 星巴克作为消息队列的类比

这种异步处理,每个步骤都不必等待前一个步骤完成,显著增加了系统的吞吐量。例如,收银员不必等待您的饮品制作完成后才接受另一个订单。

消息队列的一个示例

现在,让我们将焦点转向一个真实世界的例子:电子商务中的限时抢购。由于用户活动激增,限时抢购可能会给系统带来压力。为了应对这种需求,采用了许多策略,而消息队列通常在后端优化中发挥关键作用。

一个简化的电子商务限时抢购架构如图2所示。

  • 步骤1和2:顾客向订单服务下订单。
  • 步骤3:在处理付款之前,订单服务保留所选的库存。
  • 步骤4:然后订单服务将支付指令发送到支付服务。支付服务会扇出到3个服务:支付渠道、通知和分析。
  • 步骤5.1和6.1:支付服务将支付指令发送到支付渠道服务。支付渠道服务与外部PSP(支付服务提供商)进行通信,以完成交易。
  • 步骤5.2和6.2:支付服务向通知服务发送通知,通知服务然后通过电子邮件或短信向顾客发送通知。
  • 步骤5.3:支付服务向分析服务发送交易详细信息。

图2 一个简化的电子商务限时抢购架构

这里的一个关键点是,在限时抢购活动中,无缝的用户体验至关重要。为了在高流量情况下保持服务的响应能力,可以在多个阶段集成消息队列,以确保性能最佳。

消息队列的优势扇出

支付服务将数据发送到三个下游服务,用于不同的目的:支付渠道、通知和分析。这种扇出方法就像有人在房间里大声喊话;谁需要听到,就听到了。生产者只需将消息放在队列中,而消费者可以按照自己的节奏处理消息。

(1) 异步处理

借用星巴克的类比,就像收银员不必等待咖啡制作完成一样,订单服务也不必等待支付完成。支付指令被放置在队列中,一旦完成,顾客就会收到通知。

(2) 速率限制

在限时抢购活动中,可能会有数以万计的并发用户同时下订单。在满足渴望购买的顾客和保持系统稳定之间取得平衡非常重要。一种常见的方法是在特定的时间范围内限制进入的请求数量,以匹配系统的容量。多余的请求可能会被拒绝或要求在短时间延迟后重试。这种方法确保系统保持稳定,不会被压垮。对于成功通过的请求,消息队列确保它们被高效有序地处理。如果系统的某个部分暂时滞后,订单不会丢失。它会在队列中保持,直到可以处理为止。这确保了即使在压力下也能保持流畅的流程。

(3) 解耦

我们的设计在多个地方使用了消息队列。总体架构与图2中呈现的简化版本不同。服务之间通过定义良好的消息接口进行交互,而不是紧密依赖彼此。每个服务都可以独立进行修改和部署。每个组件可以使用不同的编程语言进行开发。这为架构设计带来了灵活性。

(4) 横向扩展

由于服务被解耦,我们可以根据需求独立地进行扩展。每个服务可以在不同的能力范围内提供服务,因此我们可以根据其计划的每秒查询数(QPS)或每秒事务数(TPS)进行扩展。

(5) 消息持久性

消息队列还可以用作存储消息的中间件。如果上游服务崩溃,下游服务始终可以从消息队列中获取消息进行处理。通过这种方式,恢复功能从每个服务中移出,并成为消息队列的责任。

(6) 批处理

在处理流程中,有时我们需要对数据进行批处理以获得摘要。例如,当支付服务向分析服务发送更新时,分析服务不需要执行实时更新,而是设置一个滚动窗口以批处理处理。批处理是下游服务的要求,因此支付服务不需要知道它,只需将消息放入队列中。

(7) 消息排序

在限时抢购中,库存数量有限。例如,限时抢购只提供10部iphone,但有超过10,000名下订单的用户。我们如何决定订单的顺序呢?通过使用消息队列来保留所有订单,将会自然形成一个顺序:队列中的前10个订单将获得iPhone。

在图3中,我们将所有内容整合在一起,服务通过消息队列连接并解耦。这样,架构可以实现更高的吞吐量。

 图3 在限时抢购架构中使用消息队列



Tags:消息队列   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
如何使用 Redis 实现消息队列
Redis不仅是一个强大的内存数据存储系统,它还可以用作一个高效的消息队列。消息队列是应用程序间或应用程序内部进行异步通信的一种方式,它允许数据生产者将消息放入队列中,然...【详细内容】
2024-03-22  Search: 消息队列  点击:(17)  评论:(0)  加入收藏
消息队列备选架构选择,你选择哪个?
中间件团队的研发人员认为这个方案比较简单,实现成本低,但测试代表认为这个方案测试人力投入较大。运维团队认为这个方案的硬件成本比较高,一个数据分组就需要4台机器(2台服务器...【详细内容】
2023-11-30  Search: 消息队列  点击:(180)  评论:(0)  加入收藏
四种消息队列,如何选型?
最近发现很多号主发消息队列的文章,质量参差不齐,相关文章我之前也写过,建议直接看这篇。这篇文章,主要讲述 Kafka、RabbitMQ、RocketMQ 和 ActiveMQ 这 4 种消息队列的异同,无论...【详细内容】
2023-11-27  Search: 消息队列  点击:(193)  评论:(0)  加入收藏
几款主流消息队列之间的差异,我们应该如何选择
为什么需要消息队列消息队列是历史最悠久的中间件之一,它可以和不同的进程进行通信,从而实现上下游之间的消息传递。基于此特性,我们可以在以下三个场景中使用消息队列。 解耦; ...【详细内容】
2023-11-17  Search: 消息队列  点击:(124)  评论:(0)  加入收藏
常用消息队列框架与技术选型
又是一年双11季,土豪们买买买,程序员看看热闹,聊聊技术。海量的订单、支付请求以及库存更新等任务,离不开分布式架构(SOFAStack)、分布式数据库(OceanBase)、分布式缓存(Tair)、数据处...【详细内容】
2023-11-13  Search: 消息队列  点击:(204)  评论:(0)  加入收藏
Java中的消息队列实战,构建高效异步系统
随着互联网应用的发展,高效的异步系统变得越来越重要。在这样的系统中,消息队列起到了关键的作用。通过消息队列,可以将不同组件之间的耦合度降低,实现解耦和异步处理,提高系统的...【详细内容】
2023-11-07  Search: 消息队列  点击:(324)  评论:(0)  加入收藏
热门的消息队列框架比较、使用方法、优缺点,提供示例代码
消息队列(Message Queue)是一种在分布式系统中用于消息传递的通信模式。它可以将消息发送者和接收者解耦,提高系统的可靠性、可扩展性和可维护性。下面将详细介绍3-5个常用的...【详细内容】
2023-10-11  Search: 消息队列  点击:(151)  评论:(0)  加入收藏
为什么我们需要消息队列?
消息队列有着悠久的历史,它们经常用于不同系统之间的通信。图1通过将其与星巴克的工作方式进行比较,阐述了消息队列的概念。在星巴克,收银员接受订单并收取款项,然后在咖啡杯上...【详细内容】
2023-09-05  Search: 消息队列  点击:(353)  评论:(0)  加入收藏
使用 SQL 的方式查询消息队列数据以及踩坑指南
Pulsar-SQL 是一个非常有用的功能,只是我们使用过程中确实发现了一些问题,大部分都已经修复了;希望对后续使用该功能的朋友有所帮助。背景为了让业务团队可以更好的跟踪自己消...【详细内容】
2023-08-31  Search: 消息队列  点击:(275)  评论:(0)  加入收藏
Java消息队列开发实战,打造高效异步处理
随着互联网应用的发展,高效的异步系统变得越来越重要。在这样的系统中,消息队列起到了关键的作用。通过消息队列,可以将不同组件之间的耦合度降低,实现解耦和异步处理,提高系统的...【详细内容】
2023-08-30  Search: 消息队列  点击:(357)  评论:(0)  加入收藏
▌简易百科推荐
即将过时的 5 种软件开发技能!
作者 | Eran Yahav编译 | 言征出品 | 51CTO技术栈(微信号:blog51cto) 时至今日,AI编码工具已经进化到足够强大了吗?这未必好回答,但从2023 年 Stack Overflow 上的调查数据来看,44%...【详细内容】
2024-04-03    51CTO  Tags:软件开发   点击:(5)  评论:(0)  加入收藏
跳转链接代码怎么写?
在网页开发中,跳转链接是一项常见的功能。然而,对于非技术人员来说,编写跳转链接代码可能会显得有些困难。不用担心!我们可以借助外链平台来简化操作,即使没有编程经验,也能轻松实...【详细内容】
2024-03-27  蓝色天纪    Tags:跳转链接   点击:(12)  评论:(0)  加入收藏
中台亡了,问题到底出在哪里?
曾几何时,中台一度被当做“变革灵药”,嫁接在“前台作战单元”和“后台资源部门”之间,实现企业各业务线的“打通”和全域业务能力集成,提高开发和服务效率。但在中台如火如荼之...【详细内容】
2024-03-27  dbaplus社群    Tags:中台   点击:(8)  评论:(0)  加入收藏
员工写了个比删库更可怕的Bug!
想必大家都听说过删库跑路吧,我之前一直把它当一个段子来看。可万万没想到,就在昨天,我们公司的某位员工,竟然写了一个比删库更可怕的 Bug!给大家分享一下(不是公开处刑),希望朋友们...【详细内容】
2024-03-26  dbaplus社群    Tags:Bug   点击:(5)  评论:(0)  加入收藏
我们一起聊聊什么是正向代理和反向代理
从字面意思上看,代理就是代替处理的意思,一个对象有能力代替另一个对象处理某一件事。代理,这个词在我们的日常生活中也不陌生,比如在购物、旅游等场景中,我们经常会委托别人代替...【详细内容】
2024-03-26  萤火架构  微信公众号  Tags:正向代理   点击:(10)  评论:(0)  加入收藏
看一遍就理解:IO模型详解
前言大家好,我是程序员田螺。今天我们一起来学习IO模型。在本文开始前呢,先问问大家几个问题哈~什么是IO呢?什么是阻塞非阻塞IO?什么是同步异步IO?什么是IO多路复用?select/epoll...【详细内容】
2024-03-26  捡田螺的小男孩  微信公众号  Tags:IO模型   点击:(8)  评论:(0)  加入收藏
为什么都说 HashMap 是线程不安全的?
做Java开发的人,应该都用过 HashMap 这种集合。今天就和大家来聊聊,为什么 HashMap 是线程不安全的。1.HashMap 数据结构简单来说,HashMap 基于哈希表实现。它使用键的哈希码来...【详细内容】
2024-03-22  Java技术指北  微信公众号  Tags:HashMap   点击:(11)  评论:(0)  加入收藏
如何从头开始编写LoRA代码,这有一份教程
选自 lightning.ai作者:Sebastian Raschka机器之心编译编辑:陈萍作者表示:在各种有效的 LLM 微调方法中,LoRA 仍然是他的首选。LoRA(Low-Rank Adaptation)作为一种用于微调 LLM(大...【详细内容】
2024-03-21  机器之心Pro    Tags:LoRA   点击:(12)  评论:(0)  加入收藏
这样搭建日志中心,传统的ELK就扔了吧!
最近客户有个新需求,就是想查看网站的访问情况。由于网站没有做google的统计和百度的统计,所以访问情况,只能通过日志查看,通过脚本的形式给客户导出也不太实际,给客户写个简单的...【详细内容】
2024-03-20  dbaplus社群    Tags:日志   点击:(4)  评论:(0)  加入收藏
Kubernetes 究竟有没有 LTS?
从一个有趣的问题引出很多人都在关注的 Kubernetes LTS 的问题。有趣的问题2019 年,一个名为 apiserver LoopbackClient Server cert expired after 1 year[1] 的 issue 中提...【详细内容】
2024-03-15  云原生散修  微信公众号  Tags:Kubernetes   点击:(6)  评论:(0)  加入收藏
站内最新
站内热门
站内头条