为什么80%的码农都做不了架构师?>>>   

通常情况下业务都是由简至繁,导致系统也会由单个拆分成多个独立的服务,从而带来分布式环境下数据一致性问题。

业务场景:比如有一个业务操作,同时调用服务A、B、C,需要满足要么同时成功,要么同时失败。A、B、C服务分别由不同部门开发,不同数据库存储,同时部署在不同远程服务器上。

在分布式系统中,如果不想牺牲一致性,CAP理论告诉我们最多实现其中2点,因为需要牺牲可用性,这显然是不能接受的。下面先简单介绍下数据一致性基础理论。

强一致性

当更新完成之后,任何多个后续进程或者线程的访问都会返回最新的更新过的值。这种是对用户最友好的。

弱一致性

系统并不保证后续进程或线程的访问都会返回最新更新过的值。系统在数据写入成功之后,不承诺立即可以读到最新写入的值,也不会具体的承诺多久之后可以读到。

最终一致性 

弱一致性的特定形式。系统在保证没有后续更新的情况下,系统最终返回上一次更新的值。在没有故障发生的前提下,不一致

在实践上,为了保障系统的可用性,大多会将强一致性需求转化为最终一致性,并通过系统执行幂等性的保证,保证数据最终一致性。下面分享下一些解决方案 。

1.规避分布式业务——业务整合

业务整合方案主要采用将接口整合到本地执行的方法。比如可以将服务A、B、C整合为一个服务D给业务,服务D再通过转换为本地事务的方式。

优点:规避了分布式事务。缺点:把本来拆分好的业务又耦合到一起,业务职责不清晰,不利于维护。

2.消息日志的方式

此方案的核心是将需要分布式处理的任务通过消息日志的方式来异步执行。消息日志可以存储到本地文本、数据库或消息队列,再通过业务规则自动或人工发起重试。人工重试更多的是应用于支付场景,通过对账系统对事后问题的处理。

消息日志方案的核心是保证服务接口的幂等性。

考虑到网络通讯失败,数据丢包等问题,如果服务接口不能保证幂等行,数据唯一性将很难得到保证。

BASE(basically available, soft state, eventually consistent):一种ACID的替代方案。

BASE的可用性是通过支持局部故障而不是全局故障来实现的。如果将分区在5个数据库服务器上,BASE设计鼓励类似的处理方式,一个用户数据库的故障只影响这台特定主机那20%的用户。

一个最常见的场景,如果发生一笔交易,需要在交易表中增加记录,同时还要修改用户表的金额。这两个表属于不同的远程服务,所以就涉及到分布式事务一致性问题。

一个不错的解决方法,将主要修改操作以及更新用户表消息放在一个本地事务中来完成。同时为了避免重复消费用户表消息带来的问题,达到多次重试的幂等性,增加一个更新记录表track_msg来记录已经处理过的消息。

基于上面讲的,在第一阶段,通过本地的数据库的事务保障,增加了transaction表及消息队列。

在第二阶段,分别读出消息队列,通过判断更新记录表track_msg来检测相关记录是否被执行,未被执行的记录会修改user表信息,然后增加一条记录到track_msg,事务执行成功后再删除队列,从而达到分布式数据最终一致性。

尽量将分布式事务转换为多个本地事务,通过消息、重试等方式达到最终一致性。

分布式服务对衍生的配套系统要求比较多,特别是我们基于消息、日志的最终一致性方案,需要考虑消息的积压、消费情况、监控、报警等。

转载于:https://my.oschina.net/nbspjj/blog/738285

分布式系统下数据一致性相关推荐

  1. 关于分布式系统的数据一致性问题(一)

    最近写了一个关于 铁道部购票系统的若干文章 铁道部新客票系统的设计(一) 铁道部新客票系统的设计(二) 铁道部新客票系统的设计(三) 正好遇到一个博友,咨询了一个问题,这个问题正好可以作为分布式系统的 ...

  2. 干货 | 解决分布式场景下数据一致性问题,我有办法!

    此次分享的缘由 支付重构 考虑支付重构的时候,自然想到原本属于一个本地事务中的处理,现在要跨应用了要怎么处理.拿充值订单举个栗子吧,假设:原本订单模块和账户模块是放在一起的,现在需要做服务拆分,拆分成 ...

  3. 关于分布式系统的数据一致性问题(三)

    在我的博文里面 关于分布式系统的数据一致性问题(二) 里面主要介绍了数据分布的情况下保证一致性的情况,在第二篇文章里面,我这里提出了三个问题 订单系统调用支付系统支付订单,支付成功,但是返回给订单系统 ...

  4. sqlserver检测到基于一致性的逻辑_面试官;解决分布式场景下数据一致性问题

    在这一篇中主要回答目前分布式事务问题是怎么解决的?行业中有什么解决方案?这些解决方案分别有什么优缺点?别人是怎么做的?我们可以怎么来做? 支付重构 考虑支付重构的时候,自然想到原本属于一个本地事务中的 ...

  5. 不懂这些高并发分布式架构、分布式系统的数据一致性解决方案,你如何能找到高新互联网工作呢?强势解析eBay BASE模式、去哪儿及蘑菇街分布式架构...

    互联网行业是大势所趋,从招聘工资水平即可看出,那么如何提升自我技能,满足互联网行业技能要求?需要以目标为导向,进行技能提升,本文主要针对高并发分布式系统设计.架构(数据一致性)做了分析,祝各位早日走上 ...

  6. 面试精讲之面试考点及大厂真题 - 分布式专栏 23 分布式系统下分布式锁的实现

    23 分布式系统下分布式锁的实现 困难只能吓倒懦夫懒汉,而胜利永远属于敢于等科学高峰的人. --茅以升 引言 锁是开发过程中十分常见的工具,你一定不陌生,悲观锁,乐观锁,排它锁,公平锁,非公平锁等等, ...

  7. 面试精讲之面试考点及大厂真题 - 分布式专栏 22 分布式系统下调用链追踪技术

    22 分布式系统下调用链追踪技术 我们有力的道德就是通过奋斗取得物质上的成功:这种道德既适用于国家,也适用于个人. --罗素 引言 一个复杂的分布式系统,用户发起一个请求,这个请求可能调用几十到几百个 ...

  8. 分布式场景下数据一致性的问题——【分布式锁】 Java常用技术方案

    2019独角兽企业重金招聘Python工程师标准>>> 前言: 由于在平时的工作中,线上服务器是分布式多台部署的,经常会面临解决分布式场景下数据一致性的问题,那么就要利用分布式锁来解 ...

  9. 分布式系统下的认证与授权

    在软件系统设计中,如何让应用能够在各种环境中安全高效的访问是个复杂的问题,这个问题的背后是一系列软件设计时需要考虑的架构安全问题:架构安全性 | 凤凰架构 认证:系统如何识别合法用户,也就是解决 你是 ...

  10. 浅析分布式主从架构下数据一致性问题

    主从架构 常见的主从架构,即为一主多从,常见的读写策略为写主读从,并由主节点写日志并通过网络传输来维护从节点的数据库状态,但是这个常见的策略会产生一系列的分布式数据一致性问题. 通常我们使用主从架构, ...

最新文章

  1. Linux系统及编程期末试题,《LINUX系统及其编程》考试试题及答案.doc
  2. java exec 空格_java exec 空格及特殊符号处理的解决方案
  3. 康奈尔大学王飞博士:AI处理医疗数据面临的8大挑战
  4. HDU5726 线段树求解区间GCD
  5. Java黑皮书课后题第10章:*10.15(几何:边框)边框是指包围一个二维平面上点集的最小矩形,编写一个方法,为二维平面上一系列点返回一个边框
  6. 【计算机网络】计算机网络体系结构
  7. Qt下QTableWidget的使用
  8. emWin智能家居主界面设计,含uCOS-III和FreeRTOS两个版本
  9. 华文行楷字帖欣赏_田英章硬笔行书字帖欣赏,600个行书笔法演示,写好字的首选帖...
  10. 「 iOS知识小集 」2018 · 第 38 期
  11. (第九章)多表查询之all,any
  12. mysql long varchar2_案例:Oracle数据库long查询结果转换为varchar2类型方法的操作步骤...
  13. linux 删除文件 例外,linux 删除文件,某个文件例外
  14. 简单的路由封装ppp
  15. [转]vc6.0安装boost1.34.1
  16. poj 2018 Best Cow Fences 二分查找dp
  17. USACO Section 1.3 Prime Cryptarithm 解题报告
  18. keil中 code、data、idata的区别
  19. linux/centos shell脚本中非交互式修改密码
  20. VS配置OpenCV教程(超详细)

热门文章

  1. 常用App用户体验找茬
  2. 利用网络媒体搭建自己就业之“桥”——卖糖葫芦北大毕业生谋职报道带来的启示...
  3. 120 Python程序中的线程操作-队列
  4. vs2015环境搭建与简单程序测试
  5. 看清贬值的真实情况再惊恐
  6. Android 逐帧动画isRunning 一直返回true的问题
  7. 展示全面快速响应能力 华为全线解决方案亮相北京国际通信展
  8. android平板电脑维修电路图,《图解windows10平板电脑电路原理和维修》大家可以读读看看...
  9. panel items 添加指定位置_通过gitlab-ci自动添加prometheus业务监控
  10. python变量赋值方式_【Python入门学习】详谈python变量和变量赋值语句