【问题标题】:Throughput and rate limit for AWS ApiGatewayManagement.postToConnection (websockets)AWS ApiGatewayManagement.postToConnection (websockets) 的吞吐量和速率限制
【发布时间】:2021-06-23 23:23:50
【问题描述】:

我开发了一个网站,该网站托管两人棋盘游戏(西洋双陆棋),在进行比赛时,其他用户可以实时查看和观看比赛。实现游戏逻辑的 AWS lambda 通过 websocket 接受玩家的移动,存储在 DynamoDB 中并使用ApiGatewayManagement.postToConnection 通知玩家和观察者有关棋盘状态的变化。

要向观察者发送更新,我正在使用Promise.all 像这样...

await Promise.all(watchers.map(to => gateway.postToConnection({
  ConnectionId: to,
  Data: <message>
})))

这适用于少数观察者 (10-20)。我的问题是这将如何扩展到 100 甚至 1,000 名观察者。我无法完全确认这一点,但从 XRay 看来,使用上述方法,通知是分批进行的,四个并发 postToConnection 调用。

  • 节点线程池是否在这种情况下发挥作用?我不是 100% 清楚节点是否会使用 NIO 并一次触发 100 个后端请求以获得 100 个通知,或者将它们放在其内部线程池中,这会将并发请求限制在少量。我在这里假设postToConnection 会导致对 AWS 服务的 http 调用,并且该调用可以使用 NIO。

  • 拨打postToConnection 的速率是否受到限制?关于 API 网关的入站速率限制有很好的信息,但我找不到任何关于 出站 速率限制的信息

非常感谢。

【问题讨论】:

标签: node.js amazon-web-services websocket aws-api-gateway


【解决方案1】:

关于您的第二个问题:“对postToConnection 的通话是否受到限制?” - 是的。这包含在default quota of 10,000 Requests Per Second per AWS account 中。此限制与其他 API 调用共享,可以通过联系 AWS 支持来提高。

【讨论】:

    【解决方案2】:

    感谢 Joe Nye 的回答,在重新阅读文档时,这似乎很清楚。要回答第一部分,我们需要假设 postToConnection 在幕后发出一个 http 请求。我做了一个小测试,看起来Promise.all 会并行调用任意数量的请求(取决于系统资源)。

    为了测试它,我写了一个小快递服务器和客户端......

    // server.js
    const express = require("express")
    const http = require("http")
    
    const app = express()
    
    const server = http.createServer(app)
    
    function sleep(time) {
        return new Promise((resolve) =>{
            setTimeout(resolve, time)
        })
    }
    
    let conn=1
    app.post("/", async (req, res) => {
        console.log("Serving", conn++)
        await sleep(5000)
        res.send("OK")
    })
    
    server.listen(9000, () => {
        console.log(`Server running on port: 9000`)
    })
    
    // client.js
    const fetch = require("node-fetch")
    
    async function run() {
        const promises = Array.from({length: 1000})
            .map((_, index) => fetch("http://localhost:9000", {method: "POST"})
                .then(r => console.log("Fetch", index, "complete")))
        
        return Promise.all(promises)
    }
    
    run().catch(err => console.log(err))
    

    当我运行客户端时,“Serving 0..999”立即出现在服务器控制台上,然后 5 秒后“Fetch 0..999 完成”立即出现在客户端控制台上。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-08
      • 2018-06-25
      • 2016-07-22
      • 1970-01-01
      相关资源
      最近更新 更多