【发布时间】:2021-01-17 12:34:04
【问题描述】:
我正在实施一个人们可以一起玩棋盘游戏的网站。他们的动作通过一个简单的 websocket 传递,该 websocket 只是将消息中继到其他客户端。我曾经在 node 中实现 websocket 并从 AWS EC 实例提供服务,但我决定尝试转向无服务器,Websocket API。
我关注了this tutorial,它描述了与我几乎相同的用例。
更改为无服务器后,延迟显着增加(从
var AWS = require('aws-sdk');
var dynamodb = new AWS.DynamoDB();
let active_connnections = null;
const get_active_connections = async () => {
const data = await dynamodb.scan({ TableName: process.env.TABLE_NAME }).promise();
active_connnections = data.Items.map(id => id.id.S);
};
let endpoint = null;
const connect_endpoint = async () => {
endpoint = new AWS.ApiGatewayManagementApi({endpoint: process.env.ENDPOINT});
};
const init = async (myConnectionId) => {
var promisesToRun = [];
if ((!active_connnections) || !active_connnections.includes(myConnectionId)) {
promisesToRun.push(get_active_connections());
}
if (!endpoint) {
promisesToRun.push(connect_endpoint());
}
await Promise.all(promisesToRun);
};
const send_message = async (connectionId, message) => {
try {
await endpoint.postToConnection({ ConnectionId: connectionId, Data: JSON.stringify(message)}).promise();
} catch (e) {
if (e.statusCode == 410) {
await dynamodb.deleteItem({ TableName: process.env.TABLE_NAME, Key: { id: {S: connectionId } } } ).promise();
} else {
throw e;
}
}
};
exports.handler = async (event, context) => {
await init(event.requestContext.connectionId);
const postCalls = items.map(async (id) => send_message(id, JSON.parse(event.body)));
await Promise.all(postCalls);
当我的 lambda 没有冷启动到可接受的水平时,这减少了延迟。但是,lambda 的销毁速度相对较快(打开连接后 1-2 秒)。
是否有任何其他技巧或不同的解决方案可以让我在较长时间内保持低延迟?
【问题讨论】:
-
items.mapawait init之后的下一行...想知道items的定义在哪里? -
您是否排除了 DynamoDB 交互,例如通过在您的 Lambda 中硬编码代表性 DDB 数据并简单地使用它而不是实际调用 DynamoDB?
标签: amazon-web-services websocket aws-lambda aws-serverless