node.js - DynamoDB 应用程序架构

标签 node.js amazon-web-services express amazon-dynamodb

我们使用 DynamoDB 与 node.js 和 Express 来创建 REST API。为了简化操作,我们已开始在后端使用 Dynamo。

我们已开始使用 AWS 实验室的 DynamoDB 文档开发工具包来简化使用,并轻松处理 JSON 文档。要实例化要使用的客户端,我们需要执行以下操作:

AWS = require('aws-sdk');
Doc = require("dynamodb-doc");
var Dynamodb = new AWS.DynamoDB();
var DocClient = new Doc.DynamoDB(Dynamodb);

我的问题是,为了确保数据完整性,最后两个步骤需要在哪里进行?我担心一个正在等待 Dynamo 中发生某些事情的对象被另一个进程接管并交换数据,从而导致错误的数据被发送回客户端,或者错误的数据被写入数据库。

我们的 REST API 分为三个部分。我们有主 server.js 文件,它启动 Express 和 HTTP 服务器,并向其分配资源,设置日志记录等。我们执行前两个步骤,创建与 Dynamo 的连接,创建 AWS 和 Doc 要求,位于那一点。这些变量在应用程序中是全局的。然后,我们根据 API 遵循的路线,调用一个 Controller 来解析其余调用的输入。然后,它调用一个模型文件,该文件与 Dynamo 进行交互,并将响应提供回 Controller , Controller 格式化返回包以及任何错误,并将其发送到客户端。该模型只是一组基本上覆盖应用程序相同区域的方法。例如,我们将有一个用户模型,其中涵盖应用程序中的登录和帐户创建等内容。

我已经完成了上面的最后两个步骤,在两个地方创建了发电机对象。一,我只是将它们放在一个位置,即每个模型文件的顶部。我不会在下面的方法中重新实例化它们,我只是使用它们。当我们准备调用 Dynamo 时,我还在方法中实例化了它们,使它们完全位于方法本地,并在需要时将它们传递给辅助函数。我一直认为第二种方法是最安全的方法。然而,在负载测试下,我遇到了这样的情况:我们似乎已经压垮了传出网络连接,并且我开始收到错误消息,告诉我 DynamoDB 端点在我运行的区域中不可用。我相信这是来自建立连接所需的额外调用。

所以,问题是,在模型文件本地创建这些对象是否安全,或者是否需要在使用它们的方法中本地创建它们?任何想法将不胜感激。

最佳答案

您应该安全地只创建这些客户端的一个实例并在您的代码中共享它们,但这与您根本关心的问题无关。

并发访问 DynamoDB 中的各种记录仍然是您必须处理的问题。可以有不同的请求同时尝试写入对象。如果您在单个服务器上有并发请求,则这是可能的,但当您有多个服务器时尤其如此。

对 DynamoDB 的写入仅在单个项目上是原子的。这意味着,如果您的逻辑需要多次更新以单独表中可能存在的单独项目,则无法保证进行所有更改或不进行任何更改。可能只能制作其中的一部分。

DynamoDB 本身支持 conditional writes所以可以保证满足特定的条件,比如特定的属性仍然有一定的值,否则写入会失败。

关于向 DynamoDB 发出过多请求...除非您的计算机不堪重负,否则不应该有任何方法来压垮 DynamoDB API。如果您执行的读/写操作超出了您已配置的范围,您将收到错误,指示已超出配置的吞吐量,但 API 本身在这些条件下仍可按预期运行。

关于node.js - DynamoDB 应用程序架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31682038/

相关文章:

node.js - 如何在 Mongoose 和Node.js中填充所有集合

node.js - 如何将 npm 链接与只能通过 ssh 访问的 git 存储库一起使用

node.js - 关于微服务架构的问题

node.js - 如何将 Telegram 的 TDlib 与 Node.js 结合使用

amazon-web-services - 如何使用您自己的 CA(使用 openssl)和 CDK 设置 IAM Roles Anywhere

node.js, express.js - 提供单个静态文件的最简单方法是什么?

node.js - 如何将 Google Analytics 跟踪代码与 node-express 应用程序一起使用?

javascript - Quasar q-input 元素在输入更改时不发出事件(vuejs)

java - AWS Lambda Java 如何读取属性文件

amazon-web-services - AWS 云形成 : Combining ImportValue and Sub functions causes error