左耳听风_044_43_弹力设计篇之异步通讯设计

你好,我是陈浩网名做耳朵耗子。

在前面的课程中呢,我所说的隔离设计啊,通常都需要对系统做解耦设计,而把一个单体系统做解耦,不单单是要把业务功能拆分出来。

正如前面所说,拆分完之后呢,还会面对很多的问题。

那其中一个重要的问题呢,就是这些系统间的通讯。

那通讯一般来说呢分同步和异步两种,同步,通讯呢就想打电话需要实时响应。

而异步通讯呢就像发邮件啊,不需要马上回复,这两者各有千秋啊,我们很难说谁比谁好。

但是呢在面对超高吞吐量的场景下,异步处理呢就比同步处理有比较大的优势了。

啊,这就好像一个人不可能同时接打很多的电话,但是他可以同时接收很多的电子邮件一样同步调用呢。参考资料:https://51gx.top/detail/264

虽然让系统间只耦合于接口,而且实时性呢也会比异步调用要高。

但是我们也需要知道,同步调用呢会带来以下的几个问题。

那第一个问题呢就是同步调用需要被调用方的吞吐,不低于调用方的吞吐,否则呢就会导致被调用方因为性能不足而拖死调用方。

那换句话说呢,就是整个同步调用电的性能啊,会由最慢的那个服务所决定。

那第二呢就是同步调用啊,会导致调用方一直在等待被调用方完成。

那如果一层接一层的同步调用下去,所有的参与方都会有相同的等待时间。

那这样呢会非常消耗调用方的资源,因为调用方需要保存现场等待远端返回。

所以对于病发比较高的场景来说呢,这样的等待啊可能会极度消耗资源。

呃,第三呢同步调用只能是一对一的,很难做到一对多。

最后一个问题啊,也就是同步调用最不好的一个问题,就是如果被调用方有问题,那么调用方呢就会跟着出问题。

于是呢就会出现多米诺骨牌效应,故障一下就蔓延开来。

所以呢异步通讯相对于同步通讯来说,除了可以增加系统的吞吐量之外呢,最大的一个好处呢是它可以让服务间的解耦更为彻底。

服务的调用方和被调用方可以按照自己的速率,而不是步调一致啊,从而可以更好的保护系统,让系统更有弹力。

那异步通讯通常来说呢,有三种方式,那第一种方式呢是请求响应式。

在这种情况下呢,发送方会直接请求接受方。

那被请求方接收到请求之后呢,会直接返回收到请求,正在处理这类的信息。

那对于返馈结果呢有两种方法,一种呢是发送方,时不时的去轮询一下啊,问一下干没干完。

那另一种方式呢是发送方注册一个回调方法啊,也就是让接收方处理完之后呢,回调给请求方。

那这种架构模型呢在以前的网上支付中啊比较常见页面,先从商家跳转到支付宝或者银行。

那商家呢会把回调的UIL传给支付页面。

那支付完成之后呢,再跳转回商家的URL.那很明显这种情况下呢,还是有一定的耦合的。

发送方呢要依赖于接收方,并且呢要把自己的回调发送给接收方。

处理完成之后呢,再回调异步通讯的。

第二种方式呢是通过订阅的方式,在这种情况下呢接收方会来订阅发送方的消息。

那发送方呢会把相关的消息或者数据放到接收方所订阅的队列中,而接收方呢会从队列中来获取数据。

在这种方式下呢,发送方并不关心订阅方的处理结果啊,他只是告诉订阅方有事情要干,收完消息之后给个ACK就可以了。

你干成啥样?我不关心。

那这个方式呢常用于像MVC这样的设计模式里啊,我在文中呢给你画了一张图,你可以看一看。

那这个呢就好像是在下订单的时候,一旦用户支付完成了,那就需要把这个事件啊通知给订单处理和物流订单处理变更状态。

而物流服务呢需要从仓库服务分配相应的库存,并准备配送。

那后续这些处理的结果呢,无需告诉支付服务。

那为什么要做成这样呢?好了,重点来了,前面那种请求响应的方式啊,就像函数调用一样。

那这种方式呢有数据有状态的往来,也就是说需要请求数据返回数据。

那服务里面呢还可能需要保存调用的状态,所以呢这个服务是有状态的那如果我们把服务的状态给去掉,那么服务间的依赖啊就只有事件了。

你要知道分布式系统的服务设计呢是需要向无状态服务努力的这其中啊有太多的好处了无状态,就意味着你可以非常方便的运维。

所以事件通讯呢就成为了异步通讯中最重要的一个设计模式。

在前面支付的那个例子中呢,商家这边只需要订阅一个支付完成的事件。

那这个事件呢带一个订单号,他不需要让支付方知道自己的回调的UL.那这样的异步是不是更干净一些呢?但是呢在这种方式下,接收方需要向发送方订阅事件,所以呢是接收方依赖于发送方。

那这种方式呢还是有一定的耦合,所以呢就有了异步通讯的第三种方式,通过broker的方式。

那所谓broker呢,就是一个中间人发送方和接收方都互相看不到对方,他们能看到的是一个broker.那发送方向broker发送消息,接收方呢向broker订阅消息。

那文中呢有一张图展示了这个流程,那这个呢就是完全的解耦了,所有的服务呢都不需要相互依赖,而是依赖于一个中间件broker.那这个broker呢是一个像数据总线一样的东西,所有的服务呢要接收数据和发送数据啊都发到这个总线上。

那这个总线啊就像协议一样,让服务间的通讯啊变得标准和可控。

在broker这种模式下,发送方的服务和接收方的服务,最大程度的结耦了。

但是所有的人啊都依赖于一个总线,所以这个总线呢就需要有这样几个特性。

那第一呢必须是高可用的,因为它成了整个系统的关键。

那第二呢必须是高性能,而且啊是可以水平扩展的那第三呢必须是可以持久化,不丢数据的那要做到这三条啊还是比较难的那当然呢好在现在开源软件或者云平台上broker的软件是非常成熟的,所以呢也节省了我们很多的精力。

那前面讲的第二种和第三种方式就是比较著名的事件驱动架构。

正如前面所说,事件驱动啊最好是使用broker的方式服务间,通过交换消息来完成交流和整个流程的驱动。

那再来看一看文中这张图,那这个呢是一个订单处理流程,下单服务通知,订单服务有订单要处理。

而订单服务生成订单之后呢,发出通知,库存服务和支付服务得到通知之后呢,一边是占着库存,另一边呢是让用户支付等待用户支付完成之后啊,通知配送服务进行商品的配送。

那整个流程中的每个服务呢都是自包含的。

所谓自包含呢,也就是没有和别人产生依赖,而要把整个流程给串联起来呢,我们需要一系列的消息通道,各个服务做完自己的事儿之后呢,发出相应的事件,而又有一些服务在订阅着某些事件来联动。

那事件驱动方式的好处呢至少有这么几个。

那第一呢服务间的依赖没有了,服务间是平等的,每一个服务呢都是高度可乘用啊,并且可替换的那第二呢,服务的开发测试、运维和故障处理啊都是高度隔离的那第三呢服务间通过事件来关联,所以服务间呢不会相互的block.那第四呢在服务之间增加一些adapter会相当的容易。

那还有一个好处呢,就是服务间的吞吐啊也被解开了。

那各个服务呢可以按照自己的处理速度来处理。

我们知道任何设计呢都有好有不好。

那事件驱动的架构呢也会有一些不好的地方,那首先呢就是业务流程不再那么明显,好管理。

那整个架构呢会变得比较复杂。

而解决这个问题呢,需要有一些可视化的工具来呈现整体业务流程。

那其次呢事件可能会乱序,那这个呢会带来非常bug的事儿。

要解决这个问题呢,需要很好的管理,一个状态机的控制。

那另外呢事务处理会变得复杂啊,需要使用两阶段提交来做强一致性,或者退缩到最终一致性。

最后呢我们来讲一讲异步通讯的设计重点。

首先呢我们需要知道为什么要异步通讯,那主要呢有这么几个原因。

那第一呢异步通讯最重要的是解耦服务间的依赖。

那最佳的解耦方式呢是通过broker的机制。

那第二呢解耦的目的是让各个服务的隔离性更好。

那这样呢不会出现一导倒一片的故障。

那第三呢,异步通讯的架构可以获得更大的吞吐量,而且各个服务间的性能不受干扰,相对独立。

那第四呢利用broker或者队列的方式,还可以实现把抖动的吞吐量变成均匀的吞吐量。

那这个呢就是所谓的萧峰,这对后端系统啊是个不错的保护。

那最后一点,异步通讯的服务相对独立,在部署扩容和运维上啊,都可以做到独立,不受其他服务的干扰。

但我们需要知道这样的方式带来的问题。

所以在设计成异步通信的时候呢,我们需要注意一些事情。

呃,首先呢用于异步通讯的中间件broker就成为了关键需要设计成高可用不丢消息的。

另外呢因为是分布式的,所以可能很难保证消息的顺序。

所以你的设计呢最好不要依赖于消息的顺序。

那其次呢,异步通讯会导致业务处理流程不那么直观。

因为像接力一样,所以在broker上面呢需要有相关的服务消息跟踪机制,否则出现问题了,不容易调试。

那另外呢因为服务间只通过消息来交互,所以业务状态呢最好由一个总控方来管理。

那这个总控方呢维护一个业务流程的状态变迁逻辑,以便在系统发生故障之后啊,知道业务处理到了哪一步,从而可以在故障清除后继续处理。

那这样的设计在银行的对账程序里啊比较常见。

那银行系统里呢会有大量的外部系统通讯,比如跨行的交易,跨企业的交易啊等等。

所以呢为了保证整体数据的一致性啊,或者避免漏处理,或者处理错的交易,需要有对账系统。

那这个呢其实就是那个总控。

那这个呢也是为什么银行有的交易是t加一隔天结算啊,就是因为要对个账,确保数据是对的那最后需要注意的是在消息传递中呢,可能有的业务逻辑会有像TCP协议那样的send和ACK机制。

比如a服务发出了一个消息之后啊,开始等待处理方的ACK.那如果等不到的话,就需要做重传。

那这个时候就需要处理方有密等的处理,就是同一件消息,无论收到多少次啊,都只处理一次。

好了,我们来总结一下今天分享的主要内容。

那首先呢同步调用有四个问题,影响吞吐量消耗系统资源只能一对一啊,还有多米诺骨牌效应。

于是呢我们想用义务调用来避免这些问题。

那异步调用呢有三种方式,包括请求响应、直接订阅和中间人订阅。

在最后呢我介绍了事件驱动设计的特点和异步通讯设计的重点。

在下节课中呢我们会讲述密等型设计啊,希望对你有帮助。

也欢迎你分享一下你在分布式服务的设计中哪些情况下会使用异步通讯啊,是怎样设计的,又有哪些情况使用同步通讯呢?文末,我给出了分布式系统模式系列文章的目录啊,希望你能在这个列表里找到自己感兴趣的内容。

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

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

相关文章

制造企业真的需要数字化转型吗?一文讲透:为何做,如何做?

此前拜访了不少制造企业,其以中小型企业居多,在与企业负责人交流数字化转型话题时,感触最多的还是管理者对“数字化转型”的认知。 在数字化转型方面从国家层面到地方政府进行大量的宣传与政策支持,部分行业头部企业也从数字化转…

百度出品_文心快码Comate提升程序猿效率

1.文心快码 文心快码包含指令、插件 和 知识三种功能, 1)指令包含Base64编码、Base64解码、JSON转TS类型、JSON转YAML、JWT解码喂JSON。 2)插件包含 3)指令包含如下功能: 官网链接

风控指标范围

摘要:每天学习一点金融小知识 不同的金融资产具有不同的金融属性,从资产管理角度出发,业务需要制定一系列的指标来对金融产品进行监管,指标维度的制定很多时候取决于金融产品自身的属性。

AI墓地:738个倒闭AI项目的启示

近年来,人工智能技术迅猛发展,然而,不少AI项目却在市场上悄然消失。根据AI工具聚合网站“DANG”的统计,截至2024年6月,共有738个AI项目停运或停止维护。本文将探讨这些AI项目失败的原因,并分析当前AI初创企…

C语言:结构体数组

结构体数组 介绍定义结构体定义结构体数组初始化结构体数组访问和修改结构体数组的元素遍历结构体数组 示例高级用法动态分配结构体数组使用 malloc 动态分配使用 calloc 动态分配 结构体数组作为函数参数结构体数组与指针多维结构体数组使用 typedef 简化结构体定义结构体数组…

ClickHouse概述

ClickHouse概述 文章目录 ClickHouse概述ClickHouse是什么ClickHouse快的理由什么是OLAPClickHouse的特点列式存储DBMS 的功能多样化引擎高吞吐写入能力数据分区与线程级并行 ClickHouse的应用合适场景不适合场景 ClickHouse是什么 ClickHouse 是俄罗斯的 Yandex 于 2016 年开…

ubuntu20.04配置调试工具

1.准备工作&#xff1a;安装g或者gdb sudo apt updatesudo apt install gg --versionsudo apt install gdbgdb --version 2.配置环境 2.1在本地新建一个main.cpp #include <iostream> #include <vector> #include <string>using namespace std;int main(…

MySQL资讯|2024年MySQL第一个长期支持版本8.4发布

&#x1f4eb; 作者简介&#xff1a;「六月暴雪飞梨花」&#xff0c;专注于研究Java&#xff0c;就职于科技型公司后端工程师 &#x1f3c6; 近期荣誉&#xff1a;华为云云享专家、阿里云专家博主、腾讯云优秀创作者、ACDU成员 &#x1f525; 三连支持&#xff1a;欢迎 ❤️关注…

【漏洞复现】Emlog Pro 2.3.4——任意用户登入、会话持久化(CVE-2024-5044)

声明&#xff1a;本文档或演示材料仅供教育和教学目的使用&#xff0c;任何个人或组织使用本文档中的信息进行非法活动&#xff0c;均与本文档的作者或发布者无关。 文章目录 漏洞描述漏洞复现 漏洞描述 漏洞编号&#xff1a;CVE-2024-5044 漏洞成因&#xff1a; 在Emlog Pro …

ASPICE与ISO 21434:汽车软件与网络安全标准的协同与互补

ASPICE&#xff08;Automotive SPICE&#xff09;与ISO 21434在汽车行业中存在显著的相关性&#xff0c;主要体现在以下几个方面&#xff1a; 共同目标&#xff1a; ASPICE和ISO 21434都旨在提高汽车系统和软件的质量、可靠性和安全性。ASPICE关注汽车软件开发过程的成熟度和…

MySQL分页的底层原理主要涉及到InnoDB存储引擎中的页(Page)概念以及使用LIMIT和OFFSET关键字进行查询时的工作原理。

MySQL分页的底层原理主要涉及到InnoDB存储引擎中的页&#xff08;Page&#xff09;概念以及使用LIMIT和OFFSET关键字进行查询时的工作原理。以下是一些关键点的概述&#xff1a; 1. **页&#xff08;Pages&#xff09;**&#xff1a;在InnoDB存储引擎中&#xff0c;页是管理数…

黑马点评DAY5|商户查询缓存

商户查询缓存 缓存的定义 缓存就是数据交换的缓冲区&#xff08;Cache&#xff09;&#xff0c;是存储数据的临时地方&#xff0c;一般读写性能较高。 比如计算机的CPU计算速度非常快&#xff0c;但是需要先从内存中读取数据再放入CPU的寄存器中进行运算&#xff0c;这样会限…

【C语言】union 关键字

在C语言中&#xff0c;union关键字用于定义联合体。联合体是一种特殊的数据结构&#xff0c;它允许不同的数据类型共享同一段内存。所有联合体成员共享同一个内存位置&#xff0c;因此联合体的大小取决于其最大成员的大小。 定义和使用联合体 基本定义 定义一个联合体类型时…

Owl 中的 Props 概述

在动态的 Web 开发环境中&#xff0c;创建模块化和可重用组件对于构建可扩展应用程序至关重要。将这种方法提升到新水平的一个框架是 Owl&#xff0c;其中“props”&#xff08;属性的缩写&#xff09;的概念在协调父组件和子组件之间的通信中起着关键作用。在 Owl 框架中&…

SiCat:一款多功能漏洞利用管理与搜索工具

关于SiCat SiCat是一款多功能漏洞利用管理与搜索工具&#xff0c;该工具基于纯Python 3开发&#xff0c;旨在帮助广大研究人员有效地识别和收集来自开源和本地存储库的漏洞信息。 SiCat专注于网络安全管理方面的实践工作&#xff0c;允许研究人员快速实现在线搜索&#xff0c;…

2024亚太赛(中文赛)数学建模竞赛选题建议+初步分析

提示&#xff1a;DS C君认为的难度&#xff1a;B<C<A&#xff0c;开放度&#xff1a;C<A<B。 综合评价来看 A题适合有较强计算几何和优化能力的团队&#xff0c;难度较高&#xff0c;但适用面较窄。 B题数据处理和分析为主&#xff0c;适合数据科学背景的团队…

Android TextView的属性与用法

文本控件包括TextView、EditText、AutoCompleteTextView、CheckedTextView、MultiAutoCompleteTextView、TextInputLayout等&#xff0c;其中TextView、EditText是最基本最重要的文本控件&#xff0c;是必须要掌握的文本控件。 1.TextView TextView控件用于显示文本信息&…

C#常用关键字举例

关键字是 C# 编译器预定义的保留字。这些关键字不能用作标识符&#xff0c;但是&#xff0c;如果您想使用这些关键字作为标识符&#xff0c;可以在关键字前面加上 字符作为前缀。 class: public class MyClass {// Class definition }interface: public interface IMyInterfac…

【C++设计模式】(一)面向对象编程的八大原则

文章目录 面向对象编程的八大原则1 单一职责原则2 开放-关闭原则3 里氏替换原则4 接口隔离原则5 依赖倒置原则6 迪米特法则/ 最少知识原则7 合成复用原则8 针对接口编程而不是针对实现编程 面向对象编程的八大原则 面向对象编程有一系列的设计准则来保证软件的质量&#xff0c…

自然语言处理学习--3

对自然语言处理领域相关文献进行梳理和总结&#xff0c;对学习的文献进行梳理和学习记录。希望和感兴趣的小伙伴们一起学习。欢迎大家在评论区进行学习交流&#xff01; 论文&#xff1a;《ChineseBERT: Chinese Pretraining Enhanced by Glyph and Pinyin Information》 下面…