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

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

Ubuntu20.04下Intel RealSense D435i相机驱动配置全攻略(含ROS Noetic适配)

本文详细介绍了在Ubuntu20.04系统下配置Intel RealSense D435i相机驱动的完整流程,包括libRealsense SDK 2.0安装、ROS Noetic适配及常见问题解决方案。通过实战指南帮助开发者快速实现深度相机与ROS的集成,适用于机器人视觉和SLAM应用开发。

weixin_29281915的博客 512

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

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

爱媳妇儿爱编程 4304

2026 最新实战教程:AI 重构开发全流程(从需求→上线→运维)

1)做什么系统2)技术栈3)功能模块4)部署要求plaintext我要做一个:待办事项(Todo)全栈应用技术栈:前端:React + TypeScript + Tailwind后端:Node.js + Express + MongoDB部署:Docker + 本地运行(后续可上云)功能:- 增删改查任务- 任务状态切换(完成/未完成)- 简单错误处理请按企业级标准生成:架构设计 + 全部代码 + 接口文档 + 启动命令。

qq_35779316的博客 1695

LAP-D协议概述

Q.921协议由称为LAPD(链路访问协议-D通道),与HDLC的关系密切,它是在ISDN D通道上使用的数据链路协议。 注:http://www.freesoft.org/CIE/Topics/125.htm LAP-D的帧格式 标志、位填充技术和FCS校验计算与HDLC一致。 16位的地址包括C/R字段、SAPI(服务访问点标识)和TEI(端点标识)。TEI用于区分使用相同ISDN...

系统运维 1914

消息驱动(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

R语言实战:5分钟搞定相加交互效应分析(逻辑回归/Cox回归/GLMM/GEE全支持)

本文详细介绍了如何利用R语言中的`scitable`包快速实现相加交互效应分析,支持逻辑回归、Cox回归、GLMM和GEE等多种模型。通过自动化计算RERI、AP和SI等指标,大幅提升临床研究和流行病学分析的效率与准确性,特别适合处理多因素联合作用的复杂场景。

fanta的博客 671

浅析事件驱动和消息驱动

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

weixin_55658418的博客 1643

基于mengzi-t5训练生成式模型

【代码】基于mengzi-t5训练生成式模型。

开卷有益 170

Android 13.0 设置默认屏幕亮度百分比

在13.0的系统ROM产品开发中,在一些产品开发中,对于设置默认屏幕亮度和屏幕亮度百分比的功能,在开发中也是常见的功能,在10.0的平台设置可能有一些不同,一般的都是在SettingProvider中设置就可以了 在11.0以后的系统中设置默认屏幕亮度的方法就不同了,接下来具体分析功能的实现

安卓兼职framework和app工程师的博客 1560

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

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

尹煜的博客 3458

OpenOCD入门到精通:第 4 章 配置文件体系详解

本文深入解析OpenOCD配置文件的体系结构和工作机制。首先介绍了配置文件的搜索路径优先级和加载顺序,以及配置阶段与运行阶段的区别。然后详细分析了interface配置文件的适配器参数调优方法,包括ST-Link、CMSIS-DAP和FTDI等常见调试器的配置示例。最后重点讲解了target配置文件的核心结构,包括TAP声明、目标创建和工作区设置等关键步骤,并以stm32f1x为例展示了完整的配置流程。通过本文可以全面了解OpenOCD配置文件的分层设计理念和参数化配置方法。

从事嵌入式linux android驱动开发,拥有全栈能力 594

《springcloud 五》springcloud stream

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

weixin_30455661的博客 329

基于YOLO和KCF的目标跟踪算法研究

该算法结合了YOLO的目标检测能力和KCF的目标跟踪精度,能够实现准确且高效的目标跟踪。通过结合YOLO的目标检测能力和KCF的目标跟踪精度,该算法能够实现准确且高效的目标跟踪。目标跟踪:从第二帧开始,我们使用YOLO检测目标,并使用KCF跟踪器更新目标的位置。具体而言,对于每个检测到的目标,我们计算其与上一帧跟踪结果的特征相似度,然后选择最相似的目标作为当前帧的跟踪结果。需要注意的是,以上代码只是演示了基于YOLO和KCF的目标跟踪算法的基本思路,实际应用中可能需要根据具体情况进行调整和优化。

QoDeveloper的博客 1575

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

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

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

- 1063

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Spring Cloud Stream:消息驱动

Spring Cloud Stream:消息驱动

qq_35763697的博客 1083

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

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

本文旨在帮助大家对近期消息领域的高频词“消息驱动(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、付费专栏及课程。

余额充值