DynamoDB 应用架构
DynamoDB Application Architecture
我们将 DynamoDB 与 node.js 和 Express 结合使用来创建 REST API。为了简化操作,我们已经开始在后端使用 Dynamo。
我们已开始使用 AWS 实验室的 DynamoDB 文档 SDK 来简化使用,并使 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 所遵循的路由,调用一个控制器来解析来自 rest 调用的输入。然后它调用一个模型文件,该文件与 Dynamo 进行交互,并将响应提供回控制器,控制器格式化 return 包以及任何错误,并将其发送给客户端。该模型只是一组基本上覆盖应用程序相同区域的方法。例如,我们会有一个用户模型,涵盖应用程序中的登录和帐户创建等内容。
我已经在两个地方完成了上面最后两个步骤来创建 dynamo 对象。第一,我只是将它们放在一个位置,在每个模型文件的顶部。我不会在下面的方法中重新实例化它们,我只是简单地使用它们。当我们准备调用 Dynamo 时,我还在方法中实例化了它们,使它们完全在方法本地,并在需要时将它们传递给辅助函数。第二种方法一直让我印象深刻,认为它是最安全的方法。但是,在负载测试下,我 运行 遇到了我们似乎已经不堪重负的传出网络连接的情况,并且我开始收到错误消息,告诉我 DynamoDB 端点在我所在的区域不可用 运行加入。我相信这是来自建立连接所需的额外调用。
所以,问题是,在模型文件本地创建这些对象是否安全,或者它们是否需要在使用它们的方法中本地创建?任何想法将不胜感激。
您只创建这些客户端的一个实例并在您的代码中共享它们应该是安全的,但这与您的根本问题无关。
并发访问 DynamoDB 中的各种记录仍然是您必须处理的事情。可以让不同的请求同时尝试写入对象。如果您在单个服务器上有并发请求,这是可能的,但当您有多个服务器时尤其如此。
对 DynamoDB 的写入仅在单个项目上是原子的。这意味着如果您的逻辑需要对可能在单独表中的单独项目进行多次更新,则无法保证所有或 none 这些更改都已完成。有可能只能做出一部分。
DynamoDB原生支持conditional writes所以可以保证满足特定的条件,比如特定的属性仍然有一定的值,否则写入会失败。
关于向 DynamoDB 发出过多请求...除非您让您的机器不堪重负,否则应该没有任何方法可以使 DynamoDB 不堪重负 API。如果您执行的 read/writes 超出您配置的数量,您将收到错误消息,指示已超出配置的吞吐量,但 API 本身在这些条件下仍按预期运行。
我们将 DynamoDB 与 node.js 和 Express 结合使用来创建 REST API。为了简化操作,我们已经开始在后端使用 Dynamo。
我们已开始使用 AWS 实验室的 DynamoDB 文档 SDK 来简化使用,并使 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 所遵循的路由,调用一个控制器来解析来自 rest 调用的输入。然后它调用一个模型文件,该文件与 Dynamo 进行交互,并将响应提供回控制器,控制器格式化 return 包以及任何错误,并将其发送给客户端。该模型只是一组基本上覆盖应用程序相同区域的方法。例如,我们会有一个用户模型,涵盖应用程序中的登录和帐户创建等内容。
我已经在两个地方完成了上面最后两个步骤来创建 dynamo 对象。第一,我只是将它们放在一个位置,在每个模型文件的顶部。我不会在下面的方法中重新实例化它们,我只是简单地使用它们。当我们准备调用 Dynamo 时,我还在方法中实例化了它们,使它们完全在方法本地,并在需要时将它们传递给辅助函数。第二种方法一直让我印象深刻,认为它是最安全的方法。但是,在负载测试下,我 运行 遇到了我们似乎已经不堪重负的传出网络连接的情况,并且我开始收到错误消息,告诉我 DynamoDB 端点在我所在的区域不可用 运行加入。我相信这是来自建立连接所需的额外调用。
所以,问题是,在模型文件本地创建这些对象是否安全,或者它们是否需要在使用它们的方法中本地创建?任何想法将不胜感激。
您只创建这些客户端的一个实例并在您的代码中共享它们应该是安全的,但这与您的根本问题无关。
并发访问 DynamoDB 中的各种记录仍然是您必须处理的事情。可以让不同的请求同时尝试写入对象。如果您在单个服务器上有并发请求,这是可能的,但当您有多个服务器时尤其如此。
对 DynamoDB 的写入仅在单个项目上是原子的。这意味着如果您的逻辑需要对可能在单独表中的单独项目进行多次更新,则无法保证所有或 none 这些更改都已完成。有可能只能做出一部分。
DynamoDB原生支持conditional writes所以可以保证满足特定的条件,比如特定的属性仍然有一定的值,否则写入会失败。
关于向 DynamoDB 发出过多请求...除非您让您的机器不堪重负,否则应该没有任何方法可以使 DynamoDB 不堪重负 API。如果您执行的 read/writes 超出您配置的数量,您将收到错误消息,指示已超出配置的吞吐量,但 API 本身在这些条件下仍按预期运行。