【AICon】探索八个行业创新案例,教你在教育、金融、医疗、法律等领域实践大模型技术! >>> 了解详情
写点什么

资深 CTO 带来的 8 条 Serverless 最佳实践

  • 2018-09-08
  • 本文字数:2753 字

    阅读完需:约 9 分钟

多年来,社区一直在讨论最佳实践,但只有一小部分能够为人们所接受。

大多数遵循这些实践的无服务器从业者面对的是大规模的工作场景。无服务器架构承诺在大规模和突发性工作负载上发挥作用,所以大部分最佳实践更关注规模化问题,例如零售行业的 Nordstrom 公司和物联网领域的 iRobot。如果你的目标还达不到那样的规模,可能就无需遵循这些最佳实践。

请记住,最佳实践并非“唯一的实践”。最佳实践是以一系列基本假设为前提,如果你的场景不存在这些假设,那么这些最佳实践可能就不合适你。

我的主要假设是所有人构建的应用程序都能够大规模运行(即使它们可能永远不会)。

以下是我认为的最佳实践。

一个 function 应该只做一件事

这个最佳实践与 function 的错误和伸缩隔离有关。

换句话说,如果在 function 中使用 switch 语句,那么你可能是做错了。

很多教程和框架都是基于 function 大单体,然后在单体前面加上单个代理路由,并使用 switch 语句。我不喜欢这种模式,因为它的伸缩性不好,并且往往会产生大而复杂的 function。

这样做的问题在于,当你想要进行扩展时,需要扩展整个应用程序,而不是某些特定的元素。

假设 Web 应用程序的一部分需要处理 100 万的流量,而另一部分只需要处理 1 千的流量,而当你需要对前者进行优化时,也不得不捎带上后者。这是一种浪费,而且你无法轻易做到对后者的优化。所以,建议将它们分开。

不让 function 调用其他 function

调用其他 function 的 function 是一种反模式。

这种模式在很少情况下是有效的,但从根本上说,还是不要这样做。这样会成倍增加你的成本,让调试变得更复杂,而且抵消了隔离 function 所带来的价值。

function 应该将数据推送到数据存储或队列中,然后通过触发另一个 function 来完成其他的工作。

尽可能少在 function 中使用额外的库

这点对于我来说是显而易见的。

function 有冷启动(function 第一次启动)和暖启动(function 已经启动,并准备好被执行)两个阶段。冷启动受到很多因素的影响,比如 zip 文件的大小(或者被上传的代码)和需要实例化的库的数量。

代码越多,冷启动的速度就越慢。

需要实例化的库越多,冷启动的速度也就越慢。

例如,Java 在某些平台上算是一门实现暖启动的高性能语言。但如果你使用太多的库,你会发现它需要很多秒才能完成冷启动。有些库不是必需的,况且冷启动性能不仅会影响启动,还会影响伸缩。

我坚信开发人员应该只在必要的情况下才使用额外的库。

像 express 这样的东西是为服务器而生的,无服务器应用程序不需要用到它的所有元素。既然这样,为什么还要引入它的所有代码和依赖项呢?为什么要引入多余的代码?多余的代码不仅不会被运行,还会带来安全风险。

当然,如果一个库已经经过你的测试,而且你了解和信任它,那么就可以引入它。

避免使用基于连接的服务

除非真的有必要,否则不要使用基于连接的服务。

这个会让我陷入大麻烦。很多 Web 应用程序开发者都会陷入“我们只知道 RDBMS”的陷阱。

但重点不在于 RDBMS,而在于连接。

无服务器最适合与服务一起协作,而不是连接。

服务旨在快速对请求做出响应,并处理数据层的复杂性。这在无服务器领域具有巨大价值,也解释了为什么像 DynamoDB 这样的数据库非常适用于无服务器架构。

说实话,无服务器从业者并不反对 RDBMS,他们反对的是连接。连接需要时间,而且你试想一下,当一个 function 扩展到多个,每个 function 环境都需要一个连接,这样就给 function 冷启动引入了瓶颈和 I/O 等待,但其实这些是没有必要的。

如果你一定要使用 RDBMS,可以在中间放置一个连接池服务,如果是某种可以自动伸缩的容器,那就更好了。

关键是,你可能需要重新思考数据层,这不是无服务器的错。如果你尝试重用当前的数据层,但不奏效,那可能是因为你对无服务器架构缺乏理解。

一个路由对应一个 function

尽可能避免使用单一的 function 代理。它无法进行伸缩,也无助于隔离问题。在某些情况下,你可以使用单一的代理,例如:一系列路由功能被绑定到一个表上,并且它与应用程序的其余部分相对独立。但在我工作过的大多数应用程序中,这种情况只是个例。

虽然避免使用单一代理会增加管理方面的复杂性,但在扩展应用程序时,它确实有助于隔离错误。

话说回来,你会使用某种配置管理工具来运行这些东西,不是吗?你已经在使用某种 CI 和 CD 工具,对吗?所以,无服务器仍然需要 DevOps。

学习使用消息和队列

如果应用程序是异步的,无服务器往往会带来最佳的效果。对于那些倾向于进行请求响应和大量查询的 Web 应用程序来说,这可能不是很明显。

之前说过,最好不要让 function 直接调用其他的 function,所以如何将 function 链接在一起是一个很重要的问题。可以将队列作为断路器,如果一个 function 失效,只需要清空因为故障而堆积起来的队列,或者将失败的消息推送到死信队列(DLQ)。

基本上就是要了解分布式系统的工作原理。

对于带有无服务器后端的客户端应用程序,最好的方法是使用 CQRS。这个模式的关键之处在于将获取数据的关注点和输入数据的关注点分离开来。

数据流,而不是数据湖

在无服务器系统中,数据将流经你的系统。它们最终可能会形成数据湖,但更可能的情况是,它们会处于某种流动的状态。因此,任何时候都要将数据视为动态的,而不是静止的。

虽然这样做并非总是可行的,但一定要尽量避免在无服务器环境中查询数据湖。

无服务器要求你重新思考数据层。对于刚进入无服务器领域的新手来说,他们总是倾向于以 RDBMS 的方式考虑问题,他们极有可能会碰壁,不仅是因为伸缩问题,也因为他们的数据结构变得过于僵化。

你会发现数据流会随着应用程序的变化而发生变化,而伸缩将会改变所有的一切。如果你所要做的只是重定向一个数据流,那很容易,但要为数据库筑坝可是要难得多。

了解应用程序是如何伸缩的

创建第一个无服务器应用程序很容易,然后你看着它扩展。如果你不了解自己所做的一切,那么就很容易陷入与其他自动扩展方案相同的陷阱当中。

如果你不了解应用程序是如何伸缩的,有可能会让自己陷入麻烦之中。如果你使用缓慢的冷启动(依赖了很多库并使用了 RDBMS),然后碰上突发的高峰流量,就会急剧增加 function 的并发量,让连接数爆棚,从而拖慢了应用程序。

所以,不要认为应用程序一定会在相同的负载下运行。了解应用程序处于不同负载之下的行为仍然是工作内容的一部分。

结论

我可以在这里说更多的东西,不过以上这些是我在与其他人交谈时最想告诉他们的。我没有提到过如何规划应用程序,或者如何考虑应用程序的成本,因为它们超出了本文的讨论范围。我敢肯定,很多人会说我对 RDBMS 的看法是不对的。与容器一样,我并不讨厌 RDBMS,我只是喜欢在工作中使用对的工具。所以,先了解你的工具!

英文原文: https://medium.com/@PaulDJohnston/serverless-best-practices-b3c97d551535

感谢张婵对本文的审校。

2018-09-08 18:383583
用户头像

发布了 731 篇内容, 共 434.0 次阅读, 收获喜欢 1997 次。

关注

评论

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

关于Promise你需要知道的一切

devpoint

大前端 Promise 引航计划

堡垒机和虚拟机的两大区别分析-行云管家

行云管家

网络安全 虚拟机 服务器 堡垒机

快准狠!百万年薪的阿里架构师分享深入剖析Java虚拟机文档

Java 架构 面试 程序人生 编程语言

华为云开源的Karmada正式成为CNCF首个多云容器编排项目

华为云开发者联盟

容器 集群 cncf Karmada

一周信创舆情观察(9.13~9.26)

统小信uos

使用 grpcurl 通过命令行访问 gRPC 服务

AlwaysBeta

golang gRPC

艾瑞发布《2021年中国企业级 SaaS 行业研究报告》,ONES 入选典型厂商案例

万事ONES

项目管理 SaaS 协同办公

掘金热榜第一!阿里P8用近十个月整理出来999页Java岗核心笔记限时开源!

Java 架构 面试 程序人生 编程语言

博睿数据亮相北京IMC2021第三届中国智造CIO峰会

博睿数据

图谱相关技术在风控反作弊中的应用和探索

百度Geek说

后端 软件架构

华为云带你探秘Xtrabackup备份原理和常见问题分析

华为云数据库小助手

GaussDB 华为云数据库 MySQL 数据库 GaussDB(for MySQL)

金秋10月,日更挑战你准备好了么!?

InfoQ写作社区官方

热门活动 10月月更

不得不聊一聊英语爱好者的单词杂货铺了

小匚

随笔杂谈 生活记录 英语 大学英语四六级 单词

东软熙康、百度、京东方,互联网医院的三个典型样本

海比研究院

四面字节跳动(高级开发岗):分布式+中间件+TCP+JVM+Hashmap

Java 编程 架构 面试 计算机

国庆出游神器:魔幻黑科技换天造物,让vlog秒变科幻大片!

华为云开发者联盟

视频 modelarts 科幻 国庆 天空

从产业链、架构和技术三个层面,看元宇宙与RPA的发展关系

王吉伟频道

RPA 自动化 区块链+ 机器人流程自动化 元宇宙

第 8 章 -《Linux 一学就会》-Centos8 软件包的管理与安装

学神来啦

Linux 运维

目睹阿里技术官写的Tomcat架构笔记后,瞬间觉得自己是渣渣

Java 架构 面试 程序人生 编程语言

从工具、工具箱到数字化软件工厂——DevOps 设计理念与工程实践专场 | CIF 精彩看点

CODING DevOps

DevOps 数字化 研发工具 腾讯云 CIF 峰会

走进吉利|EMQ 映云科技助力车企“新四化”

EMQ映云科技

车联网 物联网 IoT emq iov

等保二级需要测评吗?多久测评一次?

行云管家

网络安全 堡垒机 等保测评 过等保 二级等保

国家级|深信服再获CNCERT应急服务国家级支撑单位称号!

科技热闻

恒源云(GpuShare)_快进来!这里有超高性价比的GPU资源

恒源云

深度学习

大厂敲门砖!Alibaba技术官甩出的Springboot笔记

Java 架构 面试 程序人生 编程语言

Python代码阅读(第31篇):将一个列表分割成指定大小的小列表

Felix

Python 编程 Code Programing 阅读代码

如何构建混合云管理平台?——资源管理篇

金蝶天燕云

云计算 云平台

恒拓高科亮相中国-东北亚博览会,赋能海内外企业构建数字化新生态

WorkPlus

阅读

智能大数据专场,百度智能云带来智能大数据产品架构全景图

百度大脑

人工智能 大数据

搞不懂云原生

二哥不再迷茫

阿里巴巴架构师十年整理出的JavaSpringBoot核心文档,真是太全了

Java 架构 面试 程序人生 编程语言

资深CTO带来的8条Serverless最佳实践_语言 & 开发_Paul Johnston_InfoQ精选文章