【QCon】精华内容上线92%,全面覆盖“人工智能+”的典型案例!>>> 了解详情
写点什么

分布式系统中的一致性和可用性

  • 2008-08-21
  • 本文字数:2881 字

    阅读完需:约 9 分钟

——QClub 杭州活动(7.26)总结

本文是根据 7 月 26 日 InfoQ 中文站在杭州举行的 QClub 活动(第三期)后半程小组讨论总结而成。主要内容包括如何在 SOA 系统中实现服务编排,如何保证分布式系统中的一致性和可用性,以及如何在实施 SOA 的过程中控制接口的粒度等。活动前半程的嘉宾分享部分,InfoQ 中文站已经通过视频和PPT 演示的形式发布了

如何在SOA 里面实现服务编排?

SOA 系统或产品一般会提供 ESB 这样一个核心服务。在开发过程中,我们自己曾经用过 BEA 的 WebLogic 产品,在它的企业服务总线里面有一个 UDDI,里面注册了很多服务。假设目前有 A,B,C 三种服务,而我们需要用到的一种顺序是 ACB,这就需要在一个调用中把这三个服务串起来。在 ESB 里有一些脚本语言可以把这些服务找出来,然后经过串联形成一个虚拟服务 D。从而通过这样的方式把分离的服务编排成一个相互之间有顺序的,能够完成你实际需要的那么一种服务。另外在 ESB 里面每个服务会有一个事务框架,也就是说每个服务自己是有事务处理。假如要把它们封装到一起形成一个链的话,那么在这个链中任何一个服务的事务失败之后,都会使得整个链中的事务失败,最后回滚到最开始执行的场景,保证整个 D 服务的事务也是完整的。

图 1:演讲嘉宾程立参与分组讨论

如何保证分布式系统中的最终一致性和可用性?

对于本地事务处理,或者是集中式的事务处理系统,很显然我们应该采用已经被时间证明也是很成熟的 ACID(注:Atomic/ 原子性、Consistency/ 一致性、Isolation/ 隔离性和 Durability/ 持久性)模型。它会利用到数据库管理系统和成熟的 JMS 服务器等,用其本身所具有的事务管理功能,来保证程序具有数据库事务处理的这四个特性,对于编程模型来讲,这也是最简单的。但是当我们开发的系统不再是一个简单的集中式系统,比如简单的 MIS(管理信息系统),OA(办公自动化系统)或者是博客系统等,而是类似支付宝或者说 eBay 的 Paypal 支付系统的时候,其访问量特别巨大和系统结构非常复杂的特点,导致它必须具有一个分布式的架构。又因为系统处理的事情特别多,这也需要它具有很长的事务过程;另外最重要的一点是因为涉及到资金的流转,它对安全性的要求非常高,不允许发生资金的错误。

对于这样的分布式系统,组件的分布会导致它调用的成本和时间代价非常高。如果我们采用传统的 ACID 本地事务的话,所出现的情况就是系统可用性和严格一致性之间的冲突。因为当我们要求分布式系统具有严格一致性的时候,可用性就会受到损失,而可用性又是一个不允许我们讨价还价的,比如说像支付宝这样的业务,它就要求服务器一年 365 天 7*24 小时不间断运转。结果就是我们只能在严格一致性上做出让步,这就需要放弃掉传统的,也是最简单的 ACID 模型,而选择 BASE,即基本可用,柔性状态,柔性一致和最终一致等。对一个“基本可用”系统来说,我们需要把系统中的所有功能点进行优先级的划分,像资金划拨这样的功能在一致性上不能做出任何让步,我们可以选择继续使用这样的严格一致性。而例如邮件发送、通知这样的功能,我们可以对系统做一个选择,降低其一致性的特性,使其具有高度可用性。所谓柔性一致就是系统内的状态对用户来说是一个完整的系统,它的一致性是不允许有任何损失的,就是说用户支付了 10 块钱,那么他的帐户上必然是只扣掉了 10 块钱;但是对于系统内部的状态,我们可以采用一种柔性的策略,比如说系统内分布了 ABC 三个功能模块,我们允许它们在某一时刻三个模块的状态可以不一致。我们会通过业务和技术的手段,比如说异步机制或者批处理方式来保证系统通过柔性状态一致来获得可用性。

图 2:QClub 杭州负责人冯大辉现场组织

最终一致性其实也是同样的意思,柔性的状态一致只是说某一些阶段不一致,但最终要求系统必须保持一致,也就是说在用户看来你的系统必须是一致的。所以归根到底,BASE 的实现是放弃掉纯粹的业务手段,而采取技术和业务相结合的机制来保证系统对于外部看来是一个一致的系统。由于采用了这样一个灵活的策略,使得我们同时具有最终的一致性和系统的可用性。

如何在实施 SOA 的过程中控制接口的粒度?

针对在 SOA 中如何控制服务的粒度,以及如何让 SOA 与现有的业务相结合这两个问题,在我们现在行业里没有一个放之四海而皆准的标准。这个东西一定是你在制订 SOA 策略的时候就提前做考虑,通过对现有业务进行抽象,然后定义出来 SOA 系统的接口。在设计这个接口时,我们的原则就是它一定是粗粒度的,不是细粒度的,因为只有粗粒度接口才能够灵活应对我们业务的变化。现在不论是哪一个行业,比如互联网行业和企业管理,它们的业务需求变化都是非常快的。

图 3:活动结束后合影留念

在系统日常的工作中,常会冒出一些新的业务类型,但这些类型在我们做业务抽象的时候并没有出现。如果我们当初定义的这个 SOA 接口粒度非常细的话,那么现在很有可能没有办法处理这样一个新的业务。如果要处理,可能的方法是再投入开发资源去开发一个新的接口,或者在原有接口上再增加新的方法。试想一下,如果现在有一个粗粒度接口,我们就可以把这个新的业务类型包容进来。具体的解决方案是我们可以对外界提供一个粒度很粗的接口,而在我们的系统内部通过很多细粒度接口对它进行支撑。比如说我们现在对外公布一个传递数值的接口,传递过来后,系统返回一个业务操作的具体结果。在这些接口里,假设每一个细粒度接口对应一个业务分支,那么当出现新的业务类型时,因为我们当初定义接口的时候赋予它一定的扩展性,所以能够很容易地更新变化的数据。可以预见的结果是,当有了新的业务类型,我们也不用再担心,只需要再加上几个细粒度接口即可。新的业务分支对应到这几个细粒度接口上去,使得 SOA 的一个粗粒度对外接口应对所有新的业务变化,而且这个接口的定义整体是没有变的,对外界而言完全是一个稳定服务的接口。

后记

相比于北京、上海、广州等地,在我从前的印象中,杭州的 IT 氛围还不能算入流。这次和支付宝一起组织的 QClub 活动改变了我的观点。包括支付宝本公司的几个帮忙的朋友,这次活动共有 56 人参加,除了大部分杭州本地的朋友外,还包括宁波、台州以及沈阳的朋友。也许是因为长时间没有参加过线下讨论活动的原因,现在气氛非常热烈。活动进行过程中,需要主持人数次“厉声”制止方能结束讨论,一点也找不到江南才子细语轻声的感觉。各讨论小组的负责人也能很好地将本组讨论的观点进行总结和分享,嘉宾程立更是被数次请上台结合支付宝的经验和与会者朋友分享。也许像北京、上海这样的城市活动比较多,大家见多不怪,也不以为奇,可是像杭州这样的城市类似的活动却还很少,活动结束后,很多朋友询问什么时候再举行下一次。希望 InfoQ 中文站的 QClub 能够架起中高端技术人员之间的桥梁,以微薄之力在更多的城市开展更多的活动。

注:本次 QClub 的视频和 PPT 文件已经发布,欢迎大家浏览。本次活动特别感谢QClub 杭州负责人冯大辉,支付宝首席架构师程立以及支付宝公司和华章图书的大力协助!

志愿参与InfoQ 中文站内容建设,请邮件至 editors@cn.infoq.com 。也欢迎大家到 InfoQ 中文站用户讨论组参与我们的线上讨论。

2008-08-21 20:247733

评论

发布
暂无评论
发现更多内容

微信小程序底层框架实现原理|万字长文

虎妞先生

微信小程序 前端 原理 架构、

云安全之浅谈密钥泄露

HummerCloud

云安全 密钥

java核心技术-多线程基础

蓦然

Spring Java

软件测试/测试开发 | App自动化之dom结构和元素定位方式(包含滑动列表定位)

测试人

软件测试 自动化测试 测试开发

TiKV RocksDB读写原理整理

TiDB 社区干货传送门

TiDB 底层架构 TiKV 底层架构

# 文盘Rust -- rust 连接云上数仓 starwift

TiDB 社区干货传送门

开发语言

【SOP】新扩容节点与集群版本不一致处理

TiDB 社区干货传送门

实践案例 版本升级 管理与运维 故障排查/诊断 扩/缩容

模型推理耗时降低98%!PaddleTS又双叒叕带来重磅升级!

飞桨PaddlePaddle

paddle

在线研讨会邀请 | 赋能“大”研发,助力“快”交付

龙智—DevSecOps解决方案

版本控制 线上研讨会 研讨会 数字资产管理

龙智宣布与Incredibuild建立战略合作伙伴关系

龙智—DevSecOps解决方案

DevSecOps 加速编译

云原生场景下,如何缓减容器隔离漏洞,监控内核关键路径?

OpenCloudOS

Linux 云原生 服务器

br备份时排除某个库

TiDB 社区干货传送门

实践案例 备份 & 恢复

【2.3-2.10】写作社区优秀技术博文一览

InfoQ写作社区官方

热门活动 优质创作周报

MASA Stack 1.0 发布会讲稿——实践篇

MASA技术团队

.net MASA MAUI MASA Stack

前端包管理工具 npm yarn cnpm npx

虎妞先生

前端 包管理工具 #面试

神锁离线版和Bitwarden的自动填充:超级英雄 vs 被斗转星移的瞎鸟

神锁离线版

密码管理 密码管理器 密码安全 Bitwarden 神锁离线版

架构实战营第 10 期 - 模块六:拆分电商为微服务

kaizen

「架构实战营」

云数据库 TiDB 试用实践——部署&运维

TiDB 社区干货传送门

版本测评

Apipost如何快速生成并分享API实时文档

popo223344

后端

代码质量与安全 | 开发人员必备的安全编码实践指南

龙智—DevSecOps解决方案

代码安全 静态代码扫描

海外多语言数字货币交易app系统开发搭建

开发微hkkf5566

PingCAP黄东旭:Serverless是数据库的未来形态

TiDB 社区干货传送门

数据库前沿趋势

七年的开源商业化探索,PingCAP 为什么选了这样一条路?

TiDB 社区干货传送门

数据库前沿趋势

2023最好用的10个开发者工具!每一个都让你效率翻倍

popo223344

工具 测试 后端

C++到Python全搞定,教你如何为FastDeploy贡献代码

飞桨PaddlePaddle

c++ paddle 飞桨

大型集团企业数据治理实践,推进全域数据资产体系建设 | 数字化标杆

袋鼠云数栈

辞旧岁立新年 | 展望前端工程师的2023

字节跳动终端技术

云原生 前端 前端工程师

迈铸半导体完成1500万Pre A+轮融资,用于实现规模化量产

硬科技星球

不常用但却常问的迭代器

虎妞先生

前端 ES6

云数据库 TiDB试用

TiDB 社区干货传送门

云数据库 TiDB 体验——部分故障问题与解决方法

TiDB 社区干货传送门

版本测评 新版本/特性解读 6.x 实践

分布式系统中的一致性和可用性_SOA_霍太稳@极客邦科技_InfoQ精选文章