在哪里调用DynamoDB的实例? 每次请求一次或一次?

我有麻烦在哪里创build我的应用程序多个用户与应用程序交互的dynamodb实例。 我应该在程序加载并创build客户端时创build它,还是应该将其放入到我的路由中,以便对数据库进行调用,因此对login路由的每个请求都将创build一个实例?

var express = require('express'); var app = express(); var AWS = require('aws-sdk'); AWS.config.update({ region: "us-west-2", endpoint: "http://localhost:8000" }); //Is this the right place. Outside of where the database call is being made var dynamodbDoc = new AWS.DynamoDB.DocumentClient(); app.post('/login', function (req, res) { //OR should I create a new instance of AWS.DynamoDB.DocumentClient() here every time a request is made? // var dynamodbDoc = new AWS.DynamoDB.DocumentClient(); ???? var login_username = req.body.login_username; var login_password = req.body.login_password; var params = { TableName : "Users", Key: { 'username': login_username, 'password': login_password } }; dynamodbDoc.get(params, function(err, data) { if (err) console.log(err); else console.log(data); }); }); var server = app.listen(3000, function () { var host = server.address().address; var port = server.address().port; console.log('Example app listening at http://%s:%s', host, port); }); 

从文档看起来像使用节点默认http连接池(假设,不是100%)的请求。

亚马逊sdk允许你configuration它与你自己的代理,指定你的池的大小。

https://nodejs.org/api/http.html#http_new_agent_options

这应该是可以作出亚马逊sdk的连接数的上限。 以下代码从节点http和amazon节点sdk docs拼凑在一起,未经testing,可能不完全准确:

 var http = require('http'); var dynamoAgent = new http.Agent({maxSockets: 20}) AWS.config.update({ region: "us-west-2", endpoint: "http://localhost:8000", httpOptions: { agent: dynamoAgent } }); 

这应该让你有一个20个sockets池。 我不确定maxSockets的细微差别,(如果套接字可用,请求阻塞,套接字如何重用,如何继续工作等)。

20是任意的,你的应用程序编号可能需要摆弄,看看什么效果最好。

节点全局代理默认为无限数量的最大套接字,如果您的后端点具有非常高的stream量,这可能会太多。 限制连接数量可能更为理智。