首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >华为资深架构师:Cloud Native架构一致性问题及解决方案

华为资深架构师:Cloud Native架构一致性问题及解决方案

作者头像
IT大咖说
发布2018-06-04 15:48:30
8280
发布2018-06-04 15:48:30
举报
文章被收录于专栏:IT大咖说IT大咖说IT大咖说

内容来源:2017年12月2日,华为资深架构师王启军在“NJSD互联网架构峰会”进行《Cloud Native架构一致性问题及解决方案》演讲分享。IT 大咖说(微信id:itdakashuo)作为独家视频合作方,经主办方和讲者审阅授权发布。

阅读字数:2092 | 6分钟阅读

摘要

在开发或软件架构的过程中,经常会遇到一致性的问题,那么如何去解决权衡。我们先从理论入手,然后进一步讨论强一致性和最终一致性的解决方案。

嘉宾演讲视频及PPT回顾:http://suo.im/tPQXc

基础理论

Cloud Native的组成

关于这个概念很多人都有不同的看法,我认为Cloud Native主要是由架构、组织、工程三部分组成的。大部分公司可能主要是关注架构部分,其实组织方面也是非常重要的,它的价值在于能够实现更快的速度、更好的用户交互体验以及更稳当的系统。

Cloud Native-架构

Cloud Native架构主要包含两部分,一个是基础设施这块,另一个是微服务架构方面。围绕着微服务又扩展出了可用性、一致性以及扩展性部分。

一致性的分类

在学术界一般将一致性分为两类,一类是以数据为中心,一类以用户为中心。以数据为中心的,无论有多少个节点都是从整体上来看一致性。而以用户为中心,是从客户端的节点来看待一致性的。

严格一致性

严格一致性要求任何写操作都能立刻同步到其他所有进程,任何读操作都能读取到最新的修改。比如说有三个节点,当某一个节点的数据a变成1的时候,另外两个节点的a就需要同步改变。

顺序一致性

严格一致性需要有一个全局时钟才能实现,但是这个全局时钟是很难实现的。于是顺序一致性放弃了它,转而改用分布式逻辑时钟来实现。

顺序一致性是指所有的进程以相同的顺序看到所有的修改,读操作未必能及时得到此前其他进程对同一数据的写更新,但是每个进程读到的该数据的不同值得顺序是一致的。

因果一致性

因果一致性是一种弱化的顺序一致性,如果两个数据之间存在因果关系,那么在后续的所有操作都应该基于这一关系。所有的进程必须以相同的顺序看到具有潜在因果关系的写操作。不同进程可以以不同的顺序看到并发的写操作。

如何实现强一致性

两阶段提交

提到强一致性,相信大家首先想到的就是两阶段提交。也就是整个交互过程分为两个阶段。第一阶段协调者先向参与者提问是否可以提交,同时锁定数据,第二阶段参与者提交。

这里面存在几个问题,第一阶段锁定数据之后,如果协调者挂掉了,将没有角色去通知参与者是否应该提交,这个数据会被一致锁定。如果第二阶段参与者1提交成功,参与者2提交失败,此时协调者不知道该如何处理,因为参与者1已经提交成功,外部可以访问了。

三阶段提交

三阶段提交其实是把两阶段提交的第一阶段分为了两个阶段,这是为了降低原来第一阶段的死锁的概率。三阶段的第一阶段在询问是否提交的时候并没有锁定数据,而是在准备提交的时候才锁定数据。

实际上使用三阶段提交,性能上会有更多的消耗,交互会越来越多,可扩展性也很差。

如何实现最终一致性

调试失败怎么办

假设有一个服务M需要去调用另外的两个服务A、B,在调用的过程中失败了话,最常见的做法就是重试。这时就需要去考虑重试的次数、超时时间、间隔时间以及间隔时间的衰减度,而重试没有做好的话就很容易造成系统的负担。

改进方案

其实完全可以添加一个日志,并且可以收集到远端。通过收集系统收集到分布式文件系统内,这样就可以不断的去检测这个系统是否有问题。

还有一种解决方案——可靠事件,服务在调用失败后,通过另一种方式将数据传输到消息队列,然后要被调用的服务去读取消息队列。

对于最终一致性来说,要么全部成功,要么全部失败。

如何保证写后读一致

这需要在写消息的同时,去写一个事件日志。如果一旦失败的可以通过补偿服务不断的遍历事件的这张表,最终拿到消息再去发送时间

长事务一致性

Sage事务模型

Sgae是一个比较早期的事务模型,它的核心思想是将一个长事务拆分为多个本地事务。而process manageer就是负责处理事务拆封的,然后再去调用不同的服务。

这是一个具体的事务处理流程,这里面需要定时的去做检查判断是否失败,失败了就要发送消息,正向调用时写回退日志。

TCC

在做系统的时候你会发现服务是很容易的去扩展的,数据库往往会出现瓶颈,那么如何去平衡压力,有很多的解决方案,TCC就是其中的一种。

TCC的优势在于将数据库的操作,放到业务层处理,平衡了数据库的压力。但同时也付出了一定代价,它增加了业务的复杂度,需要提供相应的Try、Confirm、Cancel接口,而且接口还是幂等性的。

如何保障幂等

第一种就是通过数据加锁的方式,第二种是分布式锁,不过这种锁不能保障绝对一致性,第三种方案可以去做唯一约束,在唯一约束无效的情况下可以增加流水表这也是第四种方案。

今天的分享就到这里,喜欢本次分享请给我点赞~谢谢大家!有什么问题可以在评论区讨论。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-04-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT大咖说 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档