Tag Archives: Arch

因为信任,所以简单 –专访支付宝架构师团队 (1)

这是前一段时间《程序员》杂志采访支付宝架构师团队的的稿件。篇幅较长,此为第一部分。。
本周支付宝架构师团队一部分成员将参加 CSDN 上海英雄会,欢迎做些技术或者业务方面的交流,
尤其是支付宝的一些合作伙伴公司和潜在合作伙伴公司。

Note:提问者:《程序员》杂志郑柯。回答者:支付宝架构师团队。

能否介绍下支付宝架构团队的构成以及各位的知识结构?

支付宝架构团队里的架构师角色可以划分为首席架构师、技术架构师、业务架构师、产品架构师等、数据库架构师等。

  • 首席架构师:制定公司的长期技术路线图。是公司技术方向和技术组合的重要决策者。
  • 技术架构师:关注整体网站系统架构。通过技术架构对业务架构提供支撑;(系统分析员不是技术架构师,但技术架构师能够胜任系统分析员的职责)
  • 业务架构师:关注业务架构。对公司战略、客户需求、内部需求进行抽象、组织、规划。关注业务的敏捷性,能够随着战略的变化而变化。
  • 数据架构师:负责数据库相关的架构,数据相关的技术研究、规划、评估等。

此外,我们支付宝架构团队里面还有搜索引擎专家专门负责搜索相关的技术,有业务流程专家制定业务流程制定,流程架构开发指引等,可谓藏龙卧虎。

支付宝的架构师中,一部分是从支付宝与淘宝网的内部一线研发人员中成长起来的,在多年的实战中积累了丰富的大规模分布式互联网系统的设计与开发经验,有扎实的 Java 开发功底,熟悉各种开源系统、框架与工具,熟悉主流的企业中间件。支付宝架构团队也有一部分是来自著名 IT 企业的架构师,他们分别在数据库、高性能计算、企业服务总线、工作流、开发工具等专业领域有多年的积累。

支付宝架构师对电子支付行业知识有相当深入的了解,尤其我们的业务架构师,他同时也是会计与支付行业应用的专家。另外,值得强调的是,每个架构师也都会定期带一到两名徒弟,把经验直接传递下去,满师之后徒弟也会承担比较关键的角色,这也让开发团队的同事有更好的上升空间。

支付宝架构团队对自己的具体定位是什么?

支付宝架构团队的日常工作定位在支付宝系统高层架构的设计与优化,其职责是保障系统与公司的愿景与业务体系一致,达到关键的业务敏捷、可伸缩、高可用、性能与安全指标,具备内在的统一性、协调性与可持续发展性,支持支付宝技术团队高效率地研发高质量的产品。

为了达成这一目标,我们会创建并持续优化支付宝的业务架构与系统架构蓝图与发展路线图、参与各类外部与内部标准与规范的制定、评估与指导重大项目与重大的系统变更、主持设计并实现支付宝系统开发框架与工具、以及辅导与培训支付宝技术团队成员等。

支付宝架构团队同时是支付宝未来发展所需的关键技术的孵化器。我们会根据公司的业务方向与趋势,结合行业与技术的发展状况,产出并维护支付宝的技术愿景、技术研究整体规划与发展路线图,并主持开展前瞻性技术的研究。

支付宝架构团队也是公司决策层的智囊团之一。我们会参与公司的发展决策,站在整体业务与技术架构、技术可行性与最佳技术途径的角度,对公司重要项目的决策提供专业性的参考意见。

补充一下,支付宝架构团队一直在招贤纳士,欢迎更多技术牛人加入(Fenng 补充:另外近期在上海会有招聘会)。

架构团队与开发团队之间的沟通多么?主要集中在哪些方面?

沟通是比较多的,一方面是在项目期间会有比较频繁的沟通,主要集中在产品的系统设计是否合理、技术难点支持等方面,有的时候,架构师也会临时”下放”到项目组,与开发工程师并肩战斗;另一方面在非项目时间经常会针对开发模式、新技术走向、如何做好设计和编码等技术角度做分享与交流。

架构团队内部的小范围沟通也不少,大家经常会就一些难点进行思维碰撞、分享、交流。
我们架构组后面的白板好像很少有干净的时候 – 经常是在讨论中拓扑图画满了整个白板。

支付宝架构团队是否经常与阿里巴巴旗下其他公司的架构团队进行沟通和交流?从其他团队哪里学到的最有价值的东西是什么?

为了促进阿里巴巴旗下的各个子公司之间的技术交流,我们成立了一个集团架构委员会。集团架构委员会每个月会有一次线上交流,每个季度会有一次线下的会议交流,而且每个月末各个子公司都会在邮件列表中报告各个子公司技术研究方向和成果。

如果大家都在研究同一种技术,会成立专门的研究小组,进行针对具体技术场景的研究。通过集团架构委员会,我们可以了解各个子公司的技术方向和研究成果,做到互相促进,互相学习,技术共享。

你们认为支付宝架构最令你们自豪的是什么?为什么?

在过去的三、四年里,随着支付宝业务领域的拓展与业务规模的增长,支付宝系统也一直处于快速的增长与变化中,从最初的单一应用迅速发展成由数十个自主系统构成的高度分布又充分协同的大系统。与此同时,支付宝研发团队的规模也从最初的数人发展到现在超过百人的研发团队。在快速奔跑中保持稳定与平衡,对架构提出了很高的挑战。

因此,我们很早就将支付宝系统建立在了面向服务架构(SOA)之上,确立了面向服务的整体业务架构,围绕着公司的基础业务建设了几大核心服务系统,并且搭建了以 ESB 为骨干、以服务框架为基础的面向服务基础设施。这些核心服务以及基础设施是支付宝系统健壮的后腰,它们的高可靠与高可用性是支付宝系统的整体稳定性的基础,它们的灵活性与可重用性支持前端业务有条不紊地创新、整合与优化,它们的可伸缩性保证了系统能够支撑持续的快速业务增长。

面向服务架构不仅是支付宝的运行系统的基础,而且已经渗透到了支付宝的研发与治理体系中,当前,这个领域仍然是支付宝架构团队的一个研究与应用的重点。

能够介绍一下支付宝的架构中用到了哪些 SOA 的思想?

支付宝从05年开始规划、研究SOA;在06年开始实施第一个SOA项目,同年引入ESB产品,对SOA相关的思想、技术进行验证和探索;经过几个项目的实施,我们完成了第一阶段的规划和目标,实现了几大核心业务的SOA化,构建了一套支撑SOA的技术平台。

从理论到实践上,都积累了丰富的经验,下一阶段,我们将会在深入业务SOA的同时,不断完善和发展我们的SOA技术平台。

在采用SOA思想的过程中,我们从下面2个方面入手:

首先,从业务层面入手,用SOA思想梳理业务架构。化解业务敏捷的要求,同时支撑支付宝的开放战略。在此之前,我们在进行业务架构分析的时候,更多的是关注业务的合理性,可行性等,在业务发展的初期,这种做法能够满足我们快速开发系统,及时占领市场的需要。在05年中,我们预见到现有的业务架构,将不能支撑我们公司快速发展的需要,例如:我们的注册会员飞速奔向1亿。此时,我们就开始探讨和规划SOA思想。因此在06年,我们果断的引入SOA思想,用SOA的思想不断重构我们的业务架构。在这个过程中,随着数次公司战略的调整,业务架构都能够灵活应对,达到了业务敏捷化的目的 — 这也是SOA思想的核心。

业务架构的SOA化,是我们开展技术SOA的一个充要条件,没有这一步,我们将会非常艰难,甚至无从下手。

接着,技术层面的SOA,构建一个适合支付宝的SOA技术平台,来支撑业务SOA化的需要。针对支付宝的业务特点和要求,我们优先考虑实现如下SOA要素:

A:以服务为基本单元。技术平台提供与之对应的组件编程模型,业务层面的每一个服务,都能够方便的封装位技术层面额一个组件,例如:客户系统中的注册、登录等,都对应一个组件,每个组件都是独立的,在部署的时候,我们可以灵活选择和组合,可以依据SLA的要求,做出多种部署策略。

B:基于统一标准。在此,我们选择了ESB产品提供支撑,对外提供SOAP、REST、Hessian等标准的支持;对内统一采用定制的标准。

C:分布的能力。所有的服务都能够透明的分布,为外部消费者使用。

D:鼓励扩展。技术平台提供扩展的能力,例如:客户注册后的业务扩展点,业务部门要求依据客户注册来源、客户所在省、客户年龄等,进行不同的业务处理,而且这些业务点有些要求在事务中,有些要求在事务之外。如果每次新的需求出现,都在原有系统直接进行修改,那么不但可能破坏原有的业务,而且可能导致系统可维护性变差。提供扩展点功能,将把扩展逻辑和主体业务逻辑进行有效的隔离,能够彻底解决上面的问题。

E:支撑业务敏捷。支付宝的交易流具有流程类型多,流程过程繁杂的特点,业务流程每个月都会提出多种新的交易业务,同时我们的业务从单一交易业务流向整合型业务流发展。因此,我们引入了BPM相关的技术和工具,帮助我们方便,灵活的组合服务,定制流程。

–待续–

开源数据库 Sharding 技术 (Share Nothing)

注:此文首发于 《程序员》杂志 2008 年 7 月刊。

从 Shard 到 Sharding

“Shard” 这个词英文的意思是”碎片”,而作为数据库相关的技术用语,似乎最早见于大型多人在线角色扮演游戏(MMORPG)中。”Sharding” 姑且称之为”分片”。

Sharding 不是一门新技术,而是一个相对简朴的软件理念。如您所知,MySQL 5 之后才有了数据表分区功能,那么在此之前,很多 MySQL 的潜在用户都对 MySQL 的扩展性有所顾虑,而是否具备分区功能就成了衡量一个数据库可扩展性与否的一个关键指标(当然不是唯一指标)。数据库扩展性是一个永恒的话题,MySQL 的推广者经常会被问到:如在单一数据库上处理应用数据捉襟见肘而需要进行分区化之类的处理,是如何办到的呢? 答案是:Sharding。

Sharding 不是一个某个特定数据库软件附属的功能,而是在具体技术细节之上的抽象处理,是水平扩展(Scale Out,亦或横向扩展、向外扩展)的解决方案,其主要目的是为突破单节点数据库服务器的 I/O 能力限制,解决数据库扩展性问题。

事关数据库扩展性

说起数据库扩展性,这是个非常大的话题。目前的商业数据都有自己的扩展性解决方案,在过去相对来说比较成熟,但是随着互联网的高速发展,不可避免的会带来一些计算模式上的演变,这样很多主流商业系统也难免暴露出一些不足之处。比如 Oracle 的 RAC 是采用共享存储机制,对于 I/O 密集型的应用,瓶颈很容易落在存储上,这样的机制决定后续扩容只能是 Scale Up(向上扩展) 类型,对于硬件成本、开发人员的要求、维护成本都相对比较高。

Sharding 基本上是针对开源数据库的扩展性解决方案,很少有听说商业数据库进行 Sharding 的。目前业界的趋势基本上是拥抱 Scale Out,逐渐从 Scale Up 中解放出来。

Sharding 的应用场景

任何技术都是在合适的场合下能发挥应有的作用。 Sharding 也一样。联机游戏、IM、BSP 都是比较适合 Sharding 的应用场景。其共性是抽象出来的数据对象之间的关联数据很小。比如IM ,每个用户如果抽象成一个数据对象,完全可以独立存储在任何一个地方,数据对象是 Share Nothing 的;再比如 Blog 服务提供商的站点内容,基本为用户生成内容(UGC),完全可以把不同的用户隔离到不同的存储集合,而对用户来说是透明的。

这个 “Share Nothing” 是从数据库集群中借用的概念,举例来说,有些类型的数据粒度之间就不是 “Share Nothing” 的,比如类似交易记录的历史表信息,如果一条记录中既包含卖家信息与买家信息,如果随着时间推移,买、卖家会分别与其它用户继续进行交易,这样不可避免的两个买卖家的信息会分布到不同的 Sharding DB 上,而这时如果针对买卖家查询,就会跨越更多的 Sharding ,开销就会比较大。

Sharding 并不是数据库扩展方案的银弹,也有其不适合的场景,比如处理事务型的应用就会非常复杂。对于跨不同DB的事务,很难保证完整性,得不偿失。所以,采用什么样的 Sharding 形式,不是生搬硬套的。

Sharding与数据库分区(Partition)的区别

有的时候,Sharding 也被近似等同于水平分区(Horizontal Partitioning),网上很多地方也用 水平分区来指代 Sharding,但我个人认为二者之间实际上还是有区别的。的确,Sharding 的思想是从分区的思想而来,但数据库分区基本上是数据对象级别的处理,比如表和索引的分区,每个子数据集上能够有不同的物理存储属性,还是单个数据库范围内的操作,而 Sharding 是能够跨数据库,甚至跨越物理机器的。(见对比表格)

Sharding.png
(转载别忘了此图。注明全文来自 https://www.dbanotes.net)

Sharding 策略

数据 Sharding 的策略与分区表的方式有很多类似的地方,有基于表、ID 范围、数据产生的时间或是SOA 下理念下的基于服务等众多方式可选择。而与传统的表分区方式不同的是,Sharding 策略和业务结合的更为紧密,成功的 Sharding 必须对自己的业务足够熟悉,进行众多可行性分析的基础上进行,”业务逻辑驱动”。

Sharding 实现案例分析:Digg 网站

作为风头正劲的 Web 2.0 网站之一的 Digg.com,虽然用户群庞大,但网站数据库数据并非海量,去年同期主数据大约只有 30GB 的样子,现在应该更大一些,但应该不会出现数量级上增长,数据库软件采用 MySQL 5.x。Digg.com的 IO 压力非常大,而且是读集中的应用(98%的 IO 是读请求)。因为提供的是新闻类服务,这类数据有其自身特点,最近时间段的数据往往是读压力最大的部分。

根据业务特点,Digg.com 根据时间范围对主要的业务数据做 Sharding,把不到 10% 的”热”数据有效隔离开来,同时对这部分数据用以更好的硬件,提供更好的用户体验。而另外 90% 的数据因用户很少访问,所以尽管访问速度稍慢一点,对用户来说,影响也很小。通过 Sharding,Digg 达到了预期效果。

现有的 Sharding 软件简介

现在 Sharding 相关的软件实现其实不少,基于数据库层、DAO 层、不同语言下也都不乏案例。限于篇幅,作一下简要的介绍。

MySQL Proxy + HSCALE

一套比较有潜力的方案。其中 MySQL Proxy (http://forge.mysql.com/wiki/MySQL_Proxy) 是用 Lua 脚本实现的,介于客户端与服务器端之间,扮演 Proxy 的角色,提供查询分析、失败接管、查询过滤、调整等功能。目前的 0.6 版本还做不到读、写分离。HSCALE 则是针对 MySQL Proxy 插件,也是用 Lua 实现的,对 Sharding 过程简化了许多。需要指出的是,MySQL Proxy 与 HSCALE 各自会带来一定的开销,但这个开销与集中式数据处理方式单条查询的开销还是要小的。

Hibernate Shards

这是 Google 技术团队贡献的项目(http://www.hibernate.org/414.html),该项目是在对 Google 财务系统数据 Sharding 过程中诞生的。因为是在框架层实现的,所以有其独特的特性:标准的 Hibernate 编程模型,会用 Hibernate 就能搞定,技术成本较低;相对弹性的 Sharding 策略以及支持虚拟 Shard 等。

Spock Proxy

这也是在实际需求中产生的一个开源项目。Spock(http://www.spock.com/)是一个人员查找的 Web 2.0 网站。通过对自己的单一 DB 进行有效 Sharding化 而产生了Spock Proxy(http://spockproxy.sourceforge.net/ ) 项目,Spock Proxy 算得上 MySQL Proxy 的一个分支,提供基于范围的 Sharding 机制。Spock 是基于 Rails 的,所以Spock Proxy 也是基于 Rails 构建,关注 RoR 的朋友不应错过这个项目。

HiveDB

上面介绍了 RoR 的实现,HiveDB (http://www.hivedb.org/)则是基于Java 的实现,另外,稍有不同的是,这个项目背后有商业公司支持。

PL/Proxy

前面几个都是针对 MySQL 的 Sharding 方案,PL/Proxy 则是针对 PostgreSQL 的,设计思想类似 Teradata 的 Hash 机制,数据存储对客户端是透明的,客户请求发送到 PL/Proxy 后,由这里分布式存储过程调用,统一分发。 PL/Proxy 的设计初衷就是在这一层充当”数据总线”的职责,所以,当数据吞吐量支撑不住的时候,只需要增加更多的 PL/Proxy 服务器即可。大名鼎鼎的 Skype 用的就是 PL/Proxy 的解决方案。

Pyshards

http://code.google.com/p/pyshards/wiki/Pyshards
这是个基于 Python的解决方案。该工具的设计目标还有个 Re-balancing 在里面,这倒是个比较激进的想法。目前只支持 MySQL 数据库。

结束语

Sharding 是一项仍处于高速发展中的”老”技术,随着 Web 2.0 的发展,Sahrding逐渐从比较”虚”的概念变成比较”实”的运用思路,开放源代码软件大潮也给 Sharding 注入新的活力,相信会有越来越多的项目采用 Sharding 技术,也会有更多成熟的 Sharding 方案和数据库附加软件涌现。

你的站点 Sharding 了么?

EOF

另,本周末我讲参加这个活动:体验基于OpenSolaris的Web/企业应用,做一个题为《设计可扩展的面向互联网应用的MySQL数据库》的简单分享。欢迎杭州朋友光临指导。

Facebook 的 Scaling Out 经验

Facebook 其实对待技术的态度其实挺开放的。今天阅读了这篇 Scale Out, 工程师 Jason Sobel 介绍了在对付跨地域 MySQL 复制网络延迟的问题。

Cache 一致性问题解决思路

大量的 MySQL + Memcached 服务器,布署简示:

California (主 Write/Read)............. Virginia (Read Only)

主数据中心在 California ,远程中心在 Virginia 。这两个中心网络延迟就有 70ms,MySQL 数据复制延迟有的时候会达到 20ms. 如果要让只读的信息从 Virginia 端发起,Memcached 的 Cache 数据一致性就是个问题。

  • 1 用户发起更新操作,更名 "Jason" 到 "Monkey" ;
  • 2 主数据库写入 "Monkey",删除主、从两端 Memcached 中的名字值;
  • 3 在 Virginia 有人查看该用户 Profile ;
  • 4 在 Memcached 中没发现用户名字,从 Virginia Slave 数据库读取,因为网络延迟,结果读到了 "Jason";
  • 5 更新 Virginia Memcached 中的该用户名字为 "Jason";
  • 6 复制追上了,更新名字为 ""Monkey";
  • 7 又有人读取 Profile 了;
  • 8 在 Memcached 中找到了键值,返回 "Jason" (实际上造成业务冲突了)

解决办法挺有意思,在 SQL 解析层嵌入了针对 Memcached 的操作。

  • 1 用户发起更新操作,更名 "Jason" 到 "Monkey" ;
  • 2 主数据库写入 "Monkey",删除主端 Memcached 中的名字值,但Virginia 端 Memcached 不删;(这地方在 SQL 解析上作了一点手脚,把更新的操作"示意"给远程);
  • 3 在 Virginia 有人查看该用户 Profile ;
  • 4 在 Memcached 中找到键值,返回值 "Jason";
  • 5 复制追上更新 Slave 数据库用户名字为 "Monkey",删除 Virginia Memcached 中的键值;
  • 6 在 Virginia 有人查看该用户 Profile ;
  • 7 Memcache 中没找到键值,所以从 Slave 中读取,然后得到正确的 "Monkey" 。

这里面的一个简单的原则是: 更新后的数据,用户第一次读取要从数据库读,顺便扔一份到 Cache 里,而不是在写入的时候直接更新 Memcached 。避免写事务过大。

而写操作的原则是:一次写入,到处分发

第二个问题是关于”Page Routing”的 ,也很有参考价值。感兴趣的自己读一下吧。

EOF

另推荐一下: 分布式系统中的一致性和可用性,该文是上次在支付宝 QClub 活动的总结之二。

CAP:高可用架构的另一基石

在上周六的 QClub 上,BASE 成为了一个热点话题,其实除了这个 BASE 之外,还有个 CAP 理论也是值得关注一下的。这个概念也来自 Inktomi 公司(被雅虎收购后已是明日黄花)的 Eric A. Brewer ,应该说他 10 年前的那篇 Lessons from Internet Services: ACID vs. BASE 是互联网技术最为重要的一篇文章了。

C: Consistency 一致性 
A: Availability 可用性
P: Tolerance of network Partition 分区容忍性(有翻译为耐受性的,个人觉得不妥)

CAP.png

熊掌与鱼不可兼得,三个目标不能同时满足。如果对”一致性”要求高,且必需要做到”分区”,那么就要牺牲可用性;而对大型网站,可用性与分区容忍性优先级要高于数据一致性,一般会尽量朝着 A、P 的方向设计,然后通过其它手段保证对于一致性的商务需求。

CAP 不是什么高深的东西,应该说 CAP 只是一个经验理论,切不可钻牛角尖,号称自己做的东西能打破 CAP 理论,那只是无意义的事情罢了。

如果知道 ACID(酸) 、BASE(碱) 在词典中的含义,那么这个 CAP 的辞典含义也很有趣。

EOF

最后推荐阅读一下这篇:可伸缩性原则