Uber 的 Serverless 实战:如何消除 “冷启动” 延迟?

· 约 4 分钟读完

在 Serverless 架构中,函数在第一次被调用时会出现一个延迟,这被称为“冷启动”延迟。这是因为当一个函数被第一次调用时,云提供商需要初始化一个新的容器来执行该函数。这个过程需要时间,因此会导致延迟。这个延迟可能会影响用户体验,特别是在需要快速响应的应用程序中。

Uber 是一家拥有大规模 Serverless 架构的公司,他们在实际应用中遇到了“冷启动”延迟的问题。在这篇文章中,我们将探讨 Uber 是如何消除这个延迟的,并提供一些指导意义。

Uber 的解决方案

Uber 的解决方案是使用 AWS Lambda@Edge,该服务允许开发人员在全球范围内运行 Lambda 函数。在这个方案中,Uber 使用 Lambda@Edge 来缓存函数容器,从而消除了“冷启动”延迟。

具体来说,Uber 将 Lambda 函数部署到多个地理位置。当一个函数被第一次调用时,它会在一个特定的位置上被初始化。然后,该函数的容器将被缓存,以便在下一次调用时可以更快地响应。

这个方案的一个关键优势是,它可以根据每个请求的来源位置来选择最近的 Lambda 函数缓存位置。这样,每个用户都可以获得最快的响应时间。此外,由于 Lambda@Edge 服务已经在全球范围内部署,因此 Uber 不需要自己来处理全球网络部署的复杂性。

实现细节

现在,让我们看一下 Uber 是如何实现这个方案的。

首先,Uber 将他们的 Lambda 函数部署到多个地理位置。这些地理位置包括美国、欧洲和亚洲。然后,他们使用 AWS Route 53 进行全球负载均衡,以便将每个请求转发到最近的 Lambda 函数缓存位置。

在 Lambda 函数中,Uber 使用了一个技巧来缓存容器。他们在函数中添加了一个名为“warmup”的代码块。当 Lambda 函数被初始化时,这个代码块将被执行。在这个代码块中,Uber 执行一些基本操作,例如加载一些库和数据。这样,函数的容器就会被缓存,以便在下一次调用时可以更快地响应。

这个技巧的关键在于,Lambda 函数的容器在缓存之前只有一个短暂的生命周期。因此,在函数的“warmup”代码块中执行一些基本操作,可以让容器保持活跃状态,并且可以在下一次调用时更快地响应。

示例代码

下面是一个示例代码,演示了如何在 Lambda 函数中使用“warmup”代码块来缓存容器。在这个示例中,我们使用 Node.js 编写一个 Lambda 函数,该函数接受一个名为“name”的参数,并返回一个欢迎消息。

在这个示例中,我们定义了两个函数:handler 和 warmup。handler 函数是我们的主函数,它接受一个名为“name”的参数,并返回一个欢迎消息。warmup 函数是我们的“warmup”代码块,它在函数被初始化时执行。

指导意义

通过 Uber 的例子,我们可以得出一些指导意义:

  1. 在 Serverless 架构中,消除“冷启动”延迟是非常重要的。它可以显著提高用户体验,特别是在需要快速响应的应用程序中。

  2. AWS Lambda@Edge 是一个非常有用的服务,可以帮助我们消除“冷启动”延迟。通过将 Lambda 函数部署到多个地理位置,并使用全球负载均衡,我们可以选择最近的 Lambda 函数缓存位置,从而提高响应时间。

  3. 在 Lambda 函数中使用“warmup”代码块来缓存容器是一个非常有用的技巧。通过执行一些基本操作,我们可以让容器保持活跃状态,并且可以在下一次调用时更快地响应。

  4. 在 Serverless 架构中,全球网络部署是一个非常复杂的问题。使用 AWS Lambda@Edge 可以帮助我们解决这个问题,从而让我们专注于应用程序的开发和部署。

在实践中,我们应该根据自己的应用程序需求来选择适当的解决方案。但是,通过了解 Uber 的例子,我们可以获得一些有用的指导意义,从而更好地设计和部署我们的 Serverless 应用程序。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67d52909a941bf71349890fb