大公司开源怎么做？SOFAStack 给出一个很好的例子
蚂蚁金服的 SOFAStack 作为一个成功地将企业私有项目转化为开源核心模式的知名案例，我们之前对背后的思考和推动力做过专题分析，但是具体这件事是如何在蚂蚁金服内部发生的、是如何实操的，有很多读者向我们表示非常感兴趣，而我觉得这也是其它技术公司所正在探索和思考的方向。因此，上个月底，老王在参加上海举办的 KubeCon 2019 时，遇到了蚂蚁金服 SOFA 团队的余淮，他目前在蚂蚁金服中间件团队服务与框架组具体负责开发框架与 SOFAStack 的开源工作。于是，参会之余，我和余淮就 SOFA 开源的实操方面进行了深入的沟通，现将谈话所得整理给大家。SOFA 与开源2018 年，SOFAStack 开始开源之后，处于关注，我曾向蚂蚁金服中间件负责人杨冰了解过为什么要将 SOFA 开源的背后思考，以及 SOFA 发展迭代的历程。目前，SOFA 的架构已经发展到 SOFA 5 阶段，前任的 SOFA 开源负责人鲁直也向我介绍过 SOFA 5 中重点推进的方向，主要包括 Service Mesh 和 Serverless，以及分布式事务 Seata 的落地等。而在今年上半年他们又开源了分布式事务框架 Seata 和服务注册中心 SOFARegistry。作为一个成功的开源核心模式的项目，我非常关注 SOFA 开源的实操是如何进行的，是如何进行开源治理的，作为 SOFA 团队的老朋友，我们话题就直接从 SOFA 的开源治理聊起。以 SOFA 为例：公司内部软件的开源流程余淮说，从 2015 年开始，蚂蚁金服开启了金融科技对外输出的战略，SOFAStack 也走出了蚂蚁金服，甚至跨越了国界，被更多金融机构与合作伙伴所使用，如天弘基金、信美互信、南京银行、PayTM、DANA 钱包等。在与合作伙伴以及客户的沟通、合作过程中，他们发现了 SOFAStack 的理念和能力也正是很多金融行业的企业所需要的。在蚂蚁金融科技对外输出的过程中，内部已经对 SOFAStack 进行了一定程度的代码重构，例如历史兼容逻辑的剥离等，但是并未能达到直接开源的标准。 关于开源，其内部一直有开源的讨论，到 2017 年双十一结束后正式决定开源。经过了一系列的准备，2018 年 4 月，完成了对 SOFA 项目的满足了开源改造的标准后，SOFAStack 马上宣布正式开源框架中部分重要组件。SOFA 团队给开源定的策略叫「 开源核心 （ Open Core ） 」，顾名思义就是要将接口层以及核心实现都开源，以可扩展化的方式来层层构建 SOFAStack 的能力，保证 SOFAStack 的内部版本和开源的版本采用的是同一个内核。为此 SOFAStack 做了大量的改造和重构工作。 在开源的具体考量上，余淮表示，SOFAStack 的开源改造基本上有三条原则，分别是高可扩展性、对内兼容历史版本、对外兼容业界标准。 以 SOFARPC 重构为例，大概经历了这样的过程：首先需要将 SOFARPC 进行了一次核心接口和模型抽象，然后增加了扩展点机制和事件总线机制，所有的对内、对外实现都基于这些核心接口和模型去扩展，并且保证这些扩展能力都是平等的、可选的；接着将核心的处理逻辑实现迁移到这套接口和模型上来，保证 RPC 能力完整可用；然后需要将 RPC 里一些对接内部系统的、兼容历史逻辑的代码做成内部扩展，并进行全量测试验证，确保和已有线上的历史方案的兼容，发布上线；最后会调研业界的一些开源标准方案和实现，并对其进行兼容，例如 SOFARPC 不仅对接自己的 SOFARegistry 的实现，还兼容了 Zookeeper、Etcd、Nacos 等业界优秀的注册中心方案。虽然上面重构过程听上去没那么复杂，但是在实际过程中还是非常考验团队的技术能力的，特别是在抽象核心接口和模型的时候，为了做到既兼容内部又兼容外部，这需要进行大量的调研工作，才能做好这层较为通用抽象。其次在对内逻辑兼容的时候，由于内部的历史负担还是比较重的，为了能让重构的代码安全上线，团队也做了很多事情。还是举 SOFARPC 的例子，蚂蚁内部的服务路由过程比开源是要复杂很多的，特别是配合蚂蚁特有的单元化部署以及异地多活的能力，有时候需要多层路由才能找到目标地址。为了验证重构后逻辑的正确性，除了在开源代码里有单元测试用例外，SOFA 团队在内部也构建了一套非常完善的集成框架，专门用来测试已有逻辑的兼容性及正确性。基于开源核心这套思想建设 SOFAStack 以后，其实对开发人员的工作量来不会变少，反而可能是增多的。这是因为在写代码的同时，需要更多的考虑内部外部的使用情况，对代码质量也提出了更高的要求，开发流程会变得更加复杂。例如，内部新增一个特性，在以前可能直接修改代码经过测试就发布上线了，但现在的话会去思考这其中哪些能力是通用的，把这些能力抽象一下放到开源版本里去，然后开源版测试后发布，这个时候内部版本在基于这个开源版进行扩展，再经过测试后发布上线。虽然开发人员工作变多了，但是这样的话可以让 SOFAStack 的核心代码被更多的开发者评审，在更多的系统中运行，在更多的场景下进行验证，对 SOFAStack 的品质保证有非常大的帮助。 此外在开源进度上，余淮表示， SOFAStack 并不追求开源全部内部的组件，而是会根据产品的特性和开源准备的情况有选择的开源。例如 SOFAStack 下的分库、分表组件，因为产品特性和 OB 等内部结合紧密就暂时不会开源。金融级分布式架构下未开源部分能力，SOFAStack 会和与业界其它优秀的开源项目做集成，保证整个金融级分布式架构功能的完整性和多样性。所以对于 SOFAStack 来说，并不只有自己开源的产品，而更多关注的是，和整个社区里所有开源优秀的产品一起，打造一套快速构建金融级分布式架构的套件。开源项目的管理开源一个项目，作为背后推动的公司事实上要付出相当多的人力和资金成本，同时，也不可避免的会涉及到审批流程。随着蚂蚁金服越来越多领域的项目开源，包括 SOFAStack、AI、区块链等，蚂蚁金服内部出台了相应的严格的审核机制，包括技术、合规、法务、安全等部门进行审核，同时还会考察项目开源对公司的意义，以及是否对社区有价值，在审核通过之后项目就会正式开源与大家见面了。 蚂蚁金服对于开源文化是十分友好的，其内部的代码也大多都是公开在内网的 GitLab 仓库，经常会有业务团队对 SOFAStack 提交一些合并请求（拉取请求）来帮助项目的发展。同时，蚂蚁金服的工程师也普遍地拥抱开源，开源能够帮助项目产生更多、更好的想法，同时也可以吸收来自社区的贡献，让项目本身能够做的更好，这是大家所喜闻乐见的。SOFA 的社区治理开源项目并不是开放源代码就是终点，事实上，这只是开始，之后持续不断的开源治理才是开源之路。而如何将一个开源项目从最开始的由开源项目背后的公司主导转变为社区性项目，这是一个值得思考和探索的课题。基于目前的开源模式和社区建设力度，SOFA 团队也在尽可能去吸引外部的贡献者。不过 SOFAStack 项目由于大量应用在蚂蚁金服及不少企业线上环境，所以目前对于开发者技术能力以及代码质量要求相对较高，因此，这项任务还需要较多的工作。目前 SOFA 社区已经涌现了不少积极的开发者和贡献者，解决了社区提出的一些重要需求。这其中一些功能组件的完成，贡献者提供了相当重要的代码基础，而 SOFA 社区成员也积极参与到功能的完善和规范化工作中，甚至有的拉取请求要经过十几个来回才能被合并入功能分支。 余淮同时也谈到，下一步会引入更友好的流程和工具，让更多的开发者能够更容易地加入到 SOFAStack 社区的开发和贡献当中，为 SOFAStack 的共同发展做出包括贡献代码、文档完善和推广宣传等各个方面的贡献。在社区团队方面，SOFAStack 也设计了诸如 贡献者 （ Contributor ） 、 提交者 （ Committer ） 、 委员会成员 （ PMC ） 等多个层面的贡献者认证机制，以让各个层级的热情、精力不同的人能够加入到项目的贡献中。SOFAStack 开源至今社区已经有 120 多位贡献者共建社区，也有十来位外部提交者通过其贡献的代码获得社区的认可，并进一步取得对社区发展的影响力。谈及这一点，余淮表示，为了保证代码质量，来自社区的代码贡献往往需要 SOFAStack 社区已有成员和贡献者许多次的往复修改和完善才能进入到代码主干，但是通过这些互动，才能真正遴选出来社区的中坚分子，也进一步将项目融入到社区中。在社区建设方面，除了在 Github 上、钉钉微信群的一些交流外，SOFAStack 社区还会有丰富的线上线下的活动。每周类似周报形式的 SOFA Weekly，帮助大家了解社区的最新资讯和项目进展；社区共建的 SOFALab 源码解析实验室，和社区同学一起学习和解析源码，整理成册，帮助大家更好的学习项目；每月若干次的 SOFAChannel 直播，可以在线和讲师进行沟通交流。与此同时，SOFAStack 也会定期在全国各地举行线下的 SOFAMeetup 活动，大家一起面对面交流，目前已经在全国五个城市举办了 7 场，共有一千多人到现场；也会举办 Workshop 和 CodeLab 等实践类的活动，像本次的 KubeCon 就有一场 Workshop，手把手带着大家一起实践 SOFAStack。在社区合作方面，社区里有很多优秀的开发者和开源项目，SOFA 团队也经常和社区互相学习、分享、交流技术，目前SOFAStack 已经和很多开源社群建立了良好的关系，包括国内 ServiceMesher，K8S 中国，ShardingSephere，SkyWalking，Ant Design，EggJS 等，也包括国外的 light4j 等。此外，余淮还谈到，SOFAStack 在今年还会结合实际业务方面和开源社区做更多的能力整合提升，他举例说到 SOFAStack 今年会和做 Spring Cloud 更深入的集成和增强，例如 Spring Cloud 还是文件级别的配置更新，配合 SOFAStack可以做到更细粒度的配置更新等。总结要说我对哪个国内开源项目研究的最深入，那非 SOFAStack 莫属。自从 SOFAStack 开源以来，我先后和杨冰、鲁直从 SOFA 开源的思想、战略层面进行过深入沟通，而这次，我希望可以从战术上，从实操层面分享他们在 SOFA 开源方面的经验给广大的开源社区和开源企业。“穿山甲专访”栏目是 Linux 中国社区推出的面向开源界、互联网技术圈的重要领军人物的系列采访，将为大家介绍中国开源领域中一些积极推动开源，谙熟开源思想的技术人，并辨析其思考、挖掘其动因，揭示其背后所发生的事情，为关注开源、有志于开源的企业和技术人标出一条路径。取名为“穿山甲”寓意有二：取穿山甲挖掘、深入之意来象征技术进步和表征技术领袖的作用；穿山甲是珍稀保护动物，宣传公益。
对话鲁直：蚂蚁金服中间件的开源头羊
二月初春，在西子湖畔的细雨中，我拜访了蚂蚁金服中间件团队，和 SOFA 技术负责人鲁直做了一次深入交谈，更妙的是，鲁直也是负责 SOFA 开源事务推进的人，而这样一个切实践行开放核心模式的开源项目，也正是我非常感兴趣的。两个技术人的谈话，自然是朴实而直白的，话题主要围绕着 SOFA 和开源主题展开，希望也能一样引起同是技术人的你的共鸣。人物介绍受访者：鲁直，蚂蚁金服 SOFA 开源负责人。采访者：老王，开源布道人，有 20 年互联网从业经历的技术老兵。虽然我和鲁直在微信上已经联系很久了，但这还是第一次见面。交谈中，我了解到鲁直是 2009 年加入阿里巴巴工作，已经有十年了。刚开始是在 1688.COM 做业务系统，对中间件技术非常感兴趣，也会经常研究各种中间件的实现和功能。后来在 2013年时，为了更深入地学习研究中间件框架，转到了蚂蚁金服中间件团队，从那个时候开始就一直在做 SOFA。目前鲁直在 SOFA 的团队主要负责的工作包括几个部分。其中一个主要部分就是 SOFA 开源相关的工作。SOFA 的产品体系非常广，包括已经对外开源的部分、内部整个微服务体系，以及 SOFA 框架等等——而这些开源相关的工作主要是由鲁直负责推动的。当然，作为技术负责人，鲁直既要带技术团队也要做技术工作。谈及这一点，鲁直说：“我觉得做技术管理，跟普通的管理不太一样，因为技术管理最重要的一个点是除了管理之外，还要保持一定的技术判断力和敏锐度。对一些新技术，包括团队中遇到一些重大的技术问题，你都要有一些方向性的判断。虽然最后不一定是你具体解决的，但是在整个团队的技术攻坚和技术选型上，要一起确立方向。”我以前也做过十余年的技术管理，我很能够感受这种情况，重大问题技术负责人更要迎难而上。SOFA 5 落子 Service Mesh就我了解的情况，现在 SOFA 已经发展到了 SOFA5 了。在 SOFA4 阶段，主要的任务是将开源体系捋清楚了，然后开始按步骤地开源；到现在发展到了 SOFA5。我想知道从 SOFA4 发展到 SOFA5，是什么让蚂蚁金服中间件团队判断 SOFA4 的阶段性目标已经达成，可以迈进到新的 SOFA5 阶段了呢？“从整个业界趋势上来讲，SOFA4 的架构相对来说还是偏传统一些，更多是对我们之前的技术框架的整理和梳理。在这个阶段，SOFA 的代码经过了非常多的优化和重构，才达到了对外开源的要求，从而 SOFA 走上了开源核心的模式，逐步分阶段的将各个部分进行了开源。”鲁直讲到，“但是，从我们对业界的整体判断上来说，未来无疑是云的时代，所以说要考虑怎么让所有的业务系统能够提供云的能力，比如说 Serverless。”接着这个话题，鲁直讲了他对云计算的理解：“一方面云计算肯定要为整个业务的发展提供更加方便的基础资源，可以不用去关心底层的基础设施。Serverless 字面的意思就是说‘无服务器’——我不用关心服务器怎么来的，不用关心基础设施，只要关心业务代码就可以了。那反过来对于云服务商来说，经过了这一层抽象，其资源利用率会更高，可以有更多的利润空间，这是一个双赢的局面。对于用户来讲，这种好处是实实在在的，可以更少关注基础设施，只关心代码就可以了。”“我们希望在 SOFA5 的方向上，在这个新的迭代中，去让业务——包括让未来我们开源出来各种功能、各样服务模式——都更多地去关心自己的业务代码，而不用再过多地关心基础设施。”鲁直说。在 SOFA5 中，一个重要的方向就是 Service Mesh 这个方向，这将是 SOFA5 中非常重要的特性。鲁直强调了其对 Service Mesh 技术的看好：“我认为 Service Mesh 是迈向未来往前走的非常关键的一步，让业务不用再关心基础设施。通过 Service Mesh，我们可以将很多技术能力直接放到基础设施里面，而业务可以不用感知到这一层。原来可能需要花几个小时或者更多的时间解决的基础设施问题，现在可以通过 Service Mesh 解决掉。”“目前我们我们已经在生产环境中应用了 Service Mesh。我们在这方面有非常大的决心，我们希望能够在今年，在更大的范围中去落地 Service Mesh。当前这个阶段更聚焦在这种技术的内部落地上，希望用好了，再给社区做更多的贡献。”Service Mesh 这个词最早是由开发 Linkerd 的 Buoyant 公司于 2016 年提出的，随着 Linkerd 的传入，Service Mesh 也进入国内技术社区的视野。Service Mesh 也被翻译为“服务网格”。Linkerd 则是业界第一个 Service Mesh。Service Mesh 是一个基础设施层，用于处理服务间通信，负责实现请求的可靠传递。在实践中，服务网格通常实现为轻量级网络代理，通常与应用程序部署在一起，但是对应用程序透明。Service Mesh 的部署模型，有两种情况：对于一个简单请求，作为请求发起者的客户端应用实例，会首先用简单方式将请求发送到本地的 Service Mesh 实例。这是两个独立进程，它们之间是远程调用。Service Mesh 会完成完整的服务间调用流程，如服务发现负载均衡，最后将请求发送给目标服务。这就是 Sidecar，它在原有的客户端和服务端之间加多了一个代理。多个服务调用的情况，Service Mesh 出现在所有的服务的下面，这一层被称之为服务间通讯专用基础设施层。Service Mesh 会接管整个网络，把所有的请求在服务之间做转发。在这种情况下，上面的服务不再负责传递请求的具体逻辑，只负责完成业务处理。服务间通讯的环节就从应用里面剥离出来，呈现出一个抽象层。如果有大量的服务，Sidecar 之间的连接就会形成一个网络，这个就是服务网格名字的由来。“我们将以 Service Mesh 为跳板再往前走。”鲁直表示，“Serverless 更多的还是应该聚焦在其字面本身，其含义就是‘无服务器’，后面的技术都是为了让无服务器承载具体的业务。”Serverless 这个概念虽然提出来已经有几年了，目前 AWS 在 Serverless 和 FaaS 方面处于比较前沿的位置，但是在国内，Serverless、FaaS 这些技术的发展还是相对比较滞后。鲁直指出，“我觉得 Serverless 想要成功，还是要从覆盖业务的整个广度上打开，否则可能还是停留在 FaaS 上，那场景就比较受限。”Service Mesh 将是微服务的下一个时代，关于它还在持续进行理论研究和实践探索。鲁直说：“坦白来讲，我觉得 istio 的理念非常好，但是在整个工程设计上，如果放到蚂蚁金服这样体量较大的环境里面，可能跑起来还需要做一些工作。我们希望今年 Service Mesh 在蚂蚁金服有了更大规模落地之后，可以把我们在 Service Mesh 方面的一些实践经验用到产品环境的工程中去实践，然后贡献出去。目前更多的一些工作，是将整个体系上进一步完善，铺到更多业务上，然后将这些经验反哺到整个 Service Mesh 的设计上，让它走的更远。”也就是说，蚂蚁金服在 Service Mesh 上跟 istio 的技术路线是一致的，但是会从工程的角度更多地推动它的发展。我们希望能够在我们进行了生产验证之后，再慎重地推送给开源社区。这也是蚂蚁做开源贡献的一贯理念。鲁直：“我们希望能够在我们进行了生产验证之后，再慎重地推送给开源社区。这也是蚂蚁做开源贡献的一贯理念——我们希望一个东西经过了内部一段时间的成熟之后，再去开源。经过了大规模的内部验证之后，它的稳定性上有了一定的保障，就贡献给外部社区使用，再去拓展更多一些使用场景，包括完善和解决一些之前没有遇到一些问题。”合力 Seata 分布式事务框架2007 开始，蚂蚁金服自主研发了分布式事务中间件 XTS，在内部广泛应用并解决金融核心场景下的跨数据库、跨服务数据一致性问题，最终以 DTX 的云产品化展现并对外开放。而与此同时，阿里巴巴中间件团队发布 TXC，为集团内应用提供分布式事务服务，经过多年的技术沉淀，于 2016 年产品化改造为 GTS，通过阿里云解决方案在众多外部客户中落地实施。2019 年 1 月，基于技术积累，阿里巴巴中间件团队发起了开源项目 Fescar，蚂蚁金服也开源了自己的分布式事务框架，并与 Fescar 合并一起共建分布式事务解决方案。这个发展既在情理之中，也在意料之外，我确实好奇这期间发生了什么，是如何和 SOFA 中间件团队的发展结合的，他们下一步会有什么计划？鲁直说：“分布式事务是蚂蚁金服在 2007 年做的创新，是基于 TCC 原理，我们在内部实现了这个模式。TCC 理论相对还是比较简单的，但是它要落地，需要花费比较长的工程实现上的打磨才行。分布式事务这个技术在蚂蚁金服已经走过了 12 年的时间了。在蚂蚁金服最核心一些业务上，包括支付、交易、账务等等系统都在使用这套分布式事务框架解决和孵化的。”在分布式事务这一块领域上，在业界来看目前相对来说比较空白，还没有非常好的分布式事务框架。说起来合并的初衷，鲁直表示，“既然阿里巴巴和蚂蚁金服都在这个方向做了一些开源的工作，所以我们把这两个部分的努力结合起来，取长补短，以适用于更多的分布式事务业务场景，蚂蚁金服加入 Seata 社区共建，在 Seata 0.4.0 版本中加入了 TCC 模式，为大家提供一个更加宽泛的分布式事务的解决方案。”具体来说，“阿里巴巴的 Seata 提供是 AT 模式，对业务来说，不用有太多感知，但是它覆盖的场景有限，如果可以接受这样的情况，用 AT 模式更好。而蚂蚁金服因为有更强的金融方面的要求，就需要采用 TCC 模式，业务接入成本更高，但是它能做到非常好的分布式执行。未来还会提供像 XA 这样的模式，去适应更宽泛业务场景，这在这一块上，蚂蚁金服和阿里巴巴会结合在一起提供一个融合的框架。”Seata 为解决微服务架构下的分布式事务问题交出了一份与众不同的答卷。而 Seata 的愿景是让分布式事务的使用像本地事务的使用一样简单和高效，希望可以让 Seata 适用于所有的分布式事务场景。如何做开源作为开源核心模式的项目，我希望了解蚂蚁金服中间件的开源一般会做哪些工作，是否有比较完善的流程和规则？“首先，最基础的肯定是代码，并提供对应的示例，然后我们会提供贡献者指南这样的指引文档，因为本质上我们希望打造成一个开源社区，社区的参与度对我们来说是非常重要的东西，有人会上来提 issue，也有人来解答，有人提功能需求，有人提 PR 等等”，鲁直说。Linux 中国曾经开发过一个用于测算开源项目活跃度的一个模型，我们认为从过去感性地看一个开源项目是不是活跃，已经开始逐渐进步到通过理性数据评估了，但是这需要排除一些数据作弊的情况，就像之前很多人会用项目的星标数来评估项目的活跃度，这当然很粗糙。我们今年还会继续配合 2019 年度的开源年报，而提供数据支持，到时候我们肯定会给 SOFA 相关的项目做一个考察。希望可以切实地反映出来 SOFA 在开源方面的工作。从之前的脉络上看，到了 SOFA5，还会继续沿袭开放核心的模式，即：核心部分开源，与本地业务强关联，但是跟核心不是强关联的部分不开源。从蚂蚁金服自身的实践来看，他们已经切实地践行了开源核心模式。而对于开源核心模式，有人唱衰，也有人说好，各种观点都有。但从蚂蚁金服自身的实践来看，他们已经切实地践行了开源核心模式，这是我在国内第一个深入了解过的真实落地的开源核心模式项目。说到开源模式，鲁直表示：“做开源，我觉得首先肯定要做一个心理准备，就是说你要有一个核心部分，再在这个基础上做扩展，在维护的成本上肯定有一定的上升，但是你要接受这样的成本——我觉得这种成本是可以接受的。……项目本身要设计好，具备一定分拆的可能性。如果不具备分拆可能性，那没法做了。像微内核这样的设计方式就会比较适合——就是开源一个核心模块，然后再去扩展，各种模块是可插拔的。”而对于开源工作是如何做的，鲁直说：“我们没有专门做开源的人，也没有专门做内部代码的人，我们是把这两部分放在一起，既做开源又做内部代码，因为这样一个好处是，既熟悉外部的代码，又熟悉内部的代码，这个边界自己可以把握比较好。我们更多是制定一些规则。比如说跟业务层强相关的部分，你开源出去也没人用；如果说跟业务不相关的，你为什么不开源？因为你开源的这个产品想要做得更好，这些能力开源出去其实没有太大问题，所以一般我们的标准就是看是不是跟内部系统相关，是不是跟业务强相关，如果不相关就可以开源。”谈话中，鲁直反问的“你为什么不开源？”这句话让我印象深刻。谈话中，鲁直反问的“你为什么不开源？”这句话让我印象深刻，这其实代表了他们开源的初心，但是从商业者从公司的角度来说，开源有没有给公司带来真正的好处？这不仅仅是情怀的问题，我相信每一个热爱开源的人，其实存在开源情怀或者是更理想化的想法，但是从另一方面来说，无论是从公司的机制上，还是公司的业绩上，开源还是要有实实在在的收益，能够推动公司业务发展才行。作为一个开源项目的负责人，他是怎么感受到开源的好处呢？对这个问题，显然他有过成熟的思考：“最直接的好处就是更长效。从眼前看，你的名声出去了招聘是不是也容易找到更合适的人？这是最短期的收益。长期的好处，开源社区里面大家分享了非常多的观点，从实践来看，也是这样。比如说你在一家公司里面去做的话，公司的业务场景是有限的，虽然说蚂蚁金服覆盖了各种各样的业务，金融方面的基本上全覆盖了。但是其他的行业不一定都有，他们遇到这个问题，我们可能并不会遇到，但这些问题可能是未来能够遇到的，如果把一个项目以开源的方式运作，就意味着说，更大的用例场景更容易发现 bug，用的人越多，越有可能会触发这个bug，那对于就是有了进一步完善的可能。另外，有了这样的一个社区化的发展，有更多人参与进来之后，这个项目可以更快往前发展，而不是只有你自己在。在一家公司里边，团队的人员数量肯定是有限的，而有这么多人来参与，那对于这个项目的往前演进来说有非常大的好处，反过来对公司也会带来更多好处——无论是潜在的还是直接的。最后，如果你的产品有商业化的支持，比如说其他系统的支撑，也能够更好提供商业化的支持。”SOFA 开源以来，就我目前了解到的情况，大概已经有 30 家左右的企业用户在使用这套开源框架——就是直接拿开源的部分去用了。当然这主要是国内的用户，那么在国外影响力没有像国内这么大的原因在哪儿呢？是因为我们的项目不够国际化呢，还是知道这个框架的人不够多呢？鲁直说：“我觉得可能是两方面的原因。一方面，我们的确在国际化方面做的并不是很多，在今年我们会去尝试做更多的国际化工作。另外一方面，更多的是文化方面的差异，大家的思维方式可能不太一样。当然我们会尝试走一下国际化的路线，因为开源本来就是不分国界的。”进一步，SOFA 在社区治理这方面，“我们希望能够采用和参考 Apache 基金会的方式，这是一个很完善的治理模式，我们会尝试采用这样的方式去社区治理。这对于国际化产品是有很多好处的，它更多强调的是一种治理模式，是不是以社区的方式在运作，是不是在尊重整个社区等等。”鲁直表示，“我们会考虑跟 Apache 基金会、CNCF 进行直接接触，如果合适的话，我们会捐献项目给基金会。如果只是一家商业公司而没有基金会的支持，大家也会有更多的顾虑。把项目捐献给基金会，给大家更多的信心，通过基金会的托管，让更多一些参与方参与，而不只是有蚂蚁金服，大家也会有更大的信心参与进来。” 最后，鲁直希望致语开源社区，“其实蚂蚁金服开源的东西，也不只是 SOFA 中间件框架，未来会开源更多的东西，包括 AI 方面的一些技术，也希望整个社区能够多关注蚂蚁金服在开源上面未来的举措。”“穿山甲专访”栏目是 Linux 中国社区推出的面向开源界、互联网技术圈的重要领军人物的系列采访，将为大家介绍中国开源领域中一些积极推动开源，谙熟开源思想的技术人，并辨析其思考、挖掘其动因，揭示其背后所发生的事情，为关注开源、有志于开源的企业和技术人标出一条路径。取名为“穿山甲”寓意有二：取穿山甲挖掘、深入之意来象征技术进步和表征技术领袖的作用；穿山甲是珍稀保护动物，宣传公益。
蚂蚁金服总监杨冰：金融科技公司为什么要拥抱开源？
引言最近，我听到了一个消息，蚂蚁金服将会开源 SOFA最核心的两个组件——分布式事务框架和服务注册中心。熟悉中间件的朋友们都知道，这两个组件都是针对当前最火的微服务架构。其中，分布式事物框架是解决数据一致性问题的关键。服务注册中心则是服务治理的基础。在这两块开源后，SOFA 将成为一套真正完备的分布式解决方案。作为开源人士，我对此消息深感兴趣，因此联系到了蚂蚁金服中间件团队的杨冰总监，就此消息向他求证。机缘凑巧之下，杨冰花费了宝贵的时间，和我深入讲述了 SOFA 开源的思考，以及近期的规划。通过这次交谈，也让我看到了一个成功的商业公司是如何拥抱开源、并将开源作为其根本战略来撬动技术红利，支持其急速发展的业务需求的。以下是正文，我将它分享出来以飨读者。如今，开源已经成为主流，可以说，整个信息产业已经从过去的闭源模式转换为现今的开源模式。各种开源公司纷纷创新不同的开源模式，其中以 RedHat、Google、Facebook 等公司所取得的成绩最为耀眼。2018 年的时候，我曾经参与“开源社”主持的《2018 中国开源年度报告》的撰写工作，并建立了一个数学分析模型，以此来对中国的互联网公司的开源项目分析其活跃度和健康度。让我既感意外，也不意外的是，阿里系的开源项目占据了活跃度排行榜前五的第一、第二和第四；甚至在前五十个项目中，阿里系的开源项目占据了超过一半的份额！我不意外的是，业界一直对阿里在开源方面的动作和力度颇有感受；意外的是，这种力度还是超乎了我的想象。这其中包括阿里巴巴集团和蚂蚁金服等都贡献了相当可观的开源项目。因此，这次遇到杨冰时，我就开源方面和他深入聊了几句，想了解一下蚂蚁金服是如何思考开源和践行开源的，是如何将开源与公司的商业价值有机地结合起来的。缘何开源作为一家商业公司，宣称自己开源，甚至也形式上开源一些代码，其实已经是很常见的事情了。但是，真正能将开源与公司的技术演进相融合，并能有效地助推公司业务发展的，却并不太多。这件事其实并没有那么简单——远非只是上传到 GitHub 那么简单。根据业界的经验，在公司的技术产品开源方面，要将现有场景的代码开源，至少需要在已经运行稳定、结构清晰的现有代码基础上多付出 30% 的技术投入，对代码进行梳理、完善和通用化，才能做到初步的代码开源；而进一步要将这些开源代码维护下去，乃至于和公司业务线上的产品代码保持同步发展，多付出的技术成本还远远不止这些。作为一个互联网技术老兵，我对此深以为然。那么，蚂蚁金服是如何说服公司决策层在尚未看到开源回报的前景下，同意付出这么多的额外代价来支持开源的呢？推动开源的力量是因何而来的？“首先，开源是个共赢的模式，对于蚂蚁金服来说，开源可以扩大技术服务场景，为支付、金融等更多的客户提供服务，提升合作伙伴的效率。”杨冰说，“虽然，蚂蚁金服已经有很多的业务场景，也在很多场景下取得了超大规模的实践经验，但是，依然存在没有覆盖到的金融服务场景。而将技术开源出来，可以供更多的客户应用到其自身的场景下——这些场景有效的补充了蚂蚁金服的技术应用面，也为更完善的技术框架奠定了基础。因此，我们选择将 SOFA 中间件框架逐步开源出来，在贡献给社区的同时，也期待社区、合作伙伴甚至客户，都能够一起参与共建，形成行业标准和最佳实践。”“其次，对金融服务来说，监管和自主可控的要求更多，”杨冰接着谈到，“客户也希望可以对其所采用的技术有更多的掌控。”开源是一种可以使客户和上下游产业共同参与和发展的可行模式。“所以，其实并不是技术部门去说服公司决策层去开源，而是业务发展的自然选择，这也是一种合理的发展方向。”他总结道。这样的结果，其实是和当前流行的开源商业模式所暗合的。“另外，如你所说，确实在开源时，我们做了很大的改造。以可扩展化的方式来层层构建 SOFA 框架的能力，保证 SOFA 的内部版本和开源的版本采用的是同一个内核。在开源时，剥离了特定业务的逻辑，而保持了公司内部的业务线上的代码和开源代码的核心是一致的。这样，只要公司的业务在持续发展，开源的代码就会一直维护和演进下去。所以 SOFA 的内部版本就是在开源版本之上扩展了内部逻辑和历史版本的兼容逻辑。开源版本的核心逻辑，内外是一致的，并在蚂蚁金服的生产环境中被广泛使用，同时会随着蚂蚁金服自身业务诉求的驱动不断的演进。”杨冰补充道，“但这是值得的，在为开源代码做改进时，也是为公司自己的业务做改进，这是双赢且可持续发展的。”很多公司在初涉开源时，常常有疑虑，将核心技术开放出去，会不会导致竞争对手的技术提升，会不会造成更大的技术竞争压力？“事实上，我们在最初准备开源时，也有讨论过这个方面。技术要被更多人用、更多场景用，才会有发展。而开放的技术才能带来团队的发展，因为技术是动态发展的，作为开源的一方，事实上在技术上是相对领先的。开源和掌握是两码事，掌握和用好又是两码事，所以，因开源而带来的竞争，其实是助推整个开源体系的发展的，是良性的、有益的。”杨冰说，“而从社区和行业现状看，大家都在开放，封闭的技术体系会逐渐落后。只有开放才能求同存异，共同发展。”花絮我问蚂蚁金服的朋友，在你们开源中有什么有趣的“段子”吗？可以讲来听听。我朋友过了几天后，给我发来了这样一段文字：“参与双十一的中间件团队的常态是什么呢？当晚，团队的常态大概就是喝着茶等零点高峰，高峰期过了之后，当然就是参与买买买啦。我们很多的一些事情的初始的想法都是来自于双十一当天的夜聊，似乎在经历了紧张的零点高峰之后，脑细胞特别活跃。对于基础设施团队来说，双十一算是一次大考的结束，考完成绩出来了，我们就想琢磨一些有挑战的事情，于是我们会天马行空地聊一聊对于下一年在技术上需要去做的事情。而在 2017 年的双十一当天，SOFA 的几个同学就围在一起聊了 SOFA 能不能开源？为什么要开源？开源和商业化之间的关系？开源后要做哪些事情等等，这个算是 SOFA 开源的第一次内部讨论。从这次内部讨论之后，经过了大约半年的准备时间，我们在 2018 年 4 月份正式宣布开源并一直在逐步开源的进程中。”他说，这就是他们憋了半天想出来的“段子”，哈哈哈，这群可爱的技术人啊。SOFA 的演进和开源之路SOFA 中间件框架是蚂蚁金服自主研发的金融级分布式中间件，包含了构建金融级云原生架构所需的各个组件，是一套分布式架构的完整的解决方案，也是在金融场景里锤炼出来的最佳实践。SOFA开源全景图，涵盖了微服务领域的各个方面，同时也积极和业界流行的开源组件结合，包括阿里巴巴集团开源的Nacos、Sentinel等，为用户提供更加广泛地选择。SOFA 作为一个演进了几年的框架，也一定程度上代表了蚂蚁金服的技术体系的演变，并且现在形成了开源核心、开放式（组件式）开源的模式。SOFA 从 2018 年开始开源，但是我比较好奇 SOFA 开源之前的发展旅程是怎样的。杨冰说，“最早的时候，在蚂蚁金服还没有从淘宝分拆出来时，公司内使用过一个名为 Webx 的框架，但是随着业务的发展和技术的演讲，这套框架已经不太适应淘宝的需求。那个时候胡喜（现蚂蚁金服副 CTO）就重新创建了一个新的框架——SOFA 中间件框架。”SOFA 中间件在蚂蚁内部经历了十年的发展和五代架构的演进，被广泛应用在包括支付、借贷、信用、基金、保险等全金融场景，支撑着蚂蚁平稳度过历次双十一、双十二、新春红包等大考，创造了 25.6 万笔每秒的交易记录，并还在不断刷新这个记录。“SOFA 的版本迭代和公司的架构发展是密切相关的。比如说我们从 SOFA1 刚刚开始的时候，会做模块化的事情。到了 SOFA2 开始引入整个微服务的体系。到 SOFA3 我们希望能够在微服务体系下，能够把一些服务聚合在一起，组成一个链路出来，这就是我们说的合并部署。”“随着每年的交易量的不断上升，让我们必须从单体架构转到服务化架构，然后演进到单元化架构、弹性架构。SOFA 大部分的功能升级都是伴随着整个公司的技术架构目标上的更大挑战进行的。”杨冰说，“我个人是经历了 SOFA1 到 SOFA2 开发过程，从 SOFA1 整体完成落地，到 SOFA2 引入了服务的架构。到了 SOFA3 我们把 Tomcat JBoss 那层替换掉，变成自研的应用服务器，解决了我们内部系统做类隔离、模块隔离以及合并部署的问题。”SOFA4：迈入开源正如前面所谈到的，开源既有的代码是需要做许多繁重的工作的，所以， SOFA 直到发展到第四代才为开源做好了准备，并将开源作为 SOFA4 的核心目标。“SOFA 发展了这么多年，是有非常重的历史包袱的，这也是我们为开源准备了非常长时间的原因。在从 SOFA3 到 SOFA4 的整个过程当中，在把整个 SOFA 做轻量化的过程当中，其实就是在为开源做准备。有一些公用的能力（和蚂蚁金服的整个架构或业务没有强相关的部分）我们都希望可以开源出来。我们做开源这件事情不会把我们代码分为完全两套东西，然后两个分别演进，我们觉得这不是开源的正确做法。”杨冰说，“另外，开源对我们整个团队的消耗是非常大的，我们希望用同一套代码来实现内部的兼容和外部的开源，我们会在开源的代码当中留一些比较好的扩展点，这也是对我们本身代码架构可扩展性的挑战，目前我们做到的程度就是这样的。”SOFA 从 2018 年 4 月开始对外开源，得益于社区和开发者的认同，在经历了半年多的时间，SOFA 所有相关的开源代码，获得了累计 10000+ 的 Star和 80 多个代码贡献者。在线上社区方面，SOFA 开源的站点（https://www.sofastack.tech/）也是在不断沉淀相关的文章和文档。杨冰说，“原先我们觉得开源就是最好的，然而在 SOFA 演进的过程中，我们发现我们的场景足以构建出来比开源软件复杂度更高、能力更强的体系。我自己也在参与这个的过程当中收获了很多。这件事情也是从一个侧面反映了蚂蚁金服技术演进的历程。我们从最早的 IOE 架构，到部分采用开源软件，再到逐步开始全套自研。在自研过程当中，拥抱部分开源软件，并且去做深度的创造，做一些自己的创新。整个过程其实是一条非常艰难的路。”杨冰说，“我认为整个基础设施是应该走开源化道路的，因为从 Linux 到 Kubernetes，已经被一次又一次地证明。越底层的基础代码，包括 SOFA 中间件这样的东西，看起来逻辑没有业务系统那么复杂，然而其实它考虑的一些细节、设计的优雅性、架构的健壮性其实是非常强的。而且，它一旦要去支撑那么多业务系统，整个工程的复杂度也是非常高的，很难用一家公司的程序员去搞定整个技术栈。SOFA 也是一样的，我们越来越发现这方面的一些趋势。我们靠一己之力去做是很难的，再加上我们既要对内支撑又要对外支持。现在明白了这样一个趋势，因此我觉得应该回馈社区，和社区共建才是比较好的一条路。以 Linux 为代表的疯狂发展，以及伴随着而来的商业化生态的繁荣，是一次又一次向世界证明，开源和商业化的结合是可以非常完美的。”SOFA5：拥抱 Service Mesh从多年前的 SOA 架构，到现在的容器化、微服务的技术演变，我们可以看到虽然技术在逐步变化，但是其主体指导思想还是一脉相承的。蚂蚁金服在微服务方面已经走到了探索的前沿，那么，当前的 Service Mesh 技术在 SOFA 的发展过程中会起到什么作用？“这两年我们在积极拥抱、布局 Mesh，在演进方向上，我个人比较关注 Mesh 这个方向，因为我个人认为这是把基础设施沉淀到我们整个技术平台当中非常关键的一环。这也是我们 SOFA5 的主要目标。”杨冰说，“随着容器技术的兴起，可以将以往的中间件组件拆分的更细、更灵动，而资源利用率和运维效率也得到了进一步的改善。”近年来，随着 Kubernetes 确立了其在容器领域的统治地位，以及Serverless 模式等不可变基础设施的架构进一步成熟，可以将服务在上层进一步进行抽象，为现在大规模的容器化、微服务化奠定了坚实的基础。也有一些业界的意见认为，Service Mesh 将会取代中间件。杨冰认为，“蚂蚁金服已经在中间件方面探索的比较深远，规模也相当的大，为拿到业务红利做了很多优化，这些能力还是会存在，只是通过换了一种跟应用集成的方式，让 SDK 变得更轻。随着基础技术平台逐步走向云化，我们认为 ServiceMesh 将会是连接现在这个时代和云原生时代的桥梁，而且无论中间件还是很多基础技术组件都将走向 Serverless。Serverless 对开发者而言将是一种全新编程模型，对运维人员而言则是颠覆性的运维模式，甚至是一种 Opsless，我相信广义的 Serverless 模式会成为云原生时代的主角。”Service Mesh 这个新兴领域是很大的一个热点。蚂蚁金服和社区一起共同发起了 http://www.servicemesher.com/ 这样一个针对中国的Service Mesh 领域开发者的社群，有很多的志愿者，蚂蚁金服是其中之一。在蚂蚁金服的Service Mesh领域，涉及两个开源项目SOFAMesh和SOFAMosn。这两个项目的定位是这样：SOFAMesh 项目：是蚂蚁金服 Service Mesh 的控制平面，分支自 Istio 项目。在Istio体系和框架内进行了功能补充、扩展、增强和改进，立足于探索并解决 Istio 生产落地，尤其是大规模落地中遇到的实际问题，在充分验证之后贡献回 Istio 上游。SOFAMosn 项目：蚂蚁金服新型的基础设施和中间件的底层网络通用解决方案，可以有多种产品形态。在蚂蚁金服 Service Mesh 中承担数据平面的角色，和 SOFAMesh 项目配合使用，兼容 Istio 体系。此外 SOFAMosn 还将用于 Ingress / API Gateway / Serverless Function Gateway 等场景。目前蚂蚁金服开发团队已经和 Istio 开发团队建立联系，在 Istio 大规模落地方面进行合作和探索，相关实践和创新会在生产验证/代码稳定之后会贡献出来。Service Mesh 是一个非常新的技术，Istio 也是一个新兴的项目，在生产落地上存在很多需要了解的细节和可能遇到的各种问题。而且有些需求是有共性的，如 RPC 协议的支持，旧有非微服务应用的支持, 现有应用升级 Istio 的平滑迁移等。“我们开源 SOFAMesh 和 SOFAMosn，一方面是希望可以将我们在 Service Mesh 和 Istio 落地的知识和经验分享出去看，另一方面希望通过开源共建的方式一起来将这个两个项目做的更完善。”杨冰说，“我们虽然现在开源出来的版本还不多，但是未来我们会把整个金融分布式云原生架构的领域补齐，一方面会把内部同领域产品更完整的开放出来，另一方面和每一个领域的社区实现都做到兼容和可互相集成。”NEXT：分布式事务以及服务注册中心开源蚂蚁在 2007 年就开始在核心的业务中去使用自研的分布式事务框架去解决服务化以及数据库拆分后的数据一致性问题，经过 10 多年的演进，SOFA 的分布式事务框架得到了蚂蚁内部业务广泛地使用与锻炼，包括蚂蚁金服最核心的交易、支付、账务系统等，在期间，SOFA 分布式事务框架也演化出了针对不用的业务场景的使用模式，兼顾研发效率与性能。而阿里巴巴前几个月也开源了其分布式事务框架 Fescar，蚂蚁金服和阿里巴巴将在分布式事务这个领域上强强联手，SOFA 的分布式事务框架将与 Fescar 合并，为业界提供更加优秀，更加全面的开源分布式事务解决方案。服务注册中心是微服务领域的重要组成部分，SOFA 的服务注册中心最早源自于淘宝的初版 ConfigServer，在支付宝/蚂蚁金服的业务发展驱动下，近十年间已经演进至第五代，具备无限水平扩展，高效的推送以及基于 AP 架构高可用能力，同时结合 SOFARPC 具备异地多活单元化架构支撑能力，SOFA 服务注册中心的开源将会极大丰富整个 SOFA 开源的生态体系，也为微服务领域带来一个全新的服务发现解决方案。总结纵观蚂蚁金服的 SOFA 中间件开源的历程，我们看到了一个大型的商业公司是如何将开源核心模式和其商业模式紧密结合的；其走过的从采用专有软件、应用部分开源软件、演化自身的自研软件，到开源核心软件、全面拥抱开源世界的路径值得很多技术企业学习和思考。“穿山甲专访”栏目是 Linux 中国社区推出的面向开源界、互联网技术圈的重要领军人物的系列采访，将为大家介绍中国开源领域中一些积极推动开源，谙熟开源思想的技术人，并辨析其思考、挖掘其动因，揭示其背后所发生的事情，为关注开源、有志于开源的企业和技术人标出一条路径。取名为“穿山甲”寓意有二：取穿山甲挖掘、深入之意来象征技术进步和表征技术领袖的作用；穿山甲是珍稀保护动物，宣传公益。