淘宝权益玩法平台的Serverless化实践

db242d5378cb50ac5869d7ab98af9553.gif

通过对权益玩法平台现有业务应用的Serverless化改造,权益团队在双十一期间完美地支撑了业务需求,在研发效率、运维保障等方面都体现出了很高的价值和收益。

66ec61034b16b665e6cb305af329129a.png

项目背景

淘宝权益平台是负责淘宝权益营销的核心团队,团队除了负责拉菲权益平台外,也越来越多地承接营销IP和轻互动营销等需求,这类需求除了内容上非常多样外、交付上也是又多又急,对技术的挑战性非常大。有别于平台型应用,营销IP类需求对业务模型和架构的要求相对不高,但是对开发产研的效率要求非常高,所以我们急需一套可靠的产研体系去支撑营销IP和轻互动的需求。

权益玩法平台就是在这样的背景下诞生的,其设计目标是通过对营销和玩法通用能力的沉淀和复用,构建出一整套营销玩法能力体系,来降低业务需求的开发成本,提升业务的交付效率。

5e178e8808148ff1cea0faa75e3f4e2c.png

17eef2e8aad7d8399d8da74f8325e54c.png

基于Ring容器化的尝试

为了实现既定的设计目标,权益玩法平台一开始设计了基于Ring容器化能力的方案,Ring是由我们团队自研开发的JVM容器化框架,支持对业务能力进行动态加载,其核心特点是JVM热部署和机器按需部署。Ring框架由一个宿主应用和多个业务容器组成,宿主应用提供整体的基础能力和共享能力,不同业务扩展由各自的容器(farjar载体)实现,通过控制不同的宿主应用分组挂载不同的业务jar包实现业务的隔离效果。借助Ring框架的热部署能力,可以实现秒级部署能力,效率上有极大的优势。

基于机器分组的业务隔离能力:

5058eaab050152cbb80c2849f7257eb5.png

基于基座应用和容器应用的产研隔离和热部署机制:

  1. 平台开发同学负责基座应用基础服务和共享服务的开发和运维

  2. 业务开发同学专注于业务逻辑开发,基于热加载能力部署到基座应用

fabb2facabdaf87f4e5ed0bd7089e448.png


  权益玩法平台基于Ring的业务形态

权益玩法平台在Ring的支持下,在同一应用内,实现了对核心业务的独立部署和对非核心业务混部方案,既满足了核心业务的稳定性要求,又节省了整体业务的维护成本和资源成本。

3556d59639001a137320b5de7642bf23.png

  Ring架构的优点

效率高:

  1. 由平台提供中间件和通用服务支持,降低了业务开发成本;

  2. 支持热部署发布,开发和交付效率高;

隔离性好:

  1. 基于机器分组的强隔离能力保障业务和流量隔离;

  Ring架构的不足
  1. Ring框架本身是为业务扩展设计的,但权益玩法平台多个业务间并非扩展关系,所以来说Ring并不是最佳的使用场景,使用上也存在系统权限、产研角色等一定的局限性;

  2. 为支持热部署,Ring框架在应用底层框架上做了很多的改造和定制,除了潜在的内存泄漏等风险外,这些需要业务开发时进行感知的特殊逻辑,也无形中提高了开发和运维的门槛和成本;

  小结

基于Ring架构的权益玩法平台应用已经能很好的支持业务发展,但同时也存在一些的不足和问题。为更好的支持业务发展,我们也在不断探索更好的架构和产研模式。也在这个过程中,刚好遇到Serverless的大范围推广,在经过调研和比较之后,我们决定拥抱Serverless重构我们的产研体系。

3f61baab2715307774636e00cf016a90.png

初识Serverless

Serverless是个相对比较广义的概念,从不同的角度可以有不同的解释。从我的粗浅的理解来说,Serverless可以简单认为是一种将应用与基础设施进行分离的架构理念,通过指导软件架构和职责分工,使开发者更聚焦在业务逻辑,从而减少对基础设施的关注,其核心要素是架构分层和产研分工:

4db026519b626dcf64b7500d9aa01827.png

从计算机发展的角度看,分层一直是永恒的话题,操作系统分层、网络分层、文件系统分层,分层让更多的底层实现得以屏蔽,让上层使用者只需要通过简单的API即可使用计算机复杂的能力,在这一过程中,分层变得越来越多、分工也变得越来越细,除了操作系统层面的分层,我们也看到了云服务提供了计算资源的分层,中间件提供了基础服务的分层,Serverless更进一步提供了业务运行时的分层。有了Serverless,业务开发者不用再关心中间件、机器资源、jvm容器,只需要把业务代码写好,剩下的都交给Serverless。

2725c218f6b0d3bd0ec3c52927018411.png

3c0ac621e91f23035e4b3f70e1c7a67e.jpeg

Serverless的设计目标

  1. 免运维:应用的运维工作将由Serverless的服务提供方负责,普通业务开发人员不用再关注机器部署、扩缩容等运维的事情;

  2. 更低成本:借助弹性能力,Serverless会根据应用负载动态进行扩缩容以满足业务的实际需求,避免了资源的浪费情况;

  3. 快速交付:从普通应用发布要重启整个jvm容器、中间件相比,Serverless发布粒度可以控制在单纯业务代码维度(业务函数),可以获得极致的发布效率体验;

  4. 统一架构:所有的基础能力都由Serverless基座负责,所以JDK的升级、中间件升级、通用二方包版本维护等不再需要推动每个业务去升级,只需要由专人通过Serverless基座即可完成业务无感升级;

f0e9aff35e8999f6a081f217a181d4ab.png

1fe5dfdcf815b561c3ebd7e5557c1677.jpeg

Serverless应用解构

相较于传统应用,Serverless应用对于我们认知中的研发体系挑战还是比较大的,Serverless的整个设计和运作体系都和传统应用发生了很大的变化,这对于技术研发同学来说,了解这其中的原理和思路是必不可少的。所以我试图从一个传统应用出发,通过逐步解构整个过程,粗浅的介绍下Serverless是怎么实现和运作的:

3dcd2c7522acce9e34797c02df5cd422.png

第一层. 普通应用:

我们一般的普通应用都由Pandora容器(隔离容器)加载,其中包括了中间件和业务自己的spring容器

第二层. 业务逻辑拆解

我们日常开发的代码中,除了业务本身的代码,肯定也包括很多通用的代码逻辑,比如对商品、人群等服务的封装和调用,这些大多数应用都会用到的逻辑,我们却一直在多个应用间不断地重复编写这些代码。

第三层. 业务容器分层

通过区分业务代码和通用代码,我们可以进一步对业务的Spring容器进行拆分,区分成通用Spring容器和业务Spring容器,进而就分别控制不同业务容器的加载和销毁。

第四层. Serverless化

通过将业务能力和通用能力分层之后,就可以进一步形成以基座应用和业务应用为概念的独立产品和部署体系,从功能、产研和运维体系上进行了彻底的隔离和分工。

5a95a57598a5239f0c9c5e48976981d5.jpeg

Serverless的产研和交付形式

Serverless对于业务最大的影响就是对原有产研体系的革命,一方面出现了专门的分工人员专职负责Serverless基座的开发和运维角色,另一方面,普通的业务开发不再需要关注机器容器、jvm和中间件等服务,更专注于业务需求实现和交付:

传统应用交付形式:研发负责整个Docker容器内的所有东西

645e3d3799b1f91cbd831043497ea8a1.png

Serverless的全新产研分工:职责分工,专业的人做自己最专业的事情

0456ab0c53389d457df663d279ad4786.png

Serverless的全新应用交付形式:分层独立交付

1c623cdbfc63ec74a75dbb9ecca36a99.png

f0f4e4fde8b513d47ebe6f6562e43d32.jpeg

Serverless全新部署体验

除了能力分层和产研分工,Serverless带来的还有一个重点特性就是飞一般的部署速度。以往可能需要五~十分钟才能完成的部署,Serverless缩短到了一分钟以内,真正让日常的开发体验朝着所写即所得更进一步。

要了解Serverless部署快在哪里,我们要从普通的应用部署流程说起,看看我们平时的部署都慢在哪里:

2da2bb08a3e6e3526b54b1b74241f015.png

上面是我们一个普通应用第一次新部署和更新部署的核心节点,镜像构建、中间件及基础服务启动都是耗费了大量时间,而且为了保障服务不中断,我们还要考虑分批部署,将原本已经很长的部署时长Double了一下。

为了解决部署耗时的问题,Serverless设计了一套更高效和敏捷的部署体系,其中通过多种机制加速了我们的整个部署流程:

  1. 免业务镜像构建:

在Serverless体系下,每次业务交付的只剩下业务代码,已无感知Docker容器,自然也就没了镜像构建的必要,镜像的管理统一交由Serverless基座负责,而且基座内也只会包含中间件和通用业务功能等不频繁更新的内容,业务的变更内容将通过独立的fatjar形式动态加载到运行容器中。

  1. 缓存服务容器:

在镜像标准化的前提下,镜像的加载和启动就不用再依赖于业务本身的变更发布,在业务发布使用之前,机器就可以提前把Docker、JVM、中间件、Spring容器、通用服务等加载和启动起来,并统一缓存到容器缓存池中,业务真正使用的时候只需要拉取已初始完成的容器加载业务代码,并完成流量切换就可以提供服务。

  1. 滚动发布:

在普通情况下,为了保证服务不中断,我们至少需要提供两台服务机器,发布的时候还需要分两批平滑发布,除了部署很耗时,测试和调试也是很麻烦。有了Serverless,在预发环境等测试环境我们就可以只部署一台机器,发布的时候,Serverless会从缓存容器中拉起一台新的容器进行加载,在完成快速启动后,进行流量切换就完成了平滑部署,真正让部署起飞。

通过总结以上几个核心的机制,Serverless让一个环境的新部署和更新部署变更非常简单和高效:

76e93d371d73a1eb4565e1c6b4e1764f.png

729ab64c2c9f41f63c75aa411db6bbf9.jpeg

Serverless插件-通用能力下沉的利器

在Serverless基座中,除了中间件等基础能力外,更重要的是要承载业务通用能力下沉的重任。一方面,每个业务应用基本都会涉及到需要去对接商品、账号、人群等二方服务,其中有些服务会存在文档不全面、依赖臃肿、协议不规范等问题,极大影响了业务开发的质量和效率;另一方面,业务自身也有很多需要复用的业务逻辑,如何快速共享和接入、统一升级和维护也是大家一直来苦恼的问题。对于业务来说,非常需要那么一个解决方案,既能简单可靠成本低,又能满足以下所有的能力复用诉求:

  1. 类隔离机制:

不同二方依赖和模块间通过类隔离来解决模块间类冲突问题,同时解耦单模块升级对其他模块的影响来保障稳定性;

  1. 可控类导出机制:

类隔离机制解决了不同模块之间的类冲突问题,但业务通用模块的存在核心还是给上层页面提供服务,模块和业务之间不可避免需要通信机制(如进程间通信常用到的socket通信),这就需要可控的类导出机制,控制只导出必要的接口类或者API接口等方式,既要实现通信能力,又要避免了通信模块和业务代码之间的类冲突问题和依赖升级问题;

  1. 生命周期管理机制:

如果共享的业务模块涉及到更复杂的逻辑,就会出现一个模块内不同功能在何时启动和初始化的问题。尤其是在Serverless存在容器缓存机制的情况下,就必然需要生命周期管理机制来控制不同逻辑的初始化和销毁动作,比如在容器缓存时初始化无副作用的逻辑,而在真正使用时再把有其余的功能进行初始化,以满足不同业务的多样化诉求;

  1. 统一升级维护能力:

类似于二方包这样的共享方案,统一升级维护一直是个大难题,联系人帮忙升级也是常事,所以在Serverless体系下,这也是必然要考虑和解决的问题;

Serverless插件就是给这些问题提出的一个完美解决方案:

c14f7869b7b6ac603a9edd9eccad680f.png

  1. 继承自Pandora的优秀类隔离机制:每个插件独享自己的ClassLoader,多个插件之间依赖互不影响,可以独立升级和切换而不影响其他插件和业务本身;

  2. 多粒度的类导出能力:可以将类的导出控制在最小粒度,在提供服务的前提下将对业务应用的影响控制在最低水平,也最大幅度降低了插件的修改升级对业务潜在的影响和风险;

  3. 完善的生命周期管理:满足不同插件在不同阶段执行自定义逻辑的需求,丰富了Serverless插件的使用场景和想象空间;

  4. 统一的管理和运维能力:借助Serverless的统一基座服务,Serverless插件将由基座维护者统一进行维护,插件的升级等问题都将真正做到业务无感,所有业务应用都可以享受到最新最全的插件带来的业务效率大提升。

d01cc92f4f94766bdca15e8fe060162a.png

Serverless的优势小结

通过对Serverless的初步了解和研究,我们也总结出了Serverless的几个核心优势,这些优势也成了我们决定全面拥抱Serverless的关键:

高效的产研效率:

  1. 深度集成公司产研体系,应用管理和运维成本都非常低;

  2. 业务开发无需感知和管理中间件和Docker等逻辑,业务开发成本明显降低;

  3. 基于滚动发布和容器缓存机制,实现了比肩于热部署的发布效率;

完善的隔离和插件机制:

  1. 完善的类隔离和导出机制,在二方包隔离、插件隔离、冲突规避等方面可以发挥很大的作用;

  2. 通过插件机制,可以方便地实现业务代码的共享和复用,实现业务能力的有效沉淀

  3. 开放的插件生命周期扩展能力,给业务提供了非常大的创造和想象空间;

运维成本低:

  1. 统一维护的Docker、中间件、JDK、依赖包等能力,让应用的基础升级维护变得简单;

  2. 基于弹性和缓存机器资源池能力的快速动态扩缩容能力,将会降低业务的维护成本;

3d0337b635a95b88b486c9650b2582fc.jpeg

权益玩法平台的Serverless实现

权益玩法平台在经历了以Ring为基础的运行模式之后,我们开始了全面拥抱Serverless的脚步:

683ff272b721d943b19bbd7d5b8ae453.png

  1. 创建了统一的权益玩法平台基座,有权益团队统一维护升级,服务于所有的权益玩法平台Serverless应用集;

  2. 针对常用的账号、商品、人群等二方服务,统一通过Serverless插件进行了封装,业务应用可以开箱即用;

  3. 针对中间件、日志等服务则进行了二次插件封装,以降低业务的上手成本和使用成本;

同时基于业务扩展型的业务应用,我们通过平台能力下沉、业务扩展Serverless接入的方式来满足平台管控和业务隔离的双向需求:

60e8f41def7d01e6a8c8d8f7d89c7ea2.png

5ec0b9c68164e15574f5441023d0c9f7.jpeg

成果和收益

通过对权益玩法平台现有业务应用的Serverless化改造,权益团队在双十一期间完美地支撑了业务需求,在研发效率、运维保障等方面都体现出了很高的价值和收益:

  1. 得益于简化的业务研发流程和丰富的插件支持、业务的部署和交付周期相比于之前减少30%,开发成本大幅降低,业务开发效率提升显著;

  2. 得益于部署流程优化、容器缓存机制和滚动部署加速,部署时长减少80%,极大缩短了需求交付周期;

b69ed3af0001b62ae9f61cfe3de3194a.jpeg

成果和收益

  1. Serverless作为公认的未来软件产研体系方向之一,我们也必将持续推进现有业务的Serverless改造,也期望Serverless能给我们的业务技术带来更多的创新力和想象力;

  2. Serverless作为最新的产研体系,也必然存在着各种问题和挑战,作为使用Serverless的业务之一,我们也是见证了Serverless从初期问题频出到最终完美表现双十一的过程,也期待Serverless能进一步升级优化,提供更强大的能力,助力业务发展。

8c28da832099b90644f19042c00a3d6b.jpeg

团队介绍

我们是大淘宝技术权益营销技术团队,是一支以权益优惠为核心的专业营销团队。我们肩负着支撑天猫淘宝双11、618、双十二等大促和各类权益营销活动的使命,是全集团权益营销策略执行和用户优惠触达的主阵地。团队构建了以权益平台为核心、权益玩法和互动相结合的完善权益营销技术体系,实现百万级的业务峰值流量支撑和亿级规模的权益发放能力,为业务打造出覆盖几亿消费者、千万商家的全方位营销解决方案,不断支撑业务创新的持续发展,成就更高的商业价值。

¤ 拓展阅读 ¤

3DXR技术 | 终端技术 | 音视频技术

服务端技术 | 技术质量 | 数据算法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/214441.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1.cloud-微服务架构编码构建

1.微服务cloud整体聚合父工程 1.1 New Project 1.2 Maven选版本 1.3 字符编码 1.4 注解生效激活 主要为lombok中的Data 1.5 java编译版本选8 1.6 File Type过滤 *.hprof;*.idea;*.iml;*.pyc;*.pyo;*.rbc;*.yarb;*~;.DS_Store;.git;.hg;.svn;CVS;__pycache__;_svn;vssver.scc;v…

Nginx配置文件的基本用法

Nginx简介 1.1概述 Nginx是一个高性能的HTTP和反向代理服务器。 是一款轻量级的高性能的web服务器/反向代理服务器/电子邮件(IMAP/POP3)代理服务器 单台物理服务器可支持30 000~50 000个并发请求。 1.2Nginx和Apache的优缺点 &#xff…

mybatis数据输出-insert操作时获取自增列的值给对应的属性赋值

jdbc-修改 水果库存系统的 BaseDao 的 executeUpdate 方法支持返回自增列-CSDN博客 1、建库建表 CREATE DATABASE mybatis-example;USE mybatis-example;CREATE TABLE t_emp(emp_id INT AUTO_INCREMENT,emp_name CHAR(100),emp_salary DOUBLE(10,5),PRIMARY KEY(emp_id) );INSE…

王炸升级!PartyRock 10分钟构建 AI 应用

前言 一年一度的亚马逊云科技的 re:Invent 可谓是全球云计算、科技圈的狂欢,每次都能带来一些最前沿的方向标,这次也不例外。在看完一些 keynote 和介绍之后,我也去亲自体验了一些最近发布的内容。其中让我感受最深刻的无疑是 PartyRock 了。…

基于SSM的健身房预约系统设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…

网络安全攻击预警/态势预测算法汇总

总结: 网络安全攻击预警/态势预测算法众多,主要包括: 基于统计学的算法:协方差矩阵、马尔可夫模型等; 基于机器学习的算法:贝叶斯网络、聚类算法、支持向量机SVM、遗传算法、层次分析法AHP、决策树等&am…

Proxmark3 Easy救砖-20231209

事情是这样的,在淘宝买了个PM3,拿到手后刷固件的,一不小心刷成砖头了,现象就是四个灯全亮,插上电脑USB不识别。问商家他也不太懂,也是个半吊子技术,远程给我刷机搞了半天也没有搞定,…

微表情检测(三)----基于光流特征的微表情检测

Micro-expression spotting based on optical flow features 基于光流特征的微表情检测 Abstract 本文提出了一种高精度和可解释性的自动微表情检测方法。首先,我们设计了基于鼻尖位置的图像对齐方法,以消除由头部晃动引起的全局位移。其次&#xff0…

C语言中的一维数组与二维数组

目录 一维数组数组的创建初始化使用在内存中的存储 二维数组创建初始化使用在内存中的存储 数组越界 一维数组 数组的创建 数组是一组相同类型元素的集合。 int arr1[10]; char arr3[10]; float arr4[10]; double arr5[10];下面这个数组能否成功创建? int count…

Linux上编译和测试V8引擎源码

介绍 V8引擎是一款高性能的JavaScript引擎,广泛应用于Chrome浏览器和Node.js等项目中。在本篇博客中,我们将介绍如何在Linux系统上使用depot_tools工具编译和测试V8引擎源码。 步骤一:安装depot_tools depot_tools是一个用于Chromium开发…

学习IO的第七天

作业&#xff1a;使用消息队列完成两个进程间的相互通信 #include <head.h>struct msgbuf {long mtype; //消息类型char mtext[1024]; //正文大小 };#define SIZE (sizeof(struct msgbuf)-sizeof(long))int main(int argc, const char *argv[]) {//1.创…

DevEco Studio将编辑器整体文本改为简体中文

我们打开编辑器 随便进入一个项目 这里 我们左上角目录 选择 File下面菜单中的 Settings… 打开配置界面 然后在设置窗口左侧导航栏中 选择 Plugins 插件 然后上方导航栏中 选择 Installed 参考下图 然后 找到这个Chinese(Simplified) Chinese是什么应该不用我多说吧 我们把…

区块链扩容问题研究【06】

1.Plasma&#xff1a;Plasma 是一种基于以太坊区块链的 Layer2 扩容方案&#xff0c;它通过建立一个分层结构的区块链网络&#xff0c;将大量的交易放到子链上进行处理&#xff0c;从而提高了以太坊的吞吐量。Plasma 还可以通过智能合约实现跨链交易&#xff0c;使得不同的区块…

简单的 u-popup 弹出框

uniapp中的popup组件可以用于弹出简单的提示框、操作框、菜单等。它可以通过position属性控制弹出框的位置&#xff0c;不同的position值会使得弹出框呈现不同的弹出形式 目录 一、实现思路 二、实现步骤 ①view部分展示 ②JavaScript 内容 ③css中样式展示 三、效果展示 …

Linux系统---基于Pipe实现一个简单Client-Server system

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C/C》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、题目要求 Server是一个服务器进程&#xff0c;只能进行整数平方运算。Client要计算一个整数的平方的平方的平方&#xff0c;即…

mysqlsh导入json,最终还得靠navicat导入json

工作需要将一个巨大的10G的json导入mysql数据库。 看到mysql官方有对json导入的支持。 如下&#xff1a; MySQL :: Import JSON to MySQL made easy with the MySQL Shell $ mysqlsh rootlocalhost:33300/test --import /path_to_file/zips.json Creating a session to root…

python:六种算法(DBO、RFO、WOA、GWO、PSO、GA)求解23个测试函数(python代码)

一、六种算法简介 1、蜣螂优化算法DBO 2、红狐优化算法RFO 3、鲸鱼优化算法WOA 4、灰狼优化算法GWO 5、粒子群优化算法PSO 6、遗传算法GA 二、6种算法求解23个函数 &#xff08;1&#xff09;23个函数简介 参考文献&#xff1a; [1] Yao X, Liu Y, Lin G M. Evolution…

读书笔记 | 自我管理的关键是提高执行力

哈喽啊&#xff0c;你好&#xff0c;我是雷工&#xff01; 有句话说&#xff0c;能管好自己才是真的本事。 自我管理&#xff0c;管好自己很重要。 我们之所以懂得这么多的道理&#xff0c;却依然过不好这一生&#xff1f; 很大部分原因是因为管不住自己&#xff0c;做不到。 …

性能测试基础

性能测试分类 客户端性能&#xff1a;测试APP自身的性能&#xff0c;例如CPU、内存消耗&#xff1b;web页面元素渲染速度 服务端性能&#xff1a;测试服务端项目程序的支持的并发、处理能力、响应时间等&#xff0c;主要通过接口来做性能测试 性能测试指标 并发 同时向服务…

大一作业习题

第一题&#xff1a;答案&#xff1a; #include <stdio.h> void sort(int a[], int m) //将数组a的前m个元素(从小到大)排序 {int i 0;for (i 0; i < m - 1; i){int j 0;int flag 1;for (j 0; j < m - 1 - i; j){if (a[j] > a[j 1]){int t 0;t a[j];…