在2018年初,淘宝开始进行整个架构的升级,代号为Tango,即Taobao ***rchitecture Next GeneratiOn。经过近一年的探索,该架构实现了全面异步化,部分应用中性能提升了40%以上,同时也为后续的回压推进打下了基础。该项架构升级由淘宝技术专家许泽彬负责。在2018领域驱动设计中国峰会上,许泽彬分享了《淘宝应用架构升级——反应式架构的探索与实践》的内容。InfoQ采访了他,了解了更多细节。
ThoughtWorks 主办了 2018 年领域驱动设计中国峰会 (DDD2018),该技术会议旨在为国内的 DDD 实践者们提供一个平台,让他们可以互相交流、分享自己团队的成功经验。
许泽彬是淘宝技术专家,目前正在领导淘宝应用架构升级的工作。他曾经参与过淘宝用户增长设施与平台建设,并且负责过分布式调用链跟踪框架和系统“鹰眼”的开发工作。此外,他还是阿里分布式数据库中美异地机房数据同步的核心开发者之一,同时也是阿里旗下开源项目 otter 和 canal 的核心开发者之一。
淘宝最近进行了架构升级,主要是将同步架构改为异步架构,采用面向流的开发方式。这次升级的重点是为了为后续的回压方案打下基础。回压方案的目的是解决应用在突发流量下的稳定性问题,并最大化提高资源利用率。这种架构被许泽彬称为反应式架构。新的架构升级不会改变原有的意思,但是表达方式更加简洁明了。
经过近一年的努力,反应式架构已经在生产环境得到了广泛应用。在2018年双11期间,这种架构升级已经成功验证了多个核心应用,取得了超出预期的效果。例如,经过升级的“猜你喜欢”应用的QPS上限提升了96%,这意味着现在只需要一半的机器就能够支撑原有的业务。另外,另一个核心应用“我的淘宝”的实际响应时间下降了40%以上,这意味着用户现在可以更快地得到响应。在淘宝内部,这只是反应式架构的第一步,未来还将继续努力,以应对突发流量和提高资源利用率。
1 什么是反应式架构
在反应式架构中,"Reactive"一词指的是反应式。在国内,对这个词的翻译并不统一,有些人称之为响应式,有些人称之为反应式。但许泽彬认为,将其称为反应式更为准确,因为响应式更多用于前端界面中,对应的英文是Responsive。
反应式架构与一般架构相比,其最大的不同在于其强调系统的响应能力和弹性。反应式架构的设计目标是构建能够快速响应变化和负载的系统,这些系统能够自适应地处理高并发和大规模的请求。相比之下,一般架构更注重系统的稳定性和可靠性,其设计目标是构建能够长期稳定运行的系统。因此,反应式架构通常采用异步、非阻塞的编程模型,利用事件驱动和消息传递等技术来实现高并发和高吞吐量。同时,反应式架构还注重容错和故障恢复能力,能够在出现故障时快速恢复并保持系统的可用性。
- 第一个,对用户有反应,对用户有反应我们才说响应,一般我们说的响应,基本上都说得针对跟用户来交互。
- 第二个,要对失败有反应,应用失败了系统不能无动于衷,等着它挂掉,要有反应。
- 第三个,要对容量和压力变化有所反应,比如说淘宝的秒杀,系统需要反应来保证对用户的响应性,再如那个当流量降下来,将系统缩容,可以节约成本,这也是一种反应。
- 第四个,对输入有反应,响应系统的输入,也可以叫做消息驱动。
要做到反应式,需要做到以下三点:
1. 快速反应:在面对突发事件或问题时,要能够快速做出反应,采取有效措施,避免事态扩大。
2. 主动预防:在日常工作中,要能够提前预见潜在的问题或风险,并采取相应的措施进行预防,避免问题的发生。
3. 持续改进:要不断总结经验教训,找出问题的根本原因,并采取措施进行改进,以提高工作效率和质量。
- 适应性,也就是发生失败能恢复回来,无论是系统、网络、代码出现了问题都能恢复。
- 弹性,这点主要是应对流量的变化,弹性的前提是做到可伸缩性 Scalability,从软件设计上,要做到去中心化;同时,在运行时,要感知节点当前的系统负载,将压力往上游进行反馈,做到系统可以感知链路级别的节点压力,使得系统可以针对整体压力进行有目的地扩容缩容。这样才能够做到真正的弹性,根据系统负载进行扩容或缩容,这也是淘宝的回压方案在后续所需要支撑的场景。
- 消息驱动,有了消息驱动才能比较好的做到上面两个点。在反应式架构里,以前这点叫做事件驱动,后来改为消息驱动,消息驱动强调无阻塞、无 callback,所以不会有线程挂在那里,不会有持续的资源消耗。同时,事件驱动或消息驱动都是异步化,而异步化会将操作系统中的队列情况显式地提升到了应用层,使得应用层可以显式根据队列的情况来进行压力负载的感知,这对于淘宝后续的回压方案非常重要,而要做到这点,就需要异步了。
在反应式架构中,流是一个核心概念。它是一系列操作的有序组合,这些操作是针对数据的。与传统的编程方式不同,反应式编程将数据的变化作为操作的结果,而不是业务逻辑的结果。这种面向流的编程方式,实际上就是面向数据的编程。
面向流的开发有以下优势:
1. 高效性:面向流的开发可以实现数据的实时处理和传输,避免了数据的批量处理和存储,从而提高了数据处理的效率。
2. 可扩展性:面向流的开发可以轻松地进行水平扩展,即增加更多的处理节点来处理更多的数据,而不需要对整个系统进行重构。
3. 实时性:面向流的开发可以实现实时数据处理和分析,使得数据的处理和分析结果可以及时地反馈给用户,提高了用户的满意度。
4. 灵活性:面向流的开发可以根据不同的业务需求进行定制化开发,从而满足不同用户的需求。
5. 可靠性:面向流的开发可以实现数据的高可靠性处理和传输,避免了数据的丢失和错误,从而提高了数据处理的可靠性。
- 提供大量强大的操作符,包括创建、过滤、转换等。声明式表达比过程式编程更加完备、高级、快捷。
- 在并发控制方面,不同的流之间无依赖,通过切换 Scheduler 就可以自动多流并发,而业务按照语义编写,可以更友好的并发控制,更优的维护性和性能。
- 更高的资源利用率。通过更少的上下文切换、更低的竞争,可以降低负载,提升资源的有效利用率。
- 流可以加强分布式架构的治理能力。流引用可被远程化,从而实现系统级的流式贯通,而流提供的更好的回压、三角模式透传,以及天然的截面编程能力等,可以给架构治理提供更好的帮助。目前淘宝正在推进回压的方案,就是为了给系统在稳定性和资源利用率上提供更高级的治理手段。
2 淘宝反应式架构实践
淘宝之所以要进行架构升级,是因为现有架构存在一些问题需要解决:
- 同步等待造成资源浪费,现有的同步模型线程多负载高,导致资源利用率较低。
- 架构的并行度有限,无法实现纯业务依赖并发,微服务化让问题更加凸显,服务增加造成响应时间累积。
- 而响应时间累积又带来一些连锁反应,包括为了降低响应时间而过早的引入 cache,每个服务都需要设置超时来解决长时间无响应问题,而这些带来维护成本的提升,也提高了业务实现的复杂度。
- 同时,在应用系统无事先准备的情况下,面对突发大流量时,很容易被打挂,造成稳定性问题,导致用户体验严重下降。
经过研究后,淘宝架构团队认为采用反应式架构是一种可行的方案。这是因为Java 8已经逐渐普及,其中包括对Lambda的支持,这使得开发人员更容易接受Lambda。同时,业界已经有了成熟的Reactive相关业务框架,例如RxJava已经广泛应用于各种大小公司。最后,Java 9(引入Reactive Streams规范***PI)、Spring 5(引入Reactor/WebFlux)和Spring Boot 2都开始采用反应式编程,这表明反应式编程是未来的趋势。
升级业务架构的整个方案主要包括编程框架、中间件和业务方的升级。中间件的升级包括服务框架(RPC)、网关、缓存、消息(MQ)、数据库(JDBC)、限流组件、分布式跟踪系统和移动端 Rx 框架。
需要注意的是,在 Dubbo 3 中,服务框架将进行升级,并将推出流式实现;此外,DB 中的异步集成将使用 ***li JVM 协程或线程池实现;为了支持现有的 iOS 应用,淘宝开发了 ***liRxObjc,并计划开源。
最终,重新设计后的架构如下图所示:
实施反应式架构的难点主要包括以下几个方面:
1. 异步编程模型:反应式架构中的异步编程模型需要开发人员具备一定的异步编程经验和技能,否则会导致代码难以维护和调试。
2. 数据流管理:反应式架构中的数据流管理需要开发人员对数据流的处理和管理有深入的理解,否则会导致数据流的混乱和错误。
3. 响应式系统的复杂性:反应式系统的复杂性要求开发人员具备对系统整体的把握和理解,否则会导致系统的不稳定和性能问题。
4. 依赖管理:反应式架构中的依赖管理需要开发人员对依赖关系的管理和维护有深入的理解,否则会导致依赖关系的混乱和错误。
5. 测试和调试:反应式架构中的测试和调试需要开发人员具备一定的技能和经验,否则会导致测试和调试的困难和耗时。
反应式架构已经在各个模块上得到广泛应用,并且在大多数领域中都有成熟的解决方案,只有少数领域,如数据库,可能会遇到一些特殊的挑战。实施反应式架构的主要难点在于工程师的思维转变。以前,工程师们主要使用同步式的思维方式编写程序,但现在他们需要转变为以流的方式编写程序,这需要进行思维上的转换。因此,反应式架构的成功实施需要工程师们不断学习和适应新的编程思维方式。
为了实现全面异步化,组织必须全力支持。淘宝采取的方法是成立虚拟小组,从每个业务线中挑选能力较强的同事进行异步式培训和指导,然后由他们在团队内部推广。
为了让业务方积极参与异步化改造,我们需要让他们了解到这种改造的好处。因此,我们需要先取得一些标志性的成果。实现这一目标的策略包括选择面临瓶颈的地方、业务逻辑简单的应用程序以及业务压力不大的应用程序进行试点。一旦我们取得了成果,我们就可以为其他团队树立榜样,激发他们的信心和动力。
淘宝反应式架构升级后续规划已经确定。根据计划,淘宝将继续推进反应式架构的升级和优化,以提高系统的性能和稳定性。具体规划包括以下几个方面:
1. 引入新技术:淘宝将引入更多的新技术,如Kafka、Hadoop等,以支持更高效的数据处理和分析。
2. 优化系统架构:淘宝将继续优化系统架构,包括优化数据存储、提高系统可扩展性等方面。
3. 加强监控和预警:淘宝将加强系统的监控和预警机制,及时发现和解决问题,确保系统的稳定性和可靠性。
4. 推进智能化:淘宝将推进智能化技术的应用,如机器学习、人工智能等,以提高系统的智能化程度和用户体验。
通过以上规划,淘宝将不断提升反应式架构的能力和水平,为用户提供更加优质的服务。
目前,淘宝已经完成了大部分的技术异步化改造。未来,淘宝的规划主要包括以下方面:
1. 提升用户体验:淘宝将继续优化页面加载速度和交互体验,提高用户满意度。
2. 加强数据安全:淘宝将加强数据安全措施,保护用户隐私和数据安全。
3. 推进智能化升级:淘宝将继续推进智能化升级,提高搜索和推荐算法的准确性和效率。
4. 拓展海外市场:淘宝将加强对海外市场的拓展,提高海外用户的购物体验和服务质量。
5. 加强社交化营销:淘宝将加强社交化营销,提高用户参与度和粘性,增加用户购买转化率。
- 回压的实现
- 分布式上下游的联动回压,解决高并发压力下的响应时间、有效请求数、系统自恢复、链路短板自发现等问题,解决系统在突发流量下的稳定性问题,以及提高资源利用率。
- 自适应回压解决静态配置无法应对系统波动变化问题
- 实现全异步 / 流式为核心的服务框架,让业务方做到异步优先;
- 考虑引入 Kotlin 协程,它的异步设计符合过程式的编程习惯。
淘宝正在积极推进和实施回压方案,未来还将分享更多Tango的经验。欢迎持续关注。
如若转载,请注明出处:https://www.kuaichafanwen.com/50285.html