写点什么

同程旅行云原生改造:半年完成全部核心业务改造、抗住爆品 300% 流量冲击

2021 年 9 月 30 日

同程旅行云原生改造:半年完成全部核心业务改造、抗住爆品300%流量冲击

采访嘉宾 | 彭涛

 

2018 年 3 月,同程集团旗下同程网络与艺龙旅行网合并为同程旅行,同年登陆香港联交所主板挂牌上市,成为港股“OTA 第一股”。财报显示,2021 年上半年,同程艺龙 MAU 约为 2.56 亿,其中在第二季度,MAU 达到 2.8 亿,同比增长 58.3%,创下了历史新高。上半年,同程旅行的各项核心业务增长均远超行业增速,并超越疫情前水平。

 

业务量的增长让同程旅行的技术团队感到欣喜,但另一方面这也意味着团队需要直面高流量带来的新挑战,云原生改造成了解决问题的关键。虽然同程旅行从 2019 年年底才开始进行云原生改造,至今还不到两年,但成果显著,成功帮助同程旅行经受住了业务流量暴增的考验。近日,InfoQ 专访了同程旅行研发中心云原生平台负责人彭涛,一探同程旅行云原生的改造之路。(本文节选自《中国技术先锋团队访谈录》2021 年第五季)

 

半年完成全部核心应用改造

 

2019 年,同程旅行主要面临两个问题。首先,由于刚和艺龙网完成公司主体合并不久,两个前身公司各自存在着不同技术体系的构建、发布等系统,这些系统随着公司业务的逐步整合,也必须在技术层面做进一步的收敛,以达到平台统一的目的。同时,在线旅行业务具有较明显的业务波动特性,在季度、节假日、每日时段上都有比较突出的波峰波谷特性。这样的业务特性对技术资源的整体利用率波动影响较大。

 

当时,企业服务云化成为业界技术发展较为主流的新趋势。基础服务的云化支持和业务应用的云原生改造成为技术团队较为紧迫的工作。2019 年底,同程旅行基于原有两个前身公司容器化基础上的云原生的二次改造工作正式启动。

 

2019 年底到 2020 年中的这半年里,技术团队定下的总体目标是提升集群资源利用率,降低资源使用成本。围绕这个目标,团队计划利用云原生思维重构部分技术体系,将多套旧有系统合并、收拢到一套以云原生应用为核心的私有云平台上,同时将 IDC、物理网络、虚拟网络、计算资源、存储资源等通过 IaaS 、PaaS 等,实现虚拟化封装、切割、再投产的自动化流程。

 

说起来似乎不难,但整个过程需要多个技术工种的支持和配合。

 

基础层面,为了支持 IaaS 层的网络虚拟化,运维人员选择了 Vxlan、大二层技术,并用 KVM 作为计算资源的切割。在容器网络虚拟化这部分,考虑到要降低损耗,采用了 BGP、Host 网络模式等技术,同时开发了绑核、NUMA 等相关技术。容器存储方面,远端存储选择了 Ceph,本地层使用块存储设备、NUMA 设备等。异构资源侧则采用了 GPU 改 CUDA library 的方式来完成虚拟化的切分和分时复用。技术团队将资源调度变成了利用时序数据预测应用规模的方式,提升了资源利用率。

 

这一阶段的最大成果就是完成了有显著潮汐特征的订单服务的改造。通过改造,订单业务从原先独享机器集群切换到了共享机器集群,仅使用之前独享机器集群 40%的机器就完成了对全线服务业务的支撑,同时由于调度算法加入了自研的服务画像技术作为默认调度属性,资源调度的稳定性不降反升。

 

改造进行半年之后,同程旅行已实现纳入到该平台部分单机资源利用率提升了 20%,并通过云原生化的旧应用改造,下掉了当时集群内一半的服务器和相应的机房水电资源。

 

虽然看起来顺利,但是技术团队其实也面临着很多问题。比如在改造完成后服务部署时,团队发现大批量的物理机都出现负载上升的情况,经过排查发现是低版本的 Java 程序无法准确识别容器里的规格,导致 GC 时频繁发生资源争抢。

 

当时正在做业务迁移,这个问题导致部分业务的稳定性感受不太好。”彭涛说道。由于无法确定其他语言是否会出现同样的问题,研发团队紧急开发了垂直扩缩容,确保 GC 可以使用更多的计算资源。另一方面,研发团队与业务团队一起进行了 JVM 版本升级,两项措施双管齐下,才没有耽误迁移进度。事后,研发团队还引入了隔离性较强的 Kata Container 来彻底解决该问题。



同程旅行云原生平台架构图,来源:同程旅行

 

流量突增,团队迎来大考

 

从 2020 年中到年底这段时间,可以认为是同程旅行云原生改造的第二个阶段。

 

第一阶段改造完成后,平台开始服务同程旅行的大部分在线业务。随着服务器集群规模的扩大,部分机器开始频繁出现故障。此时,保障服务稳定性成了技术团队的首要任务。

 

基于公有云、私有云和离线专属云集群等新型动态计算环境,同程旅行的技术团队帮助业务构建和运行具有弹性的云原生应用,促进业务团队开始使用声明式 API ,同时通过不可变基础设施、服务网格和容器服务,来构建容错性好、易于管理和观察的应用系统,并结合平台可靠的自动化恢复、弹性计算来完成整个服务稳定性的提升。

 

具体工作上,技术团队将公有云的镜像预热、分发,专线直连内网机房,解决了内网集群需要镜像快速分发等问题,依赖的缓存资源和持久化数据实现了常驻云上,离线资源所在的专有云集群也同步被打通。同时,依托弹性计算能力,团队将集群间资源使用成本降到最低,并将最高服务稳定性的智能化调度平台的服务动态部署在多个集群上。针对业务专有需求和特殊,平台可以输出基础设施 API 和基础能力 API,供业务构建自己的云服务。

 

上述工作完成之后,原本用来应对季节性流量高峰期而采购的机器资源开始减少。通过判断服务当前冗余度来缩容线上服务的实例数,平台可以用最小的实例数量提供线上服务,而节省下来的资源可以提供给离线业务混合部署使用。

 

“在不额外新增机器的情况下额外获得的算力,成功支持了屡次创纪录的峰值流量。”彭涛说道。同时,团队开发的 Service Balance 系统可以在服务性能受损时自动尝试修复该节点性能,使得平台能够以较低的成本稳定运行。

 


同程旅行流量变化趋势图,来源:同程旅行

 

在 2020 年,同程旅行的部分业务跟进了直播方式。由于业务转变较快,应用架构尚未来得及调整,导致部分应用出现了明显的卡顿,影响到用户体验。为解决该问题,技术团队首先通过弹性计算改造为业务快速提供支持,之后又尝试了 Scale Zero 等方式,最终将该业务的资源使用量降到了之前常备资源的 20%。这也是在第二阶段中取得的重要成果。

 

得益于这次经历,弹性计算项目在同程旅行内部快速推广开来,企业核心业务的主要链路在三个月内就完成了云原生弹性计算接入,并借用弹性计算成功撑住爆款应用带来的日常流量 300%的峰值流量,也顶住了 2021 年上半年的屡次刷新公司峰值流量,为公司同类业务场景提供了坚实的技术支撑。

 

2021 年上半年,同程旅行进入到云原生改造的第三个阶段。团队通过基础组件、服务的云原生改造、服务依赖梳理和定义等方式,使应用不再需要考虑底层资源、机房、运行时间和供应商等因素。此外,同程旅行还利用标准的云原生应用模型,实现了服务的跨地域、跨云自动化灾备、自动部署,并向云原生场景下的 DevOps 演进。

 

考虑到五一出行和爆款产品带来的叠加流量,加上全球 GPU 资源供应紧张带来的影响,同程旅行将混合云改造计划提前。通过打通公有云的弹性容器集群,平台实现了 GPU 资源按需申请。通过使用混合云服务,同程旅行的基础资源使用成本和维护成本都进一步大幅降低。

 

目前,同程旅行核心业务均已完成了第二阶段的改造,部分小业务线还在持续推进中。改造完成的项目现在由平台控制在不同的机器、集群、云上进行着符合预期的流转和动态的部署。团队还完成了对机器数量较多的两个离线集群云原生改造。

 


同程旅行容器化专项组获年度最佳收益项目奖,来源:同程旅行

 

面对云原生改造过程中可能存在的新旧架构并存情况,彭涛给出了以下五条建议:

 

  1. 所有的迁移改造方案都要有对应的回滚方案,这样业务才可以大胆尝试;

  2. 新老架构转换要努力做到一键化和无感化,产品、功能等提前培训;

  3. 研发团队要通过直接面对平台用户、自己先用自己的平台等方式,尽快发现问题。提需求、开发、测试、上线交付的各个时间点都要明确。事后要回访,响应每个用户的意见;

  4. 研发团队需要积极参与平台资源使用的整个生命周期,降低平台的使用复杂度;

  5. 提前做好沟通。各业务的服务观察周期不同,可以利用时间空隙进行服务的新老架构切换。

 

目前,同程旅行的云原生改造计划仍在持续深入进行。技术团队计划在明年实施存储类基础服务的云原生化改造,借助云平台提供的声明式接口加速软件交付流程,同时将业务代码下沉至函数级,运维能力由集成平台统一提供。

 

“这个过程的侧重点在于人效的提升。我们感觉比较好的落地方向是前端和机器学习。结合之前的经验,技术团队可以构建一个拖拽式的特定业务场景组件和界面编程平台,通过简单的编码就可以构建出整体服务的 pipeline,相关组件的运维能够对接到统一的平台运行。”彭涛解释道。

 

除了推进内部改造外,同程旅行也计划提供一些行业专属的云原生服务,推动整个上下游链路完成技术升级,未来也计划将一些项目开源,回馈给社区。

 

“积极参与到这次技术变革中”

 

在彭涛看来,云原生改造给团队带来的最大影响就是,原来权责清晰的研发、测试、运维的工作定位,开始变得模糊起来。

 

“三个部门都开始面向平台工作,三者之间的沟通协作也借由平台变得更加稳定和高效。”彭涛说道。从运维侧看,自动化处理占比开始增加,集群资源利用率提升的同时,稳定性并没有下降。从研发侧看,迭代交付速度提升,基础组件和基础服务可以通过 API 的方式调用,单体应用很方便就能拆解成小的微服务。团队开始借助云原生实现 DevOps,从而促使开发部门和运维部门建立密切协作,应用代码开发完成后能够非常快速、顺畅地转入生产。

 

云原生是一种构建和运行应用程序的整套技术体系和方法论。彭涛认为,云原生服务是希望研发人员能够关注自己的业务。从定义来看,云原生应用是通过标准化应用和服务构建容错性好、易于管理和便于观察的松耦合系统。结合可靠的自动化手段,云原生技术使研发能够轻松地对系统作出频繁和可预测的重大变更。如果云原生改造之后,研发人员需要关注的东西变多或者需要配置的东西更多了,那么就有点本末倒置了,因为复杂配置的背后不只是用另一套代码的问题。

 

“以后的程序员也许真的要面向云原生应用编程了。”彭涛感叹道。

 

“早期,大家自己写代码部署到虚拟机上,容器服务带来了更轻量的操作系统打包和分发方式,提升了软件的交付效率,再结合大量的自动化组件,使 DevOps、线上部署和运维效率倍增,应用移植性变得更强。目前流行的无服务器计算更是让用户无需管理和运维底层的计算资源。这种趋势下,程序员都需要将自己的思维转变成面向云原生应用编程,继而改变自己负责的服务。”

 

云原生技术带来的技术跨代,相比之前单纯满足业务需求开发工作,能够更加成系统化地解决用户痛点。不过彭涛也指出,云原生作为一种新的思维方式和编程理念,目前缺乏比较好的引导方式。如果一家公司希望进行云原生改造,首先就需要上下层达成思想上的共识。

 

当前时代的发展带来了越来越多的变化和机会,很多企业业务的更新速度已经从以“周”为单位提升至按“小时”计。在这种情况下,云原生带来的极致交付体验是值得大家花费时间和精力去学习、去实践的。云原生作为新生事物,虽然学习成本不是很高,但带来的变化却是巨大的。

 

“大家可以积极地参与到这次的技术变革中。”彭涛说道。

 

嘉宾简介

 

彭涛,同程艺龙架构师,2019 年加入艺龙,目前在研发中心负责资源调度相关工作,包括容器化平台建设、弹性扩缩容、离在线混部、GPU 隔离调度、弹性扩所容、虚拟网络等,尤其在推动业务落地有丰富的实战经验,主导设计的容器平台 Furt 已成为公司推动的主流产品,各项技术指标达到业内领先,已经受过相当规模的业务落地检验。在容器化方向有丰富的理论和实战经验,过去曾就职于百度基础架构部、新浪微博研发中心,参与开发和设计了百度公有云虚拟化网络、以及微博峰值流量与热点应对。Kubernetes 代码贡献者,Flink 代码贡献者。

 

在今年 11 月 12-13 日举办的 ArchSummit 全球架构师峰会(深圳站)中,彭涛将分享题为《同程私有云平台的弹性计算架构设计与落地实践》的演讲。大会还有业务架构、下一代云原生技术体系、应云而生的新一代数据架构、AI 工程化治理等专题,邀请到 Snowflake、阿里、字节、腾讯、华为等公司的资深架构师前来分享。点击阅读原文可查看大会详细日程。

 

迷你书推荐

中国顶尖技术团队访谈录(2021 年第四季)开放下载

 

这期《中国顶尖技术团队访谈录》精选了腾讯科恩、金蝶、海尔集团 IT、小红书、网易、阿里等技术团队在技术落地、团队建设方面的实践经验及心得体会。InfoQ 希望通过这样的记录,向外界传递顶尖技术团队的做事方法/技术实践,让开发者了解他们的知识积累、技术演进、产品锤炼与团队文化等,并从中获得有价值的见解。

 

如果你身处传统企业经历了完整的数字化转型过程或者正在互联网公司进行创新技术的研发,并希望 InfoQ 可以关注并采访你所在的技术团队,可以添加微信:caifangfang842852,请注明来意及公司名称。

 

2021 年 9 月 30 日 10:573698

评论

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

译文 | AI产品经理:如何打造一款SaaS+AI的优质产品

LigaAI

产品经理 研发管理

6月26日,HarmonyOS开发者日将于杭州举办

科技汇

用EasyRecovery“监控硬盘”功能检测硬盘问题的方法

淋雨

数据恢复 EasyRecovery 文件恢复

MySQL中的pid与socket是什么?

Simon

MySQL

请阐述vue的diff算法

法医

Vue 前端 6月日更

【Flutter 专题】103 初识 Flutter Mixin

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 6月日更

缓存的世界 Redis(二)-持久化

卢卡多多

redis redis持久化 配置文件持久化 6月日更

快来,这里有23种设计模式的Go语言实现

华为云开发者社区

Go 线程 设计模式 单例模式

618 技术特辑(一)不知不觉超预算3倍,你为何买买买停不下来?

华为云开发者社区

电商 图数据库 知识图谱 618 图引擎服务

618 技术特辑(二)几百万人同时下单的秒杀,为什么越来越容易抢到了

华为云开发者社区

数据库 服务器 流量 618 弹性负载均衡

JavaScript 学习(三)

空城机

JavaScript 前端 6月日更

阿里云视频云 Retina 多媒体 AI 体验馆开张啦!

阿里云视频云

阿里云 短视频 视频处理 媒体处理 视频制作

故事|订单系统中的补偿事务

悟空聊架构

故事 事务 6月日更 订单系统 补偿事务

Python训练营笔记 数据结构大汇总 Day6

万里无云万里天

Python 6月日更

并发王者课-铂金1:探本溯源-为何说Lock接口是Java中锁的基础

技术八点半

Java 多线程 并发 并发王者

Java包装类(Integer 详解 )

若尘

java编程 6月日更

Python——字典的使用

在即

6月日更

项目经理如何有效管理需求变更?

万事ONES

需求管理 ONES 项目经理

JAVA笔记(三)--变量及运算符

加百利

Java 程序员 后端 6月日更

针对 MySQL IO 特点进行的存储优化揭秘

焱融科技

MySQL 技术 分布式 高性能 文件存储

Java8 的时间库(1):介绍 Java8 中的时间类及常用 API

看山

Java 6月日更

连续七年,我们持续领跑

浪潮云

密码学系列之:feistel cipher

程序那些事

加密解密 密码学 程序那些事

我在阿里做架构 | 单测最佳实践

九叔

最佳实践 测试 单元测试

一分钟开发一个表单

Daniel

vue.js 表单 动态表单 6月日更

react源码解析13.hooks源码

全栈潇晨

React

PO 就是Scrum中的产品经理?别再搞不清啦

万事ONES

项目管理 Scrum 敏捷开发 PO ONES

【LeetCode】石子游戏Java题解

HQ数字卡

算法 LeetCode 6月日更

拍乐云受邀2021亚太CDN峰会,技术创新赋能行业新价值

拍乐云Pano

RTC

校友会小程序开发笔记一:背景与技术方案的选型

CC同学

小程序云开发 校友录小程序 校友会小程序

软件工程,其实没有任何工程而言

实力程序员

同程旅行云原生改造:半年完成全部核心业务改造、抗住爆品300%流量冲击-InfoQ