微服务网关原子性(微服务 api网关)

网友投稿 370 2022-12-30


本篇文章给大家谈谈微服务网关原子性,以及微服务 api网关对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。 今天给各位分享微服务网关原子性的知识,其中也会对微服务 api网关进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

微服务架构设计模式 | 第4章 使用Saga管理事务

传统的分布式事务管理方法对于现代应用程序来说不是一个好的选择,跨服务的操作必须使用所谓的Saga(一种消息驱动的本地事务序列)来维护数据一致性,而不是ACID事务(原子性、一致性、隔离性和持久性)。

Saga的一个挑战在于只满足ACD(原子性、一致性和持久性)特性,而缺乏ACID事务的隔离性。因此应用程序必须使用所谓的对策(countermeasure),找到办法来防止或减少由于缺少隔离而导致的并发异常

这是一本关于微服务架构设计方面的书,这是本人阅读的学习笔记。以下对一些符号做些说明:

()为补充,一般是书本里的内容;
[]符号为笔者笔注;

分布式事务管理的事实标准是XA标准:

其存在的挑战有:

当本地事务完成时,服务会发布消息。然后,此消息将触发Saga中的下一个步骤。

需要注意不是所有步骤都需要事务补偿,如只读步骤、当某步骤之后的操作总会成功时等。


在实现基于协同的Saga时,需要考虑一些与服务间通信相关的问题:

好处 :

弊端 :

图解 :

Order Service首先创建(实例化)一个Order对象和一个Create Order Saga编排器对象,一切正常后流程如下:

将Saga建模成状态机非常有用,因为它描述了所有可能的场景(可能成功也可能失败)。

好处 :

弊端 :



OrderService的UML类图 :

OrderService的Saga UML类图 :

Eventuate Tram Saga框架 :

OrderService创建Create Order Saga实例时的事件序列 :

当SagaManager收到来自Saga参与方的回复消息时的事件序列 :

OrderCommandHandlers UML类图 :

Order Service的命令处理程序 :



微服务架构的分布式事务问题如何处理?

分布式系统架构中,分布式事务问题是一个绕不过去的挑战。而微服务架构的流行,让分布式事问题日益突出!

下面我们以电商购物支付流程中,在各大参与者系统中可能会遇到分布式事务问题的场景进行详细的分析!

如上图所示,假设三大参与平台(电商平台、支付平台、银行)的系统都做了分布式系统架构拆分,按上数中的流程步骤进行分析:

1、电商平台中创建订单:预留库存、预扣减积分、锁定优惠券,此时电商平台内各服务间会有分布式事务问题,因为此时已经要跨多个内部服务修改数据;

2、支付平台中创建支付订单(选银行卡支付):查询账户、查询限制规则,符合条件的就创建支付订单并跳转银行,此时不会有分布式事务问题,因为还不会跨服务改数据;

3、银行平台中创建交易订单:查找账户、创建交易记录、判断账户余额并扣款、增加积分、通知支付平台,此时也会有分布式事务问题(如果是服务化架构的话);

4、支付平台收到银行扣款结果:更改订单状态、给账户加款、给积分帐户增加积分、生成会计分录、通知电商平台等,此时也会有分布式事务问题;

5、电商平台收到支付平台的支付结果:更改订单状态、扣减库存、扣减积分、使用优惠券、增加消费积分等,系统内部各服务间调用也会遇到分布式事问题;

如上图,支付平台收到银行扣款结果后的内部处理流程:

1、支付平台的支付网关对银行通知结果进行校验,然后调用支付订单服务执行支付订单处理;

2、支付订单服务根据银行扣款结果更改支付订单状态;

3、调用资金账户服务给电商平台的商户账户加款(实际过程中可能还会有各种的成本计费;如果是余额支付,还可能是同时从用户账户扣款,给商户账户加款);

4、调用积分服务给用户积分账户增加积分;

5、调用会计服务向会计(财务)系统写进交易原始凭证生成会计分录;

6、调用通知服务将支付处理结果通知电商平台;

如上图,把支付系统中的银行扣款成功回调处理流程提取出来,对应的分布式事务问题的代码场景:

/** 支付订单处理 **/

@Transactional(rollbackFor = Exception.class)

public void completeOrder() {

orderDao.update();  // 订单服务本地更新订单状态

accountService.update();  // 调用资金账户服务给资金帐户加款

pointService.update();  // 调用积分服务给积分帐户增加积分

accountingService.insert();  // 调用会计服务向会计系统写入会计原始凭证

merchantNotifyService.notify();  // 调用商户通知服务向商户发送支付结果通知

}


本地事务控制还可行吗?


以上分布式事务问题,需要多种分布式事务解决方案来进行处理。


订单处理:本地事务


资金账户加款、积分账户增加积分:TCC型事务(或两阶段提交型事务),实时性要求比较高,数据必须可靠。


会计记账:异步确保型事务(基于可靠消息的最终一致性,可以异步,但数据绝对不能丢,而且一定要记账成功)

商户通知:最大努力通知型事务(按规律进行通知,不保证数据一定能通知成功,但会提供可查询操作接口进行核对)

微服务,一个服务会影响整个系统吗

摘要: 最近大家都在谈微服务,随着越来越多的在线业务需要提供更大并发的scale-up 和 scale out能力,微服务确实提供了比较好分布式服务的解决方案。
阿里云高级解决方案架构师 杨旭
世界最大混合云的总架构师,4年前,开始作为双11阿里云技术负责人,负责搭建全球最大的混合云结构,把 “双11”的电商业务和技术场景在阿里云上实现,并保障这个混合云在双11当天能够满足全球客户的购物需求。
正文:
最近大家都在谈微服务,随着越来越多的在线业务需要提供更大并发的scale-up 和 scale out能力,微服务确实提供了比较好分布式服务的解决方案。
微服务并不陌生,知道SOA其实也就很容易理解微服务,可以把微服务当做去除了ESB的SOA。ESB是SOA企业服务架构中的总线,而微服务是去中心化的分布式软件架构,个人认为最大的设计区别在于设计初衷:
SOA是为了最大化的实现复杂系统代码的可复用性
而微服务是为了最大限度的解耦,不同业务系统甚至可以是不同语言之间的通信
没有最优的架构,只有最合适的架构,一切系统设计原则都要以解决业务问题为最终目标,脱离实际业务的技术情怀架构往往会给系统带入大坑。所有问题的前提要搞清楚我们今天面临的业务量有多大,增长走势是什么样,而且解决高并发的过程,一定是一个循序渐进逐步的过程。
网上的一张图很经典,总结的非常好:
整个系统进化分为三个阶段:
x轴,水平扩展阶段,通过负载均衡服务器不断的横向扩充应用服务器,水平扩展最重要的问题是需要注意不用服务器之间的如何保持session和会话同步,不能让用户在不通服务器之间切换时有感知应用扩展后自然遇到的问题就是DB的瓶颈:连接数,iops等。
z轴,就是对数据库的拆分,难度上了一个台阶,Sharding的基本思想就要把一个数据库如何进行切分,可以分为水平切分和垂直切分,水平切分相对简单,一主多从,多主都可以,根据业务的需要,多主切分设计时需要注意主键的关系,解决多写在进行数据同步时候的冲突问题,垂直拆分更加复杂,一般都会涉及到架构逻辑的改造,需要引入中间件,来进行数据源的管理,垂直拆分时把关系紧密(比如同一模块)的表切分出来放在一个库上,或者通过hash进行拆分,从而将原有数据库切分成类似矩阵一样可以无限扩充的队列。
y轴扩展,最后就是功能分解了,也就是我们讲的微服务切分。微服务拆分将巨型应用按照功能模块分解为一组组不同的服务,淘宝的系统当年也经历了这样的过程,通过五彩石项目从单一的war包拆分成了今天的大家看到买家,卖家中心,交易等系统。
引入微服务前你要知道的两三事:
1、成本升高,引入微服务架构,需要对原来单一系统进行拆分,1到100以后多服务的部署会带来成本的升高
2、解决分布式事务一致性问题
以前单一的系统好处很多,一条sql解决完成所有业务逻辑,微服务做完一件事情需要涉及多系统调用,系统间网络的不确定性给结果带来很多不确定性,如今天淘宝的系统,完成一次交易下单需要在上百个系统之间调用,如何保证系统的可靠性,以及核心数据如钱的最终一致性是设计之初就要想明白的,这里大多都要借助中间件来实现。
3、微服务的逻辑设计原则
随着不断拆分微服务,以及业务的迭代发展,系统之间极有可能出现混乱调用,所以微服务的顶层设计显得尤为重要,架构师需要搞清楚微服务的架构模型。那核心的设计思想就在于如何进行服务的分层,以及服务的重用,通过分层将服务进行分配,上层服务包装下层服务,下层服务负责原子性的操作,上层服务对下层服务进行业务性的组合编排,一定要理解业务,微服务拆分不是简单的系统组合,再说一遍一定要理解业务,否则上层服务一定会出现大量的交叉调用,系统复杂度会指数级上升,好的微服务架构师一定是业务架构师,基于业务的建瓴,微服务设计三部曲,遵循自下而上的设计原则:
原子服务
首先确认最基本业务最维度的原子服务,原子服务定义就是大家都会最大化重用的功能,需要在应用内的闭环操作,没有任何跨其他服务的分支逻辑,杜绝对其他服务的调用,有自己独立的数据存储,作为最底层服务抽象存在,以淘宝为例,卖家数据,卖家数据,订单数据就属于最基本的原子服务。
服务组合
在业务场景下,一个功能都需要跨越多个原子服务来完成一个动作。组合服务就是将业务逻辑抽象拆成独立自主的域,域之间需要保持隔离,服务组合会使用到多个原子服务来完成业务逻辑,如淘宝的交易平台会调用用户,商品,库存等系统。
业务编排
最外层就是面向用户的业务流程,一个产品化的商业流程需要对组合服务进行逻辑编排来完成最终的业务结果,这个编排服务可以完全是自动化的,通过工作流引擎进行组合自动化来完成特定SOP定义,这对企业应用的自动化流程改进也很有意义。如淘宝类目的双十一活动,通过对不通服务组合进行重用实现不通的营销活动逻辑。
4、运维管理的复杂度提升
微服务让应用数量增加很多,链路的集成、测试、部署都成为新的挑战,以前一个war包解决的问题,需要通过多应用发布来完成,发布时服务之间的依赖影响,会导致功能不可用,测试阶段的依赖性可能会让用例跑不下去,这些都会是需要新考虑的问题,需要有平台化的工具来支撑,目前阿里通过aone产品来保证从日常到预发到线上的持续集成交付。

为什么DDD是设计微服务的最佳实践

在本人的前一篇文章《不要把微服务做成小单体》中,现在很多的微服务开发团队在设计和实现微服务的时候觉得只要把原来的单体拆小,就是微服务了。但是这不一定是正确的微服务,可能只是一个拆小的小单体。这篇文章让我们从这个话题继续,先看看为什么拆出来的是小单体。

在微服务架构诞生之前,几乎所有的软件系统都是采用单体架构来构建的,因此大部分软件开发者喜欢的开发路径就是单体架构模式。在这样的背景下,根据经济学和心理学的 路径依赖法则 ,当这些开发者基于新的技术想要把原来的大单体拆分成多个部分时,就必然会习惯性地采用自己最擅长的单体架构来设计每个部分。

在现实中我们经常看到这个法则随处都会发生,微信刚出来的时候很多人说这不就是手机上的QQ吗,朋友圈刚出来的时候他们又会说这不就是抄袭微博吗。很多时候当你兴致冲冲给朋友介绍一个新的东东时,朋友一句话就能让你万念俱灰:这不就是XXX吗?之所以这样,是因为人类在接触到新知识新概念的时候,都会下意识的使用以前知道的概念进行套用,这样的思维方式是人类从小到大学习新事物的时候使用的模式,它已经固化成我们大脑操作系统的一部分了。

理解了这个法则,我们就可以很容易的明白,已经在单体架构下开发了多年的软件工程师,当被要求要使用微服务架构来进行设计和开发的时候,本能的反应方式肯定是:这不就是把原来的单体做小了吗?但是这样做出来的“微服务”真的能够给我们带来微服务架构的那些好处吗?真的能提高一个企业的数字化响应力吗?

不断变化的软件需求和经常被视为效率低下的软件开发一直都是这个行业里最难解决的顽疾,从瀑布到敏捷,都是在尝试找到一个解决这个顽疾的方法,领域驱动设计(Domain Driven Design)也是其中一个药方,而且随着十多年的不断实践,我们发现这个药方有它自己的独特之处,下面我们先来介绍一下这个药方。

领域驱动设计这个概念出现在2003年,那个时候的软件还处在从CS到BS转换的时期,敏捷宣言也才发表2年。但是Eric Evans做为在企业级应用工作多年的技术顾问,敏锐的发现了在软件开发业界内(尤其是企业级应用)开始涌现的一股思潮,他把这股思潮成为领域驱动设计,同时还出版了一本书,在书中分享了自己在设计软件项目时采用的建模方法,并为设计决策者提供了一个框架。

但是从那以后DDD并没有和敏捷一样变得更加流行,如果要问原因,我觉得一方面是这套方法里面有很多的新名词新概念,比如说聚合,限界上下文,值对象等等,要理解这些抽象概念本身就比较困难,所以学习和应用DDD的曲线是非常陡峭的。另一方面,做为当时唯一的“官方教材”《领域驱动设计》,阅读这本书是一个非常痛苦的过程,在内容组织上经常会出现跳跃,所以很多人都是刚读了几页就放下了。

虽然入门门槛有些高,但是对于喜欢智力挑战的软件工程师们来说,这就是一个难度稍为有一点高的玩具,所以在小范围群体内,逐渐有一批人开始能够掌控这个玩具,并且可以用它来指导设计能够控制业务复杂性的软件应用出来了。虽然那时候大部分的软件应用都是单体的,但是使用DDD依然可以设计出来容易维护而且快速响应需求变化的单体应用出来。

到了2013年,随着各种分布式的基础设施逐渐成熟,而SOA架构应用在实践中又不是那么顺利,Martin Fowler和James Lewis把当时出现的一种新型分布式架构风潮总结成 微服务架构 。然后微服务这股风就呼呼的吹了起来,这时候软件工程师们发现一个问题,就是虽然指导微服务架构的应用具有什么特征,但是如何把原来的大单体拆分成微服务是完全不知道怎么做了。然后熟悉DDD方法的工程师发现,由于DDD可以有效的从业务视角对软件系统进行拆解,并且DDD特别契合微服务的一个特征:围绕业务能力构建。所以用DDD拆分出来的微服务是比较合理的而且能够实现高内聚低耦合,这样接着微服务DDD迎来了它的第二春。

下面让我们站在软件工程这个大视角看看DDD究竟是在做什么。

从计算机发明以来,人类用过表达世界变化的词有:电子化,信息化,数字化。这些词里面都有一个“化”字,代表着转变,而这些转变就是人类在逐渐的把原来在物理世界中的一个个概念一个个工作,迁移到虚拟的计算机世界。但是在转变的过程中,由于两个世界的底层逻辑以及底层语言不一致,就必须要有一个翻译和设计的过程。这个翻译过程从软件诞生的第一天起就天然存在,而由于有了这个翻译过程,业务和开发之间才总是想两个对立的阶级一样,觉得对方是难以沟通的。

于是乎有些软件工程界的大牛就开始思考,能不能有一种方式来减轻这个翻译过程呢。然后就发明了面向对象语言,开始尝试让计算机世界有物理世界的对象概念。面向对象还不够,这就有了DDD,DDD定义了一些基本概念,然后尝试让业务和开发都能够理解这些概念名词,然后让领域专家使用这些概念名词来描述业务,而由于使用了规定的概念名词,开发就可以很好的理解领域业务,并能够按照领域业务设计的方式进行软件实现。这就是DDD的初衷:让业务架构绑定系统架构。

后来发现这个方法不仅仅可以做好翻译,还可以帮助业务划分领域边界,可以明确哪个领域是自己的核心价值所在,以后应该重点发展哪个领域。甚至可以作为组织进行战略规划的参考。而能够做到这点,其实背后的原因是物理世界和虚拟世界的融合。

上面介绍了使用DDD可以做到绑定业务架构和系统架构,这种绑定对于微服务来说有什么关系呢。所谓的微服务拆分困难,其实根本原因是不知道边界在什么地方。而使用DDD对业务分析的时候,首先会使用聚合这个概念把关联性强的业务概念划分在一个边界下,并限定聚合和聚合之间只能通过聚合根来访问,这是第一层边界。然后在聚合基础之上根据业务相关性,业务变化频率,组织结构等等约束条件来定义限界上下文,这是第二层边界。有了这两层边界作为约束和限制,微服务的边界也就清晰了,拆分微服务也就不再困难了。

而且基于DDD设计的模型中具有边界的最小原子是聚合,聚合和聚合之间由于只通过聚合根进行关联,所以当需要把一个聚合根从一个限界上下文移动到另外一个限界上下文的时候,非常低的移动成本可以很容易地对微服务进行重构,这样我们就不需要再纠结应不应该这样拆分微服务?拆出的微服务太少了以后要再拆分这样的问题了。

所以,经过理论的严密推理和大量实践项目的验证,ThoughtWorks认为DDD是当前软件工程业界设计微服务的最佳实践。虽然学习和使用DDD的成本有点高,但是如果中国的企业想再软件开发这个能力上从冷兵器时代进入热兵器时代,就应该尝试一下DDD了解一下先进的软件工程方法。

面试 - 必知必会的微服务面试题

SOA与微服务的区别?

SOA的提出是在企业计算领域,就是要将紧耦合的系统,划分为面向业务的,粗粒度,松耦合,无状态的服务。服务发布出来供其他服务调用,一组互相依赖的服务就构成了SOA架构下的系统。

基于这些基础的服务,可以将业务过程用类似BPEL流程的方式编排起来,而BPEL反映的是业务处理的过程,这些过程对于业务人员更为直观,调整也比hardcode的代码更容易。

当然企业还需要对服务治理,比如服务注册库,监控管理等。

我们知道企业计算领域,如果不是交易系统的话,并发量都不是很大的,所以大多数情况下,一台服务器就容纳将许许多多的服务,这些服务采用统一的基础设施,可能都运行在一个应用服务器的进程中。虽然说是面向服务了,但还是单一的系统。

而微服务架构大体是从互联网企业兴起的,由于大规模用户,对分布式系统的要求很高,如果像企业计算那样的系统,伸缩就需要多个容纳续续多多的服务的系统实例,前面通过负载均衡使得多个系统成为一个集群。但这是很不方便的,互联网企业迭代的周期很短,一周可能发布一个版本,甚至可能每天一个版本,而不同的子系统的发布周期是不一样的。而且,不同的子系统也不像原来企业计算那样采用集中式的存储,使用昂贵的Oracle存储整个系统的数据,二是使用MongoDB,HBase,Cassandra等NOSQL数据库和Redis,memcache等分布式缓存。那么就倾向采用以子系统为分割,不同的子系统采用自己的架构,那么各个服务运行自己的Web容器中,当需要增加计算能力的时候,只需要增加这个子系统或服务的实例就好了,当升级的时候,可以不影响别的子系统。这种组织方式大体上就被称作微服务架构。

微服务与SOA相比,更强调分布式系统的特性,比如横向伸缩性,服务发现,负载均衡,故障转移,高可用。互联网开发对服务治理提出了更多的要求,比如多版本,比如灰度升级,比如服务降级,比如分布式跟踪,这些都是在SOA实践中重视不够的。

Docker容器技术的出现,为微服务提供了更便利的条件,比如更小的部署单元,每个服务可以通过类似Node.js或Spring Boot的技术跑在自己的进程中。可能在几十台计算机中运行成千上万个Docker容器,每个容器都运行着服务的一个实例。随时可以增加某个服务的实例数,或者某个实例崩溃后,在其他的计算机上再创建该服务的新的实例。

如何拆分服务?

要围绕业务模块进行拆分,拆分粒度应该保证微服务具有业务的独立性与完整性,尽可能少的存在服务依赖,链式调用。但是,在实际开发过程中,有的时候单体架构更加适合当前的项目。实际上,微服务的设计并不是一蹴而就的,它是一个设计与反馈过程。因此,我们在设计之初可以将服务的粒度设计的大一些,并考虑其可扩展性,随着业务的发展,进行动态地拆分也是一个不错的选择。

REST的名称"表现层状态转化"中,省略了主语。"表现层"其实指的是"资源"(Resources)的"表现层"。

所谓"资源",就是网络上的一个实体,或者说是网络上的一个具体信息。它可以是一段文本、一张图片、一首歌曲、一种服务,总之就是一个具体的实在。你可以用一个URI(统一资源定位符)指向它,每种资源对应一个特定的URI。要获取这个资源,访问它的URI就可以,因此URI就成了每一个资源的地址或独一无二的识别符。

客户端用到的手段,只能是HTTP协议。具体来说,就是HTTP协议里面,四个表示操作方式的动词微服务网关原子性:GET、POST、PUT、DELETE。它们分别对应四种基本操作:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源。

实际上呢,不是所有的东西都是“资源”,尤其是在业务系统中,缺点如下:

有个接口是更新订单状态,你是用上面的GET POST PUT DELETE 哪个呢,看样子应该是PUT,但是路径呢PUT /tickets/12

我有时候多个接口 ,更新订单收款状态,更新订单支款状态,更新订单结算状态微服务网关原子性

Restful 的路径明显不友好不够用;

再比如,批量删除,DELETE还好用么,DELETE /tickets/12 #删除ticekt 12 这种形式如果要传数组怎么办,url是不是不够友好?

再比如,Resuful要求 GET /tickets # 获取ticket列表 。我们曾经有个需求,对方会把不超过1000个订单id传给我们,我们系统过滤其中一部分特殊订单;这也是个查询服务,用GET /tickets # 获取ticket列表的形式,1000个订单id显然是超过GET url长度的,这里也不合适;再者,我想开发多个条件查询列表服务,路径这么浅显然不合适;

实际业务中,我们webapi的路径是这样的:systemAlias/controller/action

总结下规则:

简单查询尽量用GET,好处是可以直接带查询参数copy api路径;

复杂查询和更新用POST,用的最多;

不用PUT和DELETE,原因是增加复杂度,并没有带来什么好处

看看BAT的很多openapi,也是写着restful,实际没有严格遵守,都是get和post,这是也很多人不知道put和delete的原因

如:

//根据订单id获取订单

GET oms/order/queryOrderById?id=value1param2=value2

//根据订单id List获取订单

POST oms/order/queryOrderByIdList

//根据条件查询订单,带分页参数

POST oms/order/queryOrderByCondition

//更新订单收款状态

POST oms/order/updateOrderCollectionStatus

//批量更新订单收款状态

POST oms/order/updateOrderCollectionStatusInBatch

//批量更新订单收款状态

POST oms/order/updateOrderCollectionStatusInBatch

//批量删除订单,带操作来源

POST oms/order/deleteOrderInBatch

微服务如何进行数据库管理?

CAP 原理(CAP Theorem)

在足球比赛里,一个球员在一场比赛中进三个球,称之为帽子戏法(Hat-trick)。在分布式数据系统中,也有一个帽子原理(CAP Theorem),不过此帽子非彼帽子。CAP 原理中,有三个要素:

CAP 原理指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。

因此在进行分布式架构设计时,必须做出取舍。而对于分布式数据系统,分区容忍性是基本要求 ,否则就失去了价值,因此设计分布式数据系统,就是在一致性和可用性之间取一个平衡。

对于大多数 WEB 应用,其实并不需要强一致性,因此牺牲一致性而换取高可用性,是目前多数分布式数据库产品的方向。

当然,牺牲一致性,并不是完全不管数据的一致性,否则数据是混乱的,那么系统可用性再高分布式再好也没有了价值。

牺牲一致性,只是不再要求关系型数 据库中的强一致性,而是只要系统能达到最终一致性即可,考虑到客户体验,这个最终一致的时间窗口,要尽可能的对用户透明,也就是需要保障“用户感知到的一致性”。

通常是通过数据的多份异步复制来实现系统的高可用和数据的最终一致性的,“用户感知到的一致性”的时间窗口则 取决于数据复制到一致状态的时间。

最终一致性(eventually consistent)

对于一致性,可以分为从客户端和服务端两个不同的视角。

从客户端来看,一致性主要指的是多并发访问时更新过的数据如何获取的问题。

从服务端来看,则是更新如何复制分布到整个系统,以保证数据最终一致。

一致性是因为有并发读写才有的问题,因此在理解一致性的问题时,一定要注意结合考虑并发读写的场景。

从客户端角度,多进程并发访问时,更新过的数据在不同进程如何获取的不同策略,决定了不同的一致性。

对于关系型数据库,要求更新过的数据能被后续的 访问都能看到,这是强一致性 ;如果能容忍后续的部分或者全部访问不到,则是弱一致性 ; 如果经过一段时间后要求能访问到更新后的数据,则是最终一致性。

从服务端角度,如何尽快将更新后的数据分布到整个系统,降低达到最终一致性的时间窗口,是提高系统的可用度和用户体验非常重要的方面。

那么问题来了,如何实现数据的最终一致性呢?答案就在事件驱动架构。

最佳解决办法是采用事件驱动架构。其中碰到的一个挑战是如何原子性的更新状态和发布事件。有几种方法可以解决此问题,包括将数据库视为消息队列和事件源等。

从目前技术应用范围和成熟度看,推荐使用第一种方式(本地事务发布事件),来实现事件投递原子化,即可靠事件投递。

SpringCloud和Dubbo有哪些区别?

总体来说,两者各有优势。虽说后者服务调用的功能,但也避免了上面提到的原生RPC带来的问题。而且REST相比RPC更为灵活,服务提供方和调用方的依赖只依靠一纸契约,不存在代码级别的依赖,这在强调快速演化的微服务环境下,显得更加合适。

品牌机与组装机的区别:很明显SpringCloud比dubbo的功能更强大,覆盖面更广,而且能够与SpringFramework、SpringBoot、SpringData、SpringBatch等其他Spring项目完美融合,这些对于微服务至关重要。使用Dubbo构建的微服务架构就像组装电脑、各环节我们选择自由度高,但是最总可能会因为内存质量而影响整体,但对于高手这也就不是问题。而SpringCloud就像品牌机,在Spring Source的整合下,做了大量的兼容性测试,保证了机器拥有更高的稳定性。

在面临微服务基础框架选型时Dubbo与SpringCloud只能二选一。

中台建设需不需要审批中心

开宗明义:要建设中台,需要考虑组织、支撑技术、方法论这三个方面,往往还需要咨询服务。
中台作为一种有业务属性的共性能力,首先就需要一个懂业务、承担业务职责的专职的组织机构来负责。要不要建中台,首先要看领导有没有魄力去整合建立一个中台组织。因为原来的平台部通常不懂业务,懂业务的人各自分散在前台业务部门,所以建立中台组织往往涉及人员、组织架构和部门职责的调整。正因为如此,中台的建设往往需要作为一把手工程才能成功。
中台组织关键要懂业务和承担业务职责。举个例子,一个大数据平台的建设运维团队不是一个中台组织。一个团队如果做了非常完善的中台产品(如开发了数据中台所需要的指标管理系统、数据仓库开发系统、数据质量管理系统等等),但只是把产品提供给业务方使用,这个团队仍然不能说是中台组织。只有当这个团队承担起指标体系的建设和管理、数据仓库的设计和实施、数据质量的保障等工作时,才可以说是中台组织。而要做到这一点,这个组织肯定是比较了解业务的,它的目标和考核也一定与业务有相关性(肯定不只是平台稳定性这样的非业务指标)。
中台组织的层次与中台的层次最好是对应的,BU级的中台组织最好直接向BU老大或分管的CXO汇报,企业的中台组织最好直接向CEO或分管的CXO汇报。
这里特别说明一点的是如果不建设在线业务中台,而只是采用微服务、云原生等技术的话,可以不涉及组织方面的大规模变动,就在原来的研发部实现转型。通常来说也可以实现一定的系统可用率、弹性和研发效率方面的提升。
中台建设的支撑技术
建设中台一般需要一套支撑技术。
一、在线业务中台支撑技术
建设在线业务中台一般需要云原生、DevOps、微服务技术体系的支撑,这是因为:
微服务技术:中台是一个独立的组织负责并为多个前台业务服务,因此需要一个标准的服务接口、成熟的服务治理能力和高效的敏捷研发技术。在当前的技术环境下,采用地球人都熟悉的REST风格的同步API、消息队列异步通信作为标准的服务接口技术,采用服务框架(如Spring Cloud等)、API网关、APM等作为标准的服务治理和敏捷研发技术是最合适的选择。不再建议采用传统的基于ESB的服务化(SOA)技术,因为ESB产品过多的介入到业务逻辑中,导致前台业务的变更往往需要中台团队的配合才能完成,这样就失去了建设好中台,支撑前台高效创新的意义。此外,中心化的ESB软件和复杂的基于XML的WS-xxx等协议也影响到系统的可用性和性能。可以参见Martin Fowler在P of EAA中的评价,Web Services是应用集成而非应用开发的技术。
DevOps技术:如果不通过DevOps使得各微服务都能自助式的部署更新,则微服务带来的敏捷性就无从发挥,反而因为服务数量的增加导致研发效率的下降,因此持续集成、持续发布等DevOps技术一般是实现微服务的必备。
云原生技术:微服务和DevOps要求底层的基础设施是灵活可编程的,否则根据Amdahl定律,只要有一个必须的环节是低效的,整体的效能也提不上去。
需要强调的是中台要敏捷,这一方面是因为中台具备业务属性,且支撑了非常丰富的前台业务,前台业务的敏捷性要求有一部分就会传导的中台层;另一方面是中台的重要性使得其需要持续不断的优化,即便对外提供的服务不变,内部实现也会经常变。
分布式事务技术:实施微服务拆分后,复杂的业务流程不再能通过数据库的事务机制来实现ACID特性,为此还需要服务层面的分布式事务处理技术。典型的分布式事务处理模型包括TCC、Saga、FMT等。其中TCC和Saga需要各服务实现定制化回滚逻辑,侵入性比较严重,用起来门槛比较高。FMT模式对于Java可以做到加一行注解(如@GlobalTransaction)即可实现分布式事务,剩下的由框架自动处理,用起来方便的多。Saga模式是Princeton的两位研究者在1987年提出的,灵活性和并发度最好,但需要通过语义锁等精细的设计才能发挥出来。
由此可见,在线业务中台的技术支撑体系是相当复杂的,所幸的是Netflix、Google等世界领先的互联网企业由于自身业务需要打造了很多实用的技术模块,开源社区也贡献了不少力量,CNCF组织又做了很好的汇集和标准化。通过将相关技术加以整合,已经有了不错的产品可用,如网易轻舟微服务就是一套产品化设计良好、功能丰富的在线业务中台支撑技术产品。
一般而言,前台也会和在线业务中台一样采用云原生等同样的技术体系,这是因为前台更需要敏捷性。在完善的中台支撑之下,前台会比较轻,还可以考虑采用FaaS Serverless技术,不过目前这方面的实践还不多(特别在中国),相关的支撑技术也不是很成熟。
二、数据中台支撑技术
建设数据中台一般需要一整套如下典型的支撑技术:
指标管理系统:指标是中台与前台之间最关键的接口,也是建设数据中台的牛鼻子,因为它是最核心的业务语言,且指标不一致、数据常出错是建设数据中台最常见的出发点。如果指标体系没有统一的方法论,进行统一建设,那么就很难说是数据中台。指标管理系统一般要实现一套一致的方法论(如原子 / 派生 / 复合指标、维度、修饰词等),做好指标的业务和技术口径管理,还需要支持指标的审批管理。数据中台的指标无法交给各前台业务自助式的建设。
数据服务系统:类似于在线业务中台需要通过API网关提供标准化的服务,数据中台也需要一个标准化的服务方式,通常称为数据服务系统,也可以说是数据网关或数据门户。类似于别的网关类产品,数据服务系统需要提供鉴权、日志审计、流控、协议转换(如SQL Dialect之间的转换)等功能,也应该发展多引擎融合查询、逻辑模型等扩展功能以提高服务接口的稳定性和实现的灵活性。
元数据管理系统:元数据管理是整个数据中台的基础和中心,所有的其他系统都依赖元数据管理。元数据管理首先要做好的当然是数据模式或目录(catalog)的管理,至少要知道中台里都有什么数据。对复杂的数据中台来说,数据血缘也很重要。没有血缘信息,不知道数据间的依赖关系,数据质量肯定管不好,因为不知道一个数据的质量问题怎么来,又进而会影响什么。同样的如果没有血缘,数据资产也肯定管不好,因为不知道什么数据有价值什么没价值,这就像如果你不知道一个函数被谁调用,你就不知道它是不是死代码一样。元数据管理系统往往也需要提供一个基础的访问界面,通常称之为数据地图。
数据仓库开发与管理系统:除了指标管理,数据仓库的开发是将一大堆初始数据建设梳理成一个漂亮的数据中台的核心过程。一般来讲数据中台更适合用Kimball的维度建模方法而非数据仓库之父Bill Inmon所提倡的方法,这是因为Inmon强调顶层设计,而Kimball强调至下而上。如果要建设数据中台,肯定是因为前台业务复杂多变,这时强调顶层设计会导致中台建设缓慢、僵化。因为中台虽然应该是由组织高层决策,但目的却是为了支持前台业务,而不是为了控制。支持而不是控制,这一点绝不能本末倒置。
数据质量管理系统:所有复杂的系统都需要专业的质量管理,在线业务系统有一系列的弹力设计和APM等监控运维工具,数据中台也需要专业的质量管理。数据质量管理系统通常设计为支持丰富的稽核 / 校验 / 比对规则,监控数据是否准确、实时、一致,还要做到及时的报警,分析影响面,提供快速修复的手段等。但这些手段只能发现和补救问题,不能预防问题,要预防问题,还要通过测试工具减少代码bug、通过资源弹性应对性能波动、通过优先级调度优先满足重要业务需求等。相对来说,当前数据中台领域的质量管理没有在线业务领域的成熟,如在线业务领域的测试手段远比数据领域的精细,在线业务领域很常见的熔断、限流、服务降级等模式在数据领域都没有成熟的实践方法(优先级调度可以说是实现了部分的服务降级功能),随着数据中台越来越广泛和重要,这些技术应该也需要持续发展,但技术上的挑战不小。
数据安全管理系统:数据中台因为汇集了组织所有有价值的数据资产,因此良好的安全管理是必须的。细粒度的权限和审计是基础,一般的还需要隐私 / 敏感数据的脱敏处理、数据加密(特别是将数据托管在第三方平台之上时)、数据泄漏防护(比方说一种常见的方法是限制将数据下载到本地的数据量)等技术。发展到高级阶段甚至可能还需要联邦学习、数据沙盒等技术。
数据资产管理系统:在数据质量和安全单列的情况下,数据资产管理主要负责的是数据的生命周期管理、成本的统计分析与优化等工作。
同时,数据中台还需要强大的大数据计算引擎、数据集成 / 同步 / 交换引擎,还往往需要一套敏捷BI系统:
大数据计算引擎:数据中台要管理的数据规模和复杂度往往都很高(否则搞中台属于为赋新词强说愁),所以传统的数据库和数据仓库基本上支撑不了。当前的技术环境下,基于Hadoop MapReduce或Spark几乎是唯二的选择,当然这也包括了这两者之上的Hive和Spark SQL。能用SQL就用SQL,易于维护,也易于数据血缘的收集。除此之外,流处理可能还需要Flink,交互式查询可能要引入Impala或GreenPlum。
数据集成 / 同步 / 交换引擎:一方面数据中台需要强大的数据集成和同步能力才能吸纳各方数据。集成和同步的概念相近,同步更强调实时性。另一方面,数据中台往往由多种数据计算引擎构成,就需要同步或交换引擎实现不同引擎见的数据交换。
敏捷BI系统:建设数据中台通常最重要的目的是为了支持业务运营和决策,为此需要基于数据中台进一步开发数据产品。敏捷BI系统是开发数据产品快速、轻型的手段,能够尽快尽早的发挥数据中台的价值。
此外,对于互联网业务,统一的埋点引擎往往也是数据中台所需要的。如果埋点的逻辑都不统一的话,建数据中台的时候会发现数据的源头就是乱的,后续也都没法做。其他行业业务,数据采集也属于基础工作,也是要先做好的。
由此可见,建设数据中台需要的技术支撑体系也是相当的庞大,复杂。所幸的是这十年来Google等领先的企业、Hadoop / Spark等开源社区以及大量的厂商大致联合探索出了一条可行的路径,方法论和技术路线都比较统一了。以此为基础,就可以提供较成熟的数据中台技术支撑产品,如网易杭研研发的“网易猛犸V6.0 + 网易有数”就是一套较完整的数据中台产品。 关于微服务网关原子性和微服务 api网关的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。 微服务网关原子性的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于微服务 api网关、微服务网关原子性的信息别忘了在本站进行查找喔。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:在Eclipse安装Spring boot插件的步骤(图文)
下一篇:目前主流的接口测试工具(常用的接口测试工具)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~