首先的首先,可以先去了解一下lambda架构
Abstract
在本文中提出了Kappa,一个简化无服务器开发的框架。它使用检查点来处理lambda函数超时,并提供并发机制,实现并行计算和协调
1 Introduction
无服务器计算是一种新的云范例,在这种范例中,租户不是配置虚拟机(VM),而是向平台注册事件处理程序(例如 Python 函数)。当事件发生时,平台会在 lambda 函数(一种短暂的无状态执行环境)上调用处理程序。lambda 函数在终止前可以执行一段有界的时间(例如在 AWS 上为 15 分钟)
存在两个主要挑战:(1)程序员必须手动划分计算以适应 lambda 函数的时间限制;(2)程序员没有可用的并发或同步原语(如线程、锁、信号量等),因此必须要么实现这样的原语,要么限制自己使用无共享并行性,要么避免使用为简化开发而开发的并行 lambda 函数
2 Background and Motivation
2.1 Comparison to Existing Framework
2.2 Lambda Function Time Limit
无服务器计算中的Lambda函数存在时间限制的原因主要是为了优化运营商的任务分配和资源管理,运营商不再需要预测任务的完成时间或进行复杂的迁移操作,能够更灵活地进行任务分配和资源利用
3 Kappa Design
Kappa 有三个组成部分:(1)一个协调器,负责启动和恢复任务以及实现 Kappa 的并发原语;(2)一个编译器,负责生成检查点所需的代码;(3)一个库,供任务用于检查点、并发处理和同步
3.1 Coordinator
Kappa 协调器负责在 lambda 函数上安排任务、实现同步和跨任务通信、跟踪任务元数据(包括检查点)以及提供容错功能,协调器本身通过跨备份存储(例如,Redis 集群)复制其状态来支持容错,通过管理远程过程调用 (RPC) 来实现这一点,其中包括生成新任务、检查点、消息排队和检索任务结果等操作。
3.2 Checkpointing
Kappa使用检查点来容忍lambda函数超时并防止RPC重复,在任务执行的某些关键点创建“检查点”,将任务当前的运行状态(包括变量、控制流等)记录下来。使用了一种称为“continuations(延续)”的技术来创建检查点,延续是一种保存程序控制流的方式,这种方式无需依赖传统服务器持久化状态,而是通过序列化将任务的状态数据保存到外部存储(如Redis或S3)中,提供同步和异步两种检查点模式。同步检查点在保存状态时会短暂停止任务执行,而异步检查点则允许任务继续执行,检查点数据在后台保存,检查点数据分布存储在多个节点上,并支持多任务同时创建检查点
(b) 显示了由编译器生成的延续函数,用来保存检查点后的执行流程,(c) 使用异常处理机制在暂停点恢复,确保任务可以从中断处继续执行
3.3 Concurrency API
两种基本并发机制:任务启动和任务同步
任务启动 (spawn) 并行机制:spawn RPC 用于启动一个新任务,以并行的方式执行某个函数调用(如f(args)),并返回一个Future对象,用于跟踪任务的结果。工作机制是通过创建一个初始检查点。当系统恢复这个检查点时,会执行相应的函数调用。此时,协调器(Coordinator)会调用一个新的lambda函数,从该检查点恢复并执行任务。
先进先出(FIFO)队列机制:如果一个任务尝试向已满的队列入队或从空队列出队,任务将被阻塞。这个机制不仅可以用来实现任务间通信,还可以作为锁和信号量,控制资源的并发访问。
4 Implementation
编译器是用Python编写的,通过Python的pickle库进行状态序列化,每个任务由一个Go协程(goroutine)管理,任务间的同步使用Go的通道(channel)实现,通过锁机制和Redis事务来确保状态更新的原子性
5 Evaluation
检查点开销测试:通过让Lambda函数每100ms创建一次检查点,测量同步和异步检查点的延迟。同步检查点会暂停应用处理直到检查点数据持久化;异步检查点在后台完成持久化操作,允许前台的计算继续
并发操作性能测试:使用多生产者多消费者FIFO队列的任务间消息传递,以评估任务通信的延迟
端到端应用评估:测试包括五个Kappa应用场景:TPC-DS SQL查询、字数统计(Word Count)、并行Grep(Parallel Grep)、流处理(Streaming),以及网络爬虫(Web Crawler)
6 Limitations
Kappa编译器尚未完全支持Python的一些特性,包括try/except、yield、async/await、嵌套函数定义和全局变量,只能在由其编译器转换的代码中进行检查点操作,垃圾回收机制,缺乏静态检查可序列化。