从单体迈向Serverless的避坑指南

35岁的程序员 2020-07-09 17:02:17 ⋅ 750 阅读


作者 | 不瞋

编辑 | 禾易

用户需求和云的发展两条线推动了云原生技术的兴起、发展和大规模应用。本文将主要讨论什么是云原生应用,构成云原生应用的要素是什么,什么是Serverless 计算,以及Serverless如何简化技术复杂度,帮助用户应对快速变化的需求,实现弹性、高可用的服务,并通过具体的案例和场景进行说明。


如今,各行各业都在谈数字化转型,尤其是新零售、传媒、交通等行业。数字化的商业形态已经成为主流,逐渐替代了传统的商业形态。在另外一些行业里(如工业制造),虽然企业的商业形态并非以数字化的形式表现,但是在数字孪生理念下,充分利用数据科技进行生产运营优化也正在成为研究热点和行业共识。

 

企业进行数字化转型,从生产资料、生产关系、战略规划、增长曲线四个层面来看:


  • 生产资料:数据成为最重要的生产资料,需求/风险随时变化,企业面临巨大的不确定性。

  • 生产关系:数据为中心,非基于流程和规则的固定生产关系。网络效应令生产关系跨越时空限制,多连接方式催生新的业务和物种。

  • 战略规划:基于数据决策,快速应对不确定的商业环境。

  • 增长曲线:数字化技术带来触达海量用户的能力,可带来突破性的增长。

 

从云服务商的角度来看云的演进趋势,在Cloud 1.0时代,基础设施的云化是其主题,采用云托管模式,云上云下的应用保持兼容,传统的应用可以直接迁移到云上,这种方式的核心价值在于资源的弹性和成本的低廉;在基础设施提供了海量算力之后,怎么帮助用户更好地利用算力,加速企业创新的速度,就成为云的核心能力。


如果仍在服务器上构建基础应用,那么研发成本就会很高,管理难度也很大,因此有了Cloud 2.0,也就是云原生时代。在云原生时代,云服务商提供了丰富的托管服务,助力企业数字化转型和创新,用户可以像搭积木一样基于各种云服务来构建应用,大大降低了研发成本。

云原生应用要素



云原生应用有三个非常关键的要素:微服务架构,应用容器化和Serverless化,敏捷的软件交付流程。


1. 微服务架构


单体架构和微服务架构各有各的特点,其主要特点对比如下图所示。总的来说,单体架构上手快,但是维护难,微服务架构部署较难,但是独立性和敏捷性更好,更适合云原生应用。


单体架构VS微服务架构



2. 应用容器化和Serverless化


容器是当前最流行的代码封装方式,借助K8s及其生态的能力,大大降低了整个基础设施的管理难度,而且容器在程序的支撑性方面提供非常出色的灵活性和可移植性,越来越多的用户开始使用容器来封装整个应用。

 

Serverless计算是另外一种形态,做了大量的端到端整合和云服务的集成,大大提高了研发效率,但是对传统应用的兼容性没有容器那么灵活,但是也带来了很大的整洁性,用户只需要专注于业务逻辑的编码,聚焦于业务逻辑的创新即可。


3. 敏捷的应用交付流程


敏捷的应用交付流程是非常重要的一个要素,主要包括流程自动化,专注于功能开发,快速发现问题,快速发布上线。


Serverless 计算



1. 阿里云函数计算


Serverless是一个新的概念,但是其内涵早就已经存在。阿里云或者AWS的第一个云服务都是对象存储,对象储存实际上就是一个存储领域的Serverless服务;另外,Serverless指的是一个产品体系,而不是单个产品。当前业界云服务商推出的新功能或者新产品绝大多数都是Serverless形态的。阿里云Serverless产品体系包括计算、存储、API、分析和中间件等,目前云的产品体系正在Serverless化。


阿里云Serverless计算平台函数计算,有4个特点:


  • 和云端无缝集成:通过事件驱动的方式将云端的各种服务与函数计算无缝集成,用户只需要关注函数的开发,事件的触发等均由服务商来完成。

  • 实时弹性伸缩:由系统自动完成函数计算的弹性伸缩,且速度非常快,用户可以将这种能力用在在线应用上。

  • 次秒级计量:次秒级的计量方式提供了一种完全的按需计量方式,资源利用率能达到百分之百。

  • 高可用:函数计算平台做了大量工作帮助用户构建高可用的应用。


那么,阿里云函数计算是如何做到以上4点呢?阿里云函数计算的产品能力大图如下图所示,首先函数计算产品是建立在阿里巴巴的基础设施服务之上的产品,对在其之上的计算层进行了大量优化。接着在应用层开发了大量能力和工具,基于以上产品能力,为用户提供多种场景下完整的解决方案,才有了整个优秀的函数计算产品。函数计算是阿里云的一个非常基础的云产品,阿里云的许多产品和功能均是建立在函数计算的基础上。目前阿里云函数计算已经在全球19个区域提供服务。


阿里云函数计算产品能力大图


2. Serverless帮助用户简化云原生应用高可用设计、实施的复杂度

云原生应用的高可用是一个系统的工程,包括众多方面,完整的高可用体系构建需要很多时间和精力。那么Serverless计算是如何帮助用户简化云原生应用高可用设计、实施的复杂度呢?
 
如下图所示,高可用体系建设要考虑的点包括基础设施层、运行时层、数据层以及应用层,且每一层都有大量的工作要做才可以实现高可用。函数计算主要是从容错、弹性、流控、监控四方面做了大量工作来实现高可用,下图中蓝色虚线框所对应的功能均由平台来实现,用户是不需要考虑的。蓝色实线框虽然平台做了一些工作来简化用户的工作难度,但是仍需要用户来进行关注,而橘红色的实线框代表需要用户去负责的部分功能。结合平台提供的功能和用户的部分精力投入,可以极大地减轻用户进行高可用体系建设的难度。

函数计算高可用


函数计算在很多方面做了优化来帮助用户建设高可用体系。下图展示了函数计算在可用区容灾方面的能力。从图中可知,函数计算做了相应的负载均衡,使得容灾能力大大提升。


函数计算多可用区容灾


下图展示的是函数计算对事件的异步处理,其处理流水线主要包括事件队列、事件分发、事件消费三个环节,在每一个环节上都可以进行水平伸缩,其中一个比较关键的点是事件的分发需要匹配下游的消费能力。另外,通过为不同函数指定不同数量的计算资源,用户能方便地动态调整不同类型事件的消费速度。此外,还可以自定义错误重试逻辑,并且有背压反馈和流控,不会在短时间内产生大量请求时压垮下一个服务。

函数计算事件异步处理


在函数计算的可观测性上面,提供了日志收集和查询功能,除了默认的简单日志查询功能外,还提供了高级日志查询,用户可以更方便地进行日志分析。在指标收集和可视化方面,函数计算提供了丰富的指标收集能力,并且提供了标准指标、概览信息等视图,可以更方便用户进行运维工作。

 

下图是应用交付的一个示意图,在整个应用的交付过程中,只有每个环节都做好,才能够建设一个敏捷的应用交付流程,其核心是自动化,只有做到了自动化,才能提升整个流水线的效率和敏捷度。


敏捷的应用交付流程


下图展示了自动化应用交付流水线在每个环节的具体任务。其中需要注意的是做到基础设施即代码,才能进行模板定义和自动化设置应用运行环境,进而实现自动化的持续集成等。


自动化应用交付流水线


做到了应用的自动化交付之后,对整个研发效率的帮助是非常大的。在Serverless应用上,阿里云提供了多种工具来帮助用户实现基础设施即代码。Serverless的模型有一个很好的能力,就是同一份模板可以传入不同的参数,进而生成不同环境的定义,然后通过自动化地管理这些环境。

 

对于应用本身不同服务版本的交付和灰度发布,函数计算提供了服务版本和服务别名来提供相应的服务,整个应用的灰度发布流程可以简化成一些API的操作,大大提升业务的效率。通过Serverless计算平台提供的这些能力,整个软件应用的交付流水线自动化程度得到了大幅度的提高。


函数计算还有一个很有用的功能——对存量应用的兼容性。通过Custom runtime,能够适配很多的流行框架,兼容传统应用,使其能够很容易地适配到Serverless平台上面,由控制台提供应用的创建、部署、关联资源管理、监控等一系列服务。

 

除了函数计算,还可以用Serverless工作流对不同的应用环节、不同的函数进行编排,通过描述性的语言去定义工作流,由其可靠地执行每一个步骤,这就大幅度降低用户对于复杂任务的编排难度。


应用场景案例



函数计算有几个典型的应用场景,一个就是Web/API后端服务,阿里云已经有包括石墨文档、微博、世纪华联在内的多个成功应用案例。


函数计算的另外一个应用场景就是大规模的数据并行处理,比如往OSS上面上传大量的图片、音频、文本等数据,可以触发函数做自定义的处理,比如转码、截帧等。这方面的成功案例包括虎扑、分众传媒、百家互联等。

 

函数计算还有一个应用场景就是数据实时流式处理,比如不同的设备产生的消息、日志发送到消息队列等管道类似的服务中,就可以触发函数来进行流式处理。

 

最后一个应用场景就是运维的自动化,通过定时触发、云监控事件触发、流程编排等方式调用函数完成运维任务,大大降低运维成本和难度,典型的成功案例有图森未来等。

 

图森未来是一家专注于L4级别无人驾驶卡车技术研发与应用的人工智能企业,面向全球提供可大规模商业化运营的无人驾驶卡车技术,为全球物流运输行业赋能。在路测过程中会有大量数据产生,而对这些数据的处理流程复杂多变,即使对于同一批数据,不同的业务小组也会有不同的使用及处理方式。如何有效管理不同的数据处理流程、降低人为介入频率能够大幅的提高生产效率。


路测不定时运行的特点使得流程编排任务运行时间点、运行时长具有极大的不确定性,本地机房独自建立流程管理系统难以最大优化机器利用率,造成资源浪费。而图森未来本地已有许多单元化业务处理脚本及应用程序,但因为各种限制而无法全量的迁移上云,这也对如何合理化使用云上服务带来了挑战。


针对上述情况,图森未来开始探索数据处理平台的自动化。阿里云 Serverless 工作流按执行调度的次数计费,具有易用易集成、运维简单等诸多优点,能够很好的解决上述场景中所遇到的问题,非常适合这类不定时运行的离线任务场景。


Serverless 工作流还支持编排本地或自建机房的任务,图森未来通过使用Serverless 工作流原生支持的消息服务MNS解决了云上云下的数据打通问题,使得本地的原有任务得到很好的编排及管理。


除了调度外,Serverless 工作流也支持对任务的状态及执行过程中所产生的数据进行维护。图森未来通过使用任务的输入输出映射及状态汇报机制,高效的管理了流程中各任务的生命周期及相互间的数据传递。


在未来,随着业务规模的扩大,图森未来将持续优化离线大数据处理流程的运行效率及自动化水平。通过各种探索,图森未来将进一步提升工程团队的效率,将更多的精力和资金投入到业务创新中去。


总结



Serverless 工作流是阿里云 Serverless 产品体系中的关键一环。通过 Serverless 工作流,用户能够将函数计算、视觉智能平台等多个阿里云服务,或者自建的服务,以简单直观的方式编排为工作流,迅速构建弹性高可用的云原生应用。


自2017年推出函数计算起, 该服务根据应用负载变化实时智能地弹性扩缩容,1分钟完成上万实例的伸缩并保证稳定的延时。目前已经支撑微博、芒果TV、华大基因、图森未来、石墨科技等用户的关键应用,轻松应对业务洪峰。




体验有礼:5 分钟极速上手 Serverless


“Serverless” 近年来非常火爆。人人都热衷于探讨它出现的意义,但对于如何上手使用或在生产环境落地,却谈之甚少。我们设计了体验场景,手把手带你 5 分钟上手 Serverless,还送 2000 个阿里云“第一行代码”鎏金限量马克杯!


参与方式

  • 手机端:点击“阅读原文”即可查看详情

  • 推荐 PC 端体验:https://developer.aliyun.com/adc/series/fc/



全部评论: 0

    我有话说:

    Malagu v1.4.1 发布 - 支持 Serverless 优先微服务框架

    Malagu 框架简介 Malagu 基于 TypeScript Serverless First、组件化、平台无关渐进式应用框架。 背景 当我们着手开发一个新项目时候,单体和微服务架构该

    Serverless Framework 2.3.0 发布

    Serverless 架构开发框架 Serverless Framework 发布了 2.3.0 版本,该框架使用 AWS Lambda、Azure Functions、Google

    阿里技术:聊一聊单机至亿级流量大型网站系统架构演进过程

    网站初期,我们经常会在单机上跑我们所有程序和软件。此时我们使用一个容器,如tomcat、jetty、jboos,然后直接使用JSP/servlet技术......

    不要把Redis当垃圾桶了,T也有开发设计规范,了吗?!

    Redis不是垃圾桶也不是 SUPER MAN,能力和资源都有限,不合理使用会降低它健康度,严重时甚至会

    【分享】一次单体架构改造成微服务架构拆分实践

    5个方面设计这次微服务拆分方案,以及经验总结!

    CKEditor 5 v26.0.0 发布:具有可扩展构建、内联部件样式和注释指南

    CKEditor 5 v26.0.0 已经发布,本次更新包括支持创建一个定制编辑器构建、Mac上按键管理、设计内联部件、编辑器占位符和一组关于使用协作特性注释指南等内容。 通过 DLL

    8 种最 SQL 错误用法,你有没有踩过

    编写复杂SQL语句要养成使用 WITH 语句习惯。简洁且思路清晰SQL语句也能减小数据库负担 。

    「360技术」Pika 3.4.0 发布,单机到集群

    pika 3.4.0 发布了。pika 是 360 公司发布一个可持久化大容量 redis 存储服务,兼容 string、hash、list、zset、set 绝大部分接口,解决 redis

    京东技术:开发属于自己插件 | IDEA & Android Studio插件开发指南

    是否曾经被ide重复繁琐操作所困扰,又或者没有心仪UI控件而难受。那么请阅读这篇文章,掌握idea插件开发流程,开发属于自己插件,造福开源社区。

    纯JS实现复制功能三种方式,有踩

    业余时间写了一个在WX里面分享X宝优惠券小工具,里面有用到复制T口令功能,当时以为实现起来很....

    Netty单机百万连接及高性能优化

    关于netty学习和介绍,可以去github看官方文档,这里良心推荐《netty实战》和《netty权威指南》两本书,前者对于新手更友好,原理和应用都有讲到,多读读会发现很多高性能优化点。

    线性表 - 循环链表

    1.引子 单链表解决了A 查找到E过程,假设现在要求E 查找到A,用时最短, 因为单链表是单向,只能前往后,无法解决这个问题。因此引出了循环链表。   思路图

    什么是微服务?什么是中台?阿里中台战略?

    微服务架构将单体应用,按照业务领域拆分为多个高内聚低耦合小型服务

    「转载」使用DDD指导业务设计一点思考

    领域驱动设计(DDD) 是 Eric Evans 提出一种软件设计方法和思想,主要解决业务系统设计和建模。DDD 有大量难以理解概念,尤其是翻译原因,某些词汇非常生涩,例如:模型、限界上下文

    为什么单线Redis能够达到百万级QPS?

    作者:在江湖中coding链接:https://juejin.im/post/5e6097846fb9a07c9f3fe744 性能测试报告 查看了下阿里云 Redis 性能测试报告如下,能够

    单元测试增强工具TestableMock 让Mock返璞归真

    简介 阿里巴巴研发效能团队开源Java单元测试增强工具,换种思路写Mock,让单元测试更简单。 无需初始化,不挑测试框架,甭管要换方法是被测类私有方法、静态方法还是其他任何类成员方法,也甭管

    【SpringCloud实战】一次开发中使用Feign添加动态Header问题思考

    踩了一个Spring Cloud Feign添加自定义Header,分享给大家

    Nacos 1.4.1 发布,修复指定特殊 UA 可绕过所有鉴权安全漏洞

    Nacos 1.4.1 已发布,此版本主要新功能是支持 IPv6 服务注册,以及为 Csharp 客户端提供 UDP push 支持。 更值得关注是,1.4.1 版本解决了此前被曝出绕过鉴权

    如何实现单服务器300万个长连接

    有没有试验过单机能抗300万个长连接操作?分享一下