消息驱动响应式系统案例(洗碗的七种方式)

Chen系统的有限时间驱动-响应同步 混沌理论的基本思想起源于20世纪初, 形成于20世纪60年代, 20世纪60-70年代是混沌研究发展突飞猛进的时代, 发展壮大于20世纪80年代。 阅读详情

原文地址:https://www.lightbend.com/blog/the-case-for-message-driven
本文转载采用谷歌翻译,存在不准确情况

了解异步,非阻塞,并发,并行等等

我一直在努力寻找一种有意义的方式来描述构建高效的响应式(Reactive)应用程序的核心概念 - 异步和非阻塞,同时通过增强并行性来最小化并发性并支持线性可伸缩性。即使是最有经验的开发人员也难以理解这是真正深奥的术语。但理解它们对于构建真正的反应式应用程序至关重要。

在过去的几个月里,我想我可能已经找到了更清楚地表达这些概念的方法。它还突出了一些其他有趣的概念,比如通过日常生活来隐喻流水线(pipelining),批处理(batching),fork/join和Amdahl定律【1】。这种现实世界的比喻总是能帮助我理解概念。当我与客户一起完成这一过程时,他们发现对其也有帮助。

说真的我喜欢洗碗。我知道虽然你可能会想“这很奇怪”。任何见过我的人都会告诉你,干的不错。不仅如此,我还是那些特别怪异的人之一,不仅手洗碗碟,而且会在我完成时将它们放入洗碗机进一步清洁。我有一个大学室友吃了芝士意面,碗碟能放在水槽里好几天。在使用这个比喻时,我发现了更多的人有类似的洁癖,我对于自己强迫性的洗碗行为一直很满意。但这个故事并不是关于我是否需要专业的治疗帮助。

每次晚餐后,都有一堆盘子躺着水槽里等待清洁。这个过程很像您在处理流数据时看到的内容。我使用了一个流水线的转换过程:冲洗掉每道菜的碎屑,用肥皂水擦洗它,再次冲洗除去肥皂泡并将碟放入洗碗机。这个过程纯粹是同步的(全部由一个处理器/人员处理)和顺序的(不能重排序),因为我一次只能完成一项任务。我可以单独将盘子送入工作管道,或者我可以无需保证顺序,并尝试通过管道中的每次转换来分批清洗盘子,方法是先清洗所有盘子,然后再擦洗所有盘子,再次冲洗所有盘子然后将它们全部放入洗碗机中作为一个组。在这样做的过程中,我可能会通过增加数据到执行地点(水龙头,擦洗海绵,洗碗机等)的位置来提高我的表现,但是我的表现受到以下事实的约束:我仍然只是一个处理所有工作的处理器。
这里写图片描述
这里写图片描述
想象一下,我有一个很喜欢洗碗的好朋友。知道他或她也喜欢洗碗,我邀请那个人到我家去帮助一个晚上。我现在创建了一个线程池 - 多个执行线程,这可能会或可能不会对我想要完成的工作有所贡献。当那个人到达时,我向他们展示了一堆盘子,并询问他们是否会开始清洗它们。我的这位朋友前往水槽,并开始通过流水线工艺工作。现在我产生了异步工作,就好像我在线程池上使用了Java Callable或Runnable一样。如果我站在他们后面等待他们完成并且别做任何事情,我就是一个封锁线程。我已经产生了要完成的工作,并将它委派给某个执行线程,他们将在任意时间执行工作,但在完成其他任务之前我没有做任何事情,就像Java Future实例一样。不用站在旁边,我可以去喝一杯柠檬水,现在我是非阻塞的(比如Scala Future或者Java 8 CompletableFuture),但对于手头的任务来说也没有什么效率。而我的朋友可能对我变得非常恼火。此外,除非他们比我更有效率地清洗碟子(例如更快的处理器),否则工作速度不会更快。
这里写图片描述这里写图片描述
我真正想要的是让我们两个人都做出贡献,让这项工作更有效,更快地完成。在这一点上,我和我的朋友一起完成这项工作。我的朋友负责从一堆盘子中抓取一个盘子,冲洗并擦洗它。我从那里拿起碟子,再冲洗一遍,放入洗碗机。我现在对这项任务不具有阻塞性和生产力,但通过这种方式进行工作,我们共享了影响我们以最佳方式完成工作的能力的资源。作为负责处理我的朋友委派的工作的执行线程,我必须等待每个盘子的前继,这可能需要花费无限的时间来清理,这取决于它的肮脏程度(CPU密集型工作的本质)。更糟糕的是,我们都必须使用龙头来冲洗碗碟,所以我们对通过通信进行仲裁的状态(水龙头)有一个互斥的操作,就像内核对争用的互斥(互斥)锁的仲裁一样。一台电脑。这是并发性的本质,通常是通过共享可变状态。如果状态(水龙头)是无人参与的(在需要的时候没有被我们两个人使用),我们可以快速完成我们的任务。但如果存在争议(当其他人需要时,我们中的一个人正在使用水龙头),我们一直在等待,直到其他人完成进度。
这里写图片描述
改善并发性和争用的方法是增加占用空间。 如果我的房子足够大以至于有另一个水槽,我可以拿一堆盘子,独立于我的朋友去做我的工作,那样会更有效率。 可以认为这与使用ForkJoinPool的Java 8或Scala中的并行集合类似。 我通过抓取一堆盘子来分担工作,我和我的朋友正在执行这项工作作为可用的执行核心,当我们需要将碟子重新组装到洗碗机中时,我们将加入。 然而,就像平行收集一样,分叉和连接阶段仍然是并发的 - 我们必须将数据和盘子分开处理,然后我们必须将转换后的数据(洗碗机)中的数据(盘子)。
这里写图片描述
1390/5000
这种fork操作可以便宜或昂贵,这取决于工作如何分配。如果我只是简单地抓住板的上半部分,这是一个简单的操作。但是,如果我想以某种有序的方式将它们分发给我的朋友和我之间呢?这将会更加昂贵。根据订单,连接点也可能具有类似的成本。这带来了Amdahl法则的成本 - 即使我们对工作进行了并行处理,但如果分叉和加入工作的时间过高,它仍然可能需要比顺序执行时间更长的时间。

我们需要工作尽可能平行以最大化我们的处理效率。为此,我们需要更多地增加我们的足迹。如果我们不知道谁在做什么,或者我们是从一个共同的队列中偷走工作,那么我们就可以把这些盘子交给我的朋友和我来做。如果我有两台洗碗机,我不会在单个连接点上争用。这种占地面积的增加确实意味着额外的成本,但并发性的降低和并行性的增加意味着我的可扩展性已经成为线性的 - 当我添加更多的处理器/接收器/洗碗机时,我增加了可以处理的菜肴数量(以及我可以转换)相同的因素。这种增加可扩展性和效率的价值可能很好地证明商业硬件对我业务的成本增加。
这里写图片描述
最后,我的最终目标是创建异步,非阻塞和并行执行的应用并同时具有最少并发点。 通过代理这项工作,我将每个盘子(或一批盘子)视为一条消息,我不关心哪条管道进行转换(洗碗)。 这是位置透明性的本质,它允许您启动额外的节点来处理日益增加的工作负载,或在工作减少时关闭冗余节点,从而提高Reactive系统的弹性。 位置透明度也支持韧性,因为您不关心管线失败,并且没有成功转换的消息可以重新处理。 面对不断变化的负载以及系统中各种故障的恢复能力,我们可以确保响应式用户体验。 通过这种方式,消息驱动体系结构是反应式应用程序的精髓。

【1】https://baike.baidu.com/item/%E9%98%BF%E5%A7%86%E8%BE%BE%E5%B0%94%E5%AE%9A%E5%BE%8B/10386960?fr=aladdin&fromid=2935958&fromtitle=Amdahl%E5%AE%9A%E5%BE%8B

Spring Cloud Alibaba(八) 消息驱动 消息驱动 阅读详情

相关推荐

Go必知必会系列:消息驱动与事件驱动

作者:禅与计算机程序设计艺术 1.简介 消息驱动与事件驱动是两种编程模型,它们在实际应用中的区别也十分明显。本文将详细阐述两者之间的差异、联系和用法。希望能给读者提供更加深刻的认识和理解。 什么是消息驱动?它是一种应用模式或者编程方式,它的目标就是为了解耦各个模块间的数据交流。在这种模型中

AI天才研究院 1419

平台治理开发:事件驱动架构与消息驱动

1.背景介绍 事件驱动架构(Event-Driven Architecture,EDA)和消息驱动架构(Message-Driven Architecture,MDA)是两种非常重要的软件架构模式,它们在现代软件系统中发挥着至关重要的作用。事件驱动架构是一种基于事件和事件处理器之间的一对一或一对多关系的架构,其中事件是系统中发生的有意义的变化。消息驱动架构是一种基于消息队列和消费者之间的一对一或...

AI天才研究院 1953

从工业夹爪到Shadow Hand:一文看懂机器人灵巧手的硬件进化史(附避坑指南)

本文详细解析了机器人灵巧手从工业夹爪到Shadow Hand的硬件进化历程,涵盖刚性夹持器、自适应夹持器到多指灵巧手的技术突破。文章还提供了选购指南与技术避坑策略,帮助读者根据操作复杂度和环境结构化程度选择最适合的解决方案,适用于制造业、医疗和服务业等多个领域。

weixin_29074409的博客 484

从零到Kafka:万字带你体验Spring Boot整合消息驱动的奇妙之旅

在Kafka 中,可以自定义消息的序列化和反序列化过程,以便按照需求对消息进行定制化处理。一般来说,Kafka 使用的默认序列化器是基于字节数组的序列化和反序列化。但有时候为了处理更复杂的消息格式需要自定义序列化器来处理。在Kafka中,如果需要使用自定义的序列化器,可以实现接口。假设处理自定义的对象Person创建一个Person@Getter@Setter@Override然后,实现Serializer接口及对应的configure和serialize@Override。

爱媳妇儿爱编程 4304

【Get深一度】小波分析概念1——紧支撑集是什么意思,通俗解释

最近学到小波,在仿真中也用到了紧支撑函数;紧支撑性越好,说明能量越集中;用最通俗的话来讲,紧支撑是这样的: 对于函数f(x),如果自变量x在 0附近的取值范围内,f(x)能取到 C; 而在此之外,f(x)取值为 0; 那么这个函数f(x)就是紧支

Trey_优快云 的优快云博客 8348

abaqus 6.13安装(ubuntu 16.04LTS)

1。从iso将文件拷贝出来 2。chmod 777 -R ./* 给文件权限 3。sudo /home/xx/A/setup 4。安装licenseserver 5。拷贝lic,log文件 6。打开license sudo ./lmgrd -c path 7. 27011@xx or 27011@localhost ...

a1099313374的博客 1950

消息驱动(SpringCloud Stream)

前言 什么是消息驱动? 屏蔽底层消息中间件的差异,降低切换成本,统一消息的编程模型 官网:https://spring.io/projects/spring-cloud-stream#overview https://cloud.spring.io/spring-cloud-static/spring-cloud-stream/3.0.1.RELEASE/reference/html/ Spring Cloud Stream中文指导手册: https://m.wang1314.com/doc/weba

Lifelong learning 1451

使用 Python 实现基于 AGA8 GERG - 2008 方程计算掺氢天然气压缩因子的示例代码

AGA8 GERG - 2008 方程是用于计算天然气混合物热力学性质的一种方法,下面是一个使用 Python 实现基于 AGA8 GERG - 2008 方程计算掺氢天然气压缩因子的示例代码。需要注意的是,AGA8 GERG - 2008 方程非常复杂,完整实现需要大量的系数和详细的计算步骤。这里我们简化了部分过程,使用CoolProp库来完成计算,因为CoolProp已经实现了 GERG - 2008 方程。

AI的内部世界的博客 887

浅析事件驱动和消息驱动

事件驱动和消息驱动的定义,区别

weixin_55658418的博客 1643

115网页版VR模式终于能用了!电脑直接播放vr视频沉浸感满满 115vr播放 无需vr头盔播放vr视频 在线vr播放器 115网盘360度视频播放方法 115全景视频播放教程

油猴 + 脚本让你网页端直接开启 VR 模式支持 360 视频拖动视角,非常沉浸适合电脑设备直接用无需vr头盔也能轻松畅看vr视频,希望也能帮到你。如果你也被 115 的限制搞烦了,不妨试试这招。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 5714

DICOM图像知识:深入详解DICOM的层级关系

解析DICOM的四个主要层级:Patient(患者)、Study(检查)、Series(序列)和SOP(服务-对象对),探讨它们之间的关系、各自的唯一标识符以及在实际应用中的用途

编程技术探索者,分享C/C++、C#、Java、数据库等开发经验,聚焦实战技巧与AI兴趣,助力编程爱好者成长。 3304

【Java开发】Spring Cloud 10 :Stream消息驱动

官方定义Spring Cloud Stream 是一个用来为微服务应用构建消息驱动能力的框架。它为一些供应商的消息中间件产品提供了个性化的自动化配置实现,Spirng Cloud Stream 本质上就是整合了 Spring Boot 和 Spring Integration,实现一套轻量级的消息驱动的微服务框架。通过使用 Spring Cloud Stream 可以有效简化开发人员对消息中间件的使用复杂度,让系统开发人员可以有更多的精力关注于核心业务逻辑的处理。

尹煜的博客 3458

YOLO26-seg分割优化:轻量化卷积魔改 | 新的partial convolution(PConv)结合C3k2 | CVPR2023

​​​​​摘要:本研究对Ultralytics YOLO26进行了全面分析,重点阐述了其关键架构改进及其在实时边缘目标检测中的性能基准测试。YOLO26于2025年9月发布,是YOLO系列最新、最先进的成员,专为在边缘及低功耗设备上实现高效、精确且易于部署的目标而构建。本文依次详述了YOLO26的架构创新,包括:移除了分布焦点损失(DFL);采用端到端的无NMS推理;集成了渐进损失(ProgLoss)与小目标感知标签分配(STAL);以及引入了用于稳定收敛的MuSGD优化器。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 151

《springcloud 五》springcloud stream

什么是消息驱动? SpringCloud Stream消息驱动可以简化开发人员对消息中间件的使用复杂度,让系统开发人员更多尽力专注与核心业务逻辑的开发。SpringCloud Stream基于SpringBoot实现,自动配置化的功能可以帮助我们快速上手学习,类似与我们之前学习的orm框架,可以平滑的切换多种不同的数据库。 目前SpringCloud Stream 目前只支持 rabbitMQ...

weixin_30455661的博客 329

设计四翼无人机(Quadcopter)的自主降落控制算法

为四翼无人机建立动力学模型,包括其姿态(Pitch, Roll, Yaw)和位置(X, Y, Z)的变化。可以使用Aerospace Blockset中的预制模块,或者根据具体需求构建自定义模型。示例:简化动力学模型利用块模拟四翼无人机的基本行为,确保模型能够反映电机输出如何影响姿态和位置变化。

amy_mhd的博客 242

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

“消息驱动、事件驱动、流 ”的消息模型

事件驱动 EDA 作为 Gartner 预测的十大技术趋势之一, EventBridge 作为下一代消息中间件,也是目前的重点方向之一。

- 1063

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Spring Cloud Stream:消息驱动

Spring Cloud Stream:消息驱动

qq_35763697的博客 1083

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

“消息驱动、事件驱动、流 ”基础概念解析

本文旨在帮助大家对近期消息领域的高频词“消息驱动(Message-Driven),事件驱动(Event-Driven)和流(Streaming)”有更清晰的了解和认知,其中事件驱动 EDA 作为 Gartner 预测的十大技术趋势之一, EventBridge 作为下一代消息中间件,也是目前的重点方向之一。

阿里巴巴云原生的博客 464

事件驱动和消息驱动

之前简单写过一些关于事件驱动的文章:【C/C++服务器开发】事件驱动、事件驱动架构、事件驱动编程及设计模式。 最近看到一篇不错的文章,在此转载一下:事件驱动和消息驱动 事件驱动和消息驱动 消息驱动和事件驱动很类似,都是先有一个事件,然后产生一个相应的消息,再把消息放入消息队列,由需要的项目获取。他们的区别是消息是谁产生的 消息驱动:鼠标管自己点击不需要和系统有过多的交互,消息由系统(第三方)循环检测,来捕获并放入消息队列。消息对于点击事件来说是被动产生的,高内聚。 事件驱动:鼠标点击产生点击事件后要向系统发

qq_41854911的博客 4723

Spring Cloud Alibaba简书(七)------Rocketmq消息驱动

Spring Cloud

a229475789的博客 358

异步编程 - 14 异步、分布式、基于消息驱动的框架 Akka

Akka 是一个开源的并发、分布式、基于消息驱动的框架,用于构建高可伸缩性、可靠性和并发性强的应用程序。它是基于 JVM(Java虚拟机)的,主要使用 Scala 编程语言开发,但也提供了 Java API,因此可以在 Java 和 Scala 中使用。Actor 模型:Akka 的核心构建块是 Actor,它是一种轻量级并发原语。Actor 之间通过消息通信进行互动,每个 Actor 都有自己的状态和行为,它们之间是相互隔离的,这有助于构建高度可伸缩的系统。并发性和并行性。

小工匠 1万+

SpringCloud之Stream消息驱动RocketMQ讲解

是一个用来为微服务应用构建消息驱动能力的框架。它可以基于来创建独立的、可用于生产的Spring应用程序。为一些供应商的消息中间件产品提供了个性化的自动化配置实现,并引入了发布-订阅、消费组、分区这三个核心概念。简单的说,本质上就是整合了和,实现了一套轻量级的消息驱动的微服务框架。/*** 这两个通道可能定义在两个不同的通道里面,这里为了方便放在同一个项目中演示*/ // 收(订阅频道/消息消费者) @Input(INPUT) SubscribableChannel input();

上善若泪 4955

SpringCloud13-SpringCloud Stream消息驱动

SpringCloud Stream消息驱动 1、概述 1.1 Spring Cloud Stream是什么 官方定义Spring Cloud Stream是一个构建消息驱动微服务的框架。 应用程序通过inputs或者outputs来与Spring Cloud Stream中binder对象交互。通过我们配置来binding(绑定),而Spring Cloud Stream的binder对象负责与消息中间件交互。所以,我们只需要搞清楚如何与Spring Cloud Stream交互就可以方便使用消息驱动的方

zengdongwen的博客 352

JavaScript中的异步梳理(1)——使用消息驱动

先举一个例子,如果希望ABCDE这5个函数依次执行,我们可以写出如下代码。 A(); B(); C(); D(); E(); 在同步的情况下,这样的代码没有任何问题。但如果ABCDE都是异步的,还需要按次序执行,这样写就不行了。通常我们会为异步函数设置回调,当函数执行完的时候执行回调,例如 A(functio...

baoaoba9317的博客 128

Java中的异步消息处理与事件驱动架构实现细节:从消息队列到事件流

从使用RabbitMQ和Kafka进行消息队列处理,到使用Kafka Streams和Spring Cloud Stream进行事件流处理,具体的代码示例展示了这些技术的实际应用。在现代分布式系统中,异步消息处理和事件驱动架构是实现高并发和高可用的重要手段。通过使用消息队列和事件流,我们可以解耦系统组件,提升系统的扩展性和可维护性。在实际项目中,异步消息处理与事件驱动架构通常结合使用,以实现系统的高并发和高可用。例如,在电商平台中,订单创建、支付和库存更新可以通过消息队列和事件流进行异步处理。

微赚淘客系统开发者博客 1254
上一篇: kafka Streams学习
下一篇: Kafka 常用命令
AI干IT
博客等级 码龄18年 50粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值