无服务器场景(serverless)的容错怎么做?我们的设计

news/2024/5/20 9:06:46 标签: java, 程序人生, serverless, 经验分享, 架构师

无服务器架构和FaaS(Function-as-a-service 函数即服务)近年来越来越受欢迎,这要归功于易用性、自动伸缩和按需付费的特性。然而,FaaS 基础设施中缺少应用程序的容错能力。

把坑留给码农?

默认情况下,AWS Lambda 或 Google Cloud Functions 等 FaaS 系统需要开发者自己考虑执行失败的情况。云服务的策略是:无论是应用程序自身错误还是基础设施故障,一旦函数执行失败就执行重试。这意味着函数可能会运行多次。

并且更可怕还有,你的业务代码也可能会运行 0.5 次,或者 3.2 次……这是怎么回事?

这个糟糕问题的原因是,大多数 FaaS 系统提供的能力不能保证资源层(如数据库或文件等)在执行失败后被清理。

在失败和重试的过程中,修改共享状态的应用程序会在不知不觉修改部分结果。如果一个请求将更新两个键 k 和 l,但函数在两次更新之间崩溃,那么现在客户端将看到较新版本的 k 和较旧版本的 l。

这就是云平台 FaaS 的现状。

FaaS 的无痛容错:原子性

为了避免这种类型的异常,开发人员需要一个简单的保证,那就是原子性:要么一个请求的所有操作全部成功,要么全部失败。传统做法中,原子性是由强一致性(事务式)存储引擎来保证的,但这些系统有众所周知的扩展和性能问题。如何才能让 FaaS 执行保证原子性?

为此,我们构建了一个名为 AFT(Atomicity for Fault Tolerance)的系统,它是一个位于任何无服务器计算层(如AWS Lambda、Google Cloud Functions)和存储层(如AWS DynamoDB、Redis)之间的胶合层。计算层的每个逻辑请求(可能由多个函数组成)都被视为一个事务。AFT 保证事务所做的所有更新都会在存储层原子化执行。

AFT 的设计是灵活的。我们对计算层不做任何假设,而对存储层的要求就是存储层要持久化。我们可以保证在 DynamoDB 和 S3 等最终一致的系统上运行的函数的原子性。AFT 有两个主要特点。(1)无协调、原子更新;(2)保证事务只读取已提交的数据。AFT 将每个新的key版本写到不同的物理存储位置,以避免写-写冲突。

为了保证事务读取语义上一致的数据,AFT 保证了读取原子性。读取原子性要求客户机只从已提交的事务中读取数据,并按照事务提交的顺序进行读取。也就是说,如果事务 T1 写了 key 的版本 K1,而后来的事务 T2 写了 K2 和 L2,那么客户端就读不到 K1 和 L2,因为事务 T2 写了一个较新版本的K,称为 K2。所有这些都可以在没有任何协调¹的情况下完成。这种类型的异常被称为断裂读。

下一步

我们对胶合层架构作为探索不同开发者保障的手段感到兴奋。特别是有一整类应用可以从无服务器架构中受益,但需要找到将更强的一致性引入 Faas 世界的方法。

熟悉数据库内部的朋友可能已经注意到,我们这里讲到的读取原子性保证类似于无协调版本的快照隔离,这是传统数据库中常用的强一致性形式。我们正计划在此背景下探索如何将强一致性引入到无服务器应用中。如果你对这些有兴趣可以通过原文链接反馈给我们。

 


http://www.niftyadmin.cn/n/1603093.html

相关文章

整理出来了三篇Java面试问题,每一篇都是精髓(含答案)

前言 这两天在网上找了很多篇的Java面试题及答案的文章,整理出三篇面试可能都会问到的问题。我也给大家整理出了一些答案和一些代码步骤,希望对大家都有用。在这里也真心祝愿大家早日拿到自己心仪的offer! Java面试基础篇 一.、JDK 和 JRE…

程序员3月苦修,入职阿里,薪酬22K*16,却直呼后悔

就今天,霸哥的一个朋友程序员小王在朋友圈晒出了阿里的offer,本来就是一件值得高兴的事情,但小王怎么都高兴不起来...... 霸哥:小王,恭喜啊,这真的才三个月不到,就入职阿里了 程序员小王&#…

Netflix云原生微服务设计分析

1 概述 多年来Netflix一直是全球最好的在线订阅式视频服务供应商,其带宽占全球互联网带宽容量的15%以上。2019年,Netflix已经拥有了1.67亿用户,每季度新增用户超过500万,在200多个国家和地区运营。Netflix的用户每天观看视频超过…

剑指offer名企面试官讲述典型编程题,拿阿里offer这一份PDF足矣

本书总结了解决面试难题的常用方法,而不仅仅只是解决一道道零散的题目。在仔细分析、解决了几十道典型的面试题之后,我发现其实是有一些通用的方法可以在面试的时候帮助我们解题的。举个例子,如果面试的时候遇到的题目很难,我们可…

程序员学会了这套Lambda用法,何尝还会一筹莫展?

集合和方法引用的Lambda用法 这篇文章里我们来看看如何在Java集合类以及方法引用中使用lambda表达式,以增加代码重用并提高工作效率。 将Lambda表达式与集合类一起使用 从Java 8开始,Java支持用于处理集合元素的流功能。 Stream API是Java Collection…

分布式定时任务调度框架实践

分布式任务调度框架几乎是每个大型应用必备的工具,本文介绍了任务调度框架使用的需求背景和痛点,对业界普遍使用的开源分布式任务调度框架的使用进行了探究实践,并分析了这几种框架的优劣势和对自身业务的思考。 一、业务背景 1.1 为什么需…

编程“盲”逆袭架构师之后的独白

初生 知识改变命运,技术改变世界。当然,世界对我来说,是件很遥远的东西,哪怕身在其中。选择Java,不是想改变世界,只是兴趣爱好与生活使然。 记得当初自学HTML、CSS后(JS与其说不会,…

终终终于有人讲清楚了,年薪50W阿里开发深入解析MySql的架构

1. MySql基础架构 MySql你肯定很熟悉,如果你看到这篇文章,想必你和数据库打交道已经很多年了,你感觉MySql是那么熟悉,无非不就是增删改查吗? 嗯,你答对呢,我没办法否认绝大多数的程序员每天确…