【问题标题】:What are some patters for designing REST API for user-based platform in AWS?在 AWS 中为基于用户的平台设计 REST API 有哪些模式?
【发布时间】:2019-01-25 06:15:37
【问题描述】:

在构建 REST API 时,我正在尝试转向无服务器架构。我来自 Ruby on Rails 背景。

我已经成功理解和适应了 Api Gateway、Cognito、RDS 和 Lambda 函数等服务,但是我正在努力以最佳方式将它们组合在一起。

我的情况如下。当有多个与应用程序成员相关的资源(例如博客应用程序)时,我有一个简单的基于用户的平台。

我使用 Cognito 进行身份验证,使用 Aurora 作为数据库服务来保存文章和喜欢的内容。

由于数据库和 Cognito 用户池是解耦的,我很难做这样的事情:

获取喜欢特定文章的用户

获取用户 cmets

这对我来说似乎有问题,因为我需要将一些唯一的 Cognito 用户标识符(在 API 网关的授权阶段检索)传递给 lambda 函数,然后该函数将使用对该用户的外部引用保存数据库记录。另一方面,如果我要获取特定用户,首先我必须从我的关系数据库中获取他们的标识符,然后从 Cognito 用户池中请求用户详细信息。我缺乏一些在我的 lambda 函数中访问当前用户的标准方法以及轻松将数据库记录与该用户关联的机制..

我还没有找到一些令人信服的推荐模式来设计此类应用程序,尽管这似乎是一个非常常见的问题,而且如果我的方法是正确的,我很难挣扎..

我希望有一些 cmets 在设计简单的基于用户的平台时需要考虑哪些模式以及我的解决方案存在哪些缺陷。任何文章和示例也将非常有帮助。 提前致谢。

【问题讨论】:

    标签: rest amazon-web-services aws-lambda aws-api-gateway amazon-cognito


    【解决方案1】:

    这些听起来像是与分布式独立数据库相关的标准问题。您不能再将所有关系委托给数据库并获得以某种方式聚合它们的结果。您必须自己调用一个数据库,然后调用另一个。

    对于这样的情况:

    获取喜欢特定文章的用户

    您将查找“喜欢”数据库以确定喜欢它的人的用户 ID,然后查找“用户”数据库以确定用户详细信息,例如姓名和头像。

    大多数模式都遵循标准的数据库建议,例如在上面的例子中,你可以遵循去规范化的面向性能的模式——只要你觉得额外的存储空间和负担保持一致是通过减少查询来证明的(可能有太多的喜欢来证明这一点)。

    另一个重要的做法是使用批量查询来避免 N+1 查询。这就是 Rails 使用 includes 语法所做的事情,但您可能必须在这里自己做。在我的示例中,它应该只需要两个查询,因为第二个查询应该通过查询与用户 ID list 匹配的用户一次性获取所有必需的用户数据。

    最后,我建议你尝试抽象一些东西。这种代码很快就会变得杂乱无章,因此请务必构建一个封装良好的数据层,将应用程序代码与处理多个数据库的杂乱无章的情况隔离开来。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-24
      • 1970-01-01
      • 2018-05-05
      相关资源
      最近更新 更多