设计模式

Serverless 常见的设计模式

服务定义

import com.faas.function.*;
import reactor.core.publisher.Mono;

public class ExampleFunction implements RxFn<String, String> {

  public Mono<String> apply(String s, Context context) {
    context.getLogger().log("hello " + s);
    return Mono.just("Hello " + s);
  }
}
spec-version: 1.0
group: middleware
name: faas-test4
runtime: java8
handler: com.faas.demo.ExampleFunction

timeout: 50000
memory: 2048MB
cpu: 2

MicroServices Pattern | 微服务模式

在微服务模式中,每个作业或功能都在一个单独的 Lambda 函数中隔离运行,其中每个 Lambda 函数也将具有单个 http 端点,该端点用作该函数执行与访问的入口点。

service: serverless-social-network
provider: aws
functions:
  usersCreate:
    handler: handlers.usersCreate
    events:
      - http: post users/create
  commentsCreate:
    handler: handlers.commentsCreate
    events:
      - http: post comments/create

微服务模式的优势为:

  • 关注点完全分离。每个作业/操作都在一个单独的部署单元(即单独的 Lambda 函数)中,允许您单独修改应用程序的组件,而不会影响整个系统。这是一种非常敏捷和安全的模式,特别是在生产中。
  • 每个 Lambda 函数处理一个事件,使您的函数易于调试,因为通常只有一个预期的结果。
  • 这种关注点的分离对于自治团队来说也是很好的。他们可以独立地将功能推向生产。

微服务模式的劣势为:

  • 您将最终获得许多功能,这些功能难以管理并且可能导致大量的认知开销。Lambda 函数往往比传统的微服务更精细,所以为它们做好准备!
  • 性能可能会变慢。当函数处理单个作业时,它们被调用得更少,从而导致更多的冷启动。
  • 由于必须配置多个功能,因此部署速度会变慢。
  • 您可以快速达到 CloudFormation 模板文件大小限制,尤其是在您使用自定义资源时。

Services Pattern | 服务模式

在服务模式中,单个 Lambda 函数可以处理通常通过数据模型或共享基础结构依赖关系的一些(~4)作业,譬如 Users 数据模型上的所有操作都在单个 Lambda 函数中执行,并为所有 CRUD 操作创建多个 HTTP 端点。

service: serverless-social-network
provider: aws
functions:
  users:
    handler: handler.users
      events:
        - http: post users
        - http: put users
        - http: get users
        - http: delete users
  comments:
    handler: handler.comments
      events:
        - http: post comments
        - http: put comments
        - http: get comments
        - http: delete comments

您可以通过解析代码中的事件主体来检查传入的 HTTP 请求的路径和方法,然后执行正确的操作以作为响应。这就像在 Lambda 代码的开头有一个小路由器。

服务模式的优势为:

  • 这将导致您需要管理的 Lambda 函数减少。
  • 一些关注点仍然存在。
  • 团队仍然可以自主工作。
  • 更快的部署。
  • 从理论上讲,性能更好。当多个作业在 Lambda 函数中时,Lambda 函数更有可能被更频繁地调用,这意味着 Lambda 将保持温暖并且用户将遇到较少的冷启动。

服务模式的缺陷为:

  • 调试变得稍微复杂一些,因为 Lambda 函数正在处理多个作业,并且具有不同的结果。
  • 需要创建路由器以根据请求方法或端点调用正确的逻辑。
  • 由于在同一 Lambda 函数中放置多个操作,因此功能大小更大。

Monolithic Pattern | 巨石模式

在 Monolithic Pattern 中,您的整个应用程序都被塞入单个 Lambda 函数中。在我们的示例应用程序中,我们的整个应用程序都在一个 Lambda 函数中,所有 HTTP 端点都指向该 Lambda 函数。

service: serverless-social-network
provider: aws
functions:
  socialNetwork:
    handler: handler.socialNetwork
      events:
        - http: post users
        - http: put users
        - http: get users
        - http: delete users
        - http: post comments
        - http: put comments
        - http: get comments
        - http: delete comments

巨石模式的好处:

  • 单个 Lambda 函数更容易理解和管理。它更像是一种传统的设置。
  • 快速部署,具体取决于总代码大小。
  • 从理论上讲,性能更快。您的单个 Lambda 函数将被频繁调用,您的用户不太可能遇到冷启动。

巨石模式的缺点:

  • 需要在 Lambda 函数中构建更复杂的路由器,并确保它始终指向调用适当的逻辑。
  • 理解表现更难。Lambda 函数将运行各种持续时间。
  • 由于功能更大,您可以轻松地在实际应用中达到 Lambda 大小限制。

GraphQL 模式

Graph Pattern 类似于 Monolithic Pattern,但它允许您利用 GraphQL 将整个 REST API 及其所有端点减少为 1-2 个端点。因此,整个应用程序将由一个函数和一个处理 GraphQL 查询的 1-2 个端点组成。然后 GraphQL 将以您需要的任何形式获取正确的数据。

service: serverless-social-network
provider: aws
functions:
  socialNetwork:
    handler: handler.socialNetwork
      events:
        - http: get query

GraphQL 模式的好处:

  • 使用单个 Lambda 函数和整个应用程序的单个端点非常容易管理。
  • 从理论上讲,性能更快。您的单个 Lambda 函数将被频繁调用,您的用户不太可能遇到冷启动。
  • 由于您只有一个功能和一个端点,因此快速部署
  • 按执行付费,零管理,图形 API !!! 它没有比那更有效率!

GraphQL 模式的缺点:

  • 由于功能庞大,您可以轻松地在实际应用中达到 Lambda 大小限制。
  • 你必须学习 GraphQL。
上一页