AWS Websocket在发送新消息之前不会接收先前的消息。

3
大部分情况下,消息可以正常传递,但有几条消息在接收客户端发送消息之前无法接收。这种情况对于特定的方法/消息来说是每次都发生的,但对于其他方法/消息则完全没有发生。
例如:用户1发送一条消息,然后用户2发送一条消息以接收用户1的消息。
相关资料:
1. 已删除的问题:websocket receives previous message only when new message is sent 2. Github问题:webSocket client does not receive messages before sending...

你有进展吗?我们遇到了类似的问题。 - Bamdad Dashtban
@BamdadDashtban 没有,我有点放弃了。你们呢?你们能在这个问题上取得进展吗? - Spankied
1
我们不得不重写这个lambda函数。我认为这可能与承诺有关。 - Bamdad Dashtban
1个回答

2
我们遇到了这个问题,解决方案与我们编写的承诺有关。我们最初使用了Amazon提供的示例代码。 https://github.com/aws-samples/simple-websockets-chat-app/blob/master/sendmessage/app.js#L26
const postCalls = connectionData.Items.map(async ({ connectionId }) => {
    try {
      await apigwManagementApi.postToConnection({ ConnectionId: connectionId, Data: postData }).promise();
    } catch (e) {
      if (e.statusCode === 410) {
        console.log(`Found stale connection, deleting ${connectionId}`);
        await ddb.delete({ TableName: TABLE_NAME, Key: { connectionId } }).promise();
      } else {
        throw e;
      }
    }
  });

我相信使用异步函数作为映射函数不会正常或可靠地工作(不管什么原因,可能已经在某个地方有记录),所以我们将其改为简单的for循环,这解决了问题。

for(const connection of connectionData.Items) {
    const connectionId = connection.connectionId;
    ...same logic goes here
}

没有测试过,但我发誓如果这个能行… - Spankied
那个示例代码是有效的,但你必须继续按照示例使用await Promise.all(postCalls);,否则Lambda可能会在处理完成之前退出。for/of方法也不错,区别在于for/of会按顺序将每个连接发送,而AWS示例会并行地发送所有连接,然后等待所有连接完成(如果您确实跟进了await Promise.all调用)。 - Adam Fanello
这对我来说也完美地起作用了。非常感谢你,@Programmer Unextraordinair。 - JDTLH9

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接