分布式系统事务随笔。

刚做后端大概10个月,从游戏前端开发转向后端,看似熟悉的编程语言,在不同的领域内实际上要考虑的事情也是全然不同的。

当我们谈论后端开发,自然而然联想到,后端是服务于前端的,也是承载、服务于业务的一个重要组成部分。系统的稳定性,正确性以及可用性都是需要考虑的问题。

做后端,说简单也简单,说难也很难,简单是因为你只需要对数据进行增删查改,聚合统计就完事了,说难是因为一旦涉及到可用性,必然离不开分布式,然而我们知道,由分布式而引出的一系列问题才是最为棘手的,更不用说系统安全、部署、监控等一些列的落地措施。

你需要确保多个系统的业务数据不混乱,在某些跨服务功能的调用链中保持一致性,当某一个服务调用失败之后进行重试或者回滚。

重试需要你的服务具备幂等性,也就是说,当引入重试机制之后,你需要确保一个服务在同一个业务上下文中多次调用而不会产生额外的影响,例如银行转账,如果多扣几次钱或者多加了几次钱对于公司的业务以及信誉来说都是无法接受的,解决这个问题的办法需要引入类似流水号的关联标识,在不同的服务里面形成一个标识上下文。

当我们的整个后端系统根据业务领域分割为不同的服务独立成型时,多个服务之间相互调用往往会因为网络原因而失败。硬件损坏、宕机、自然灾害等一些列不可抗力因素告诉我们,任何事情都有可能失败,当你的系统规模超过阈值之后,偶然将会转变为必然。我们要的做的,不应该是想出一个万全之策强力约束保证我们的系统一定会成功,或者怀着侥幸的心理上线然后惶惶不安的等待系统出现问题。反而更应该思考一下,当系统出现问题之后,如何快速有效的修复失败所带来的影响。因为我们知道,既然我们无法保证100%成功,那唯一的出路便想出一个补救措施来预防失败,这往往会更令人更有安全感。

在讨论如何解决分布式一致性之前,我们更应该反过头来看一下,什么是事务,它在单机模式下是如何保证业务的原子性的。我们往往将业务事务和数据库的事务混为一谈,通常来说这是没问题的,因为后端做的不就是数据的存储么。但当我们把这两个进行区分的时候,会发现大多数的时候,我们所说的事务,仅仅是通过数据库提供的ACID来实现的。当你要对数据库的多个表进行操作的时候,打开一个事务,并且进行相应的更新,然后提交事务,此时要么成功,要么回滚撤销变更,通过数据库提供的ACID保证我们的数据不会因为受到中断的影响而产生混乱。

但如果我们分布式之后呢?每一个业务子系统拥有自己的数据库,你如何保证一个业务流程,在跨子系统调用时保证原子性呢?

如果我们把希望继续寄托于数据库,多个业务子系统使用同一个数据库,数据库本身将会成为瓶颈,这样便失去了一开始设计分布式系统的初衷。

如果某一个子系统失败之后,造成了数据的不一致,此时,要么回滚之前的操作,要么就想办法让这个失败的调用变为成功。

A作为业务发起者调用B和C,B成功,C失败,A知道C失败之后该怎么做呢?是重新调用一次C还是通知B回滚呢?如果通知B回滚的时候也失败了呢?

答案往往是不统一的,每一个业务领域都有根据自身情况进行处理的方式。有很多分布式事务协议能够解决些许问题,但是这往往会造成复杂度的提升,导致将来的维护以及拓展变得举步维艰。

CAP定理相信大家都有了解,在任何时候我们要么取CP要么取AP,CP的问题在于复杂、可用性以及可维护性差,AP的问题在于一定的时间内,数据会存在不一致性。如果选择CP,是时候考虑一下业务的分割是否合理,只有极少的情况我们才需要保证强一致性。

我们需要一种更为聪明的方法,一种机制来保证我们的系统能够达成最终一致性,这才是分布式系统需要解决问题的根本之道,并且已经有很多模式方法来帮助我们达成我们想要的结果。

换一个角度来讲,分布式事务,本身就是一个伪命题,因为系统是脆弱的,有太多太多的因素会造成事情不可控。

我们要做对的事情,让系统能够根据业务需求变更逐步演进,形成一个良性循环,根据业务需求、目标领域来设计系统,合理的进行分割才是王道。

如果你的系统本身不匹配业务领域,而又把不合理、生搬硬套的架构应用于它,就会出现各种各样的问题,这些问题在某些时候甚至是不可能解决的。

在我看来,有关于解决分布式事务的技术,无非是在为糟糕的设计进行弥补,导致系统到最后臃肿不堪。

一件事情,分布式系统在绝大多数时候,反脆弱、最终一致性才是我们真正需要去解决的问题。

PS:你的系统究竟有多大才会导致最终一致性会被人为的察觉出来?但我们知道数据最终将会一致不是吗?:)

时间: 2024-11-03 14:10:57

分布式系统事务随笔。的相关文章

分布式系统事务

丁码农 专注大规模互联网架构... 分布式系统事务 本文首发于InfoQ,版权所有,请勿转载!!! http://www.infoq.com/cn/articles/solution-of-distributed-system-transaction-consistency 开篇 在OLTP系统领域,我们在很多业务场景下都会面临事务一致性方面的需求,例如最经典的Bob给Smith转账的案例.传统的企业开发,系统往往是以单体应用形式存在的,也没有横跨多个数据库.我们通常只需借助开发平台中特有数据访

分布式系统事务 浅析

谈谈本人结合实际,对分布式系统事务的应用与理解.     我们在架构系统时,通常会做N层,分层的意义在于系统结构更清晰,易于维护,易于扩展等.我将拿四层结构举例,谈谈对分布式系统事务的实际应用.     首先,系统四层做如下定义:模型层,数据层,业务层,服务层.     然后,阐述四层的意义:               模型层:作为ORM的Object,不作详细说明               数据层:访问具体DB,实现SQL执行               业务层:实现简单,独立业务    

分布式系统事务一致性

单数据库一致性: 1. 利用事务 分布式系统事务一致性: 1. 本地事务消息队列:两段提交,利用本地事务保证消息的可靠性 生产者: 1). 在数据库(mysql)增加一个消息表,将本地数据修改和消息记录放到同一个事务中,保证同时成功或失败. 2). 本地数据修改成功后,事务提交完毕.producer向MQ发送一个消息,发送成功,更新消息表消息为已读 3). 为避免producer消息发送失败的情况.有一个定时任务,定时查询消息表,将未消费的消息放到MQ的消息队列中 消费者: 1). consum

分布式系统事务一致性解决方案

开篇 在OLTP系统领域,我们在很多业务场景下都会面临事务一致性方面的需求,例如最经典的Bob给Smith转账的案例.传统的企业开发,系统往往是以单体应用形式存在的,也没有横跨多个数据库.我们通常只需借助开发平台中特有数据访问技术和框架(例如Spring.JDBC.ADO.NET),结合关系型数据库自带的事务管理机制来实现事务性的需求.关系型数据库通常具有ACID特性:原子性(Atomicity).一致性(Consistency).隔离性(Isolation).持久性(Durability).

聊聊分布式事务&分布式系统事务一致性解决方案

事务就是一个会话过程中,对上下文的影响是一致的,要么所有的更改都做了,要么所有的更变都撤销掉.就要么生,要么死.没有半死不死的中间不可预期状态. 参考下薛定谔的猫. 事务是为了保障业务数据的完整性和准确性的. 分布式事务,常见的两个处理办法就是两段式提交和补偿. 两段式提交典型的就是XA,有个事务协调器,告诉大家,来都准备好提交,大家回复,都准备好了,然后协调器告诉大家,一起提交,大家都提交了. 补偿比较好理解,先处理业务,然后定时或者回调里,检查状态是不是一致的,如果不一致采用某个策略,强制状

二:分布式系统事务

一:事务--->是由一系列对系统中数据进行访问与更新的操作所组成的一个程序执行逻辑单元.保证数据在业务逻辑上是正确的.--->事务的四大特征:原子性,一致性,隔离性,持久性.简称事务的ACID特性.●原子性        要么全部成功执行,要么全部失败.●一致性        事务的一致性,数据合乎逻辑.只能从一个一致性状态变到另一个一致性状态.不允许出现中间状态的数据.●隔离性        事务的隔离性是指在并发环境中.并发的事务是相互隔离的.一个事务的执行不能被其他事务干扰.即一个事务内

redis事务随笔

最近在研究redis事务一致性的问题,有一点心得,随笔记录下与大家分享. Redis的事务和传统关系数据库的事务并不相同.在关系型数据库中,开始事务用到BEGIN,然后执行相应的操作,最后用户可以选择发送commit来确认之前的操作,也可以发送rollback来放弃之前的修改操作! 当然在Redis中也有简单的事务命令.即使用Multi为开始,之后跟着的命令会被串联,最后以EXEC结束. 但是这种方法有一种问题,就是在EXEC在调用之前不会执行任务实际操作,也就是说我们没有办法读取数据判断执行相

Mysql事务随笔

一.什么是事务 数据库中的概念,按我个人理解:能够保证一组任务全部执行成功或者全部执行失败的这么个机制,叫事务 事务是数据库中重要概念,如果没有这种保障机制,数据库中的数据就是不安全的(就是无法保证数据的正确性) 在数据库中,一组任务,就是放在一起执行的多条sql 二.ACID保证数据安全 所以如何才能保证数据安全呢?前人总结了如下四点 1.原子性,一组任务全部执行成功或者全部执行失败.这是基础,因为我们一组操作一般是有顺序的,有互相依赖关系的,要同步的,不能A表修改了,B表修改失败,这样数据就

分布式系统事务一致性解决方案大对比,谁最好使?

http://mp.weixin.qq.com/s?__biz=MjM5MDE0Mjc4MA==&mid=2650992884&idx=1&sn=17a7e218a5087faf9dac2d369202089f&scene=4&ptlang=2052&ADUIN=1219704545&ADSESSION=1465865470&ADTAG=CLIENT.QQ.5467_.0&ADPUBNO=26567#wechat_redirect