DynamoDB应用程序架构



我们正在使用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进行交互,并将响应返回给控制器,控制器将返回包与任何错误一起格式化,并将其发送给客户端。模型只是一组方法,它们基本上覆盖了应用程序的相同区域。例如,我们会有一个用户模型,它涵盖了应用程序中的登录和帐户创建等内容。

我已经完成了上面在两个地方创建dynamo对象的最后两个步骤。首先,我简单地将它们放在一个位置,在每个模型文件的顶部。我没有在下面的方法中重新配置它们,我只是使用它们。当我们准备对Dynamo进行调用时,我还在方法中实例化了它们,使它们完全局部化到方法中,并在需要时将它们传递给次要函数。我一直认为第二种方法是最安全的方法。然而,在负载测试中,我遇到了这样的情况,我们似乎已经淹没了传出的网络连接,并且我开始得到错误,告诉我DynamoDB端点在我正在运行的区域不可用。我相信这是连接所需的额外电话费用。

所以,问题是,在模型文件本地创建这些对象是安全的,还是需要在使用它们的方法中本地创建它们?

您应该安全地创建这些客户机的一个实例并在代码中共享它们,但这与您的潜在关注点无关。

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

对DynamoDB的写入仅在单个项上是原子性的。这意味着,如果您的逻辑需要对可能在不同表中的单独项进行多次更新,则无法保证所有更改或没有更改。有可能只有其中的一些可以被制造出来。

DynamoDB原生支持条件写入,因此可以确保满足特定条件,例如特定属性仍然具有某些值,否则写入将失败。

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

相关内容

  • 没有找到相关文章

最新更新