在多个帧中拆分websocket消息



我在浏览器中使用本地javascript websocket,我们在AWS上托管了一个应用程序,每个请求都通过API网关。在某些情况下,请求数据会达到60kb,然后我的websocket连接会自动关闭。在AWS文档中,我发现了以下对这个问题的解释

https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-known-issues.html

API网关支持最大128 KB的消息有效负载,最大帧大小为32 KB。如果邮件超过32 KB,则必须将其拆分为多个帧,每个帧的大小不超过32 KB。如果收到更大的消息,连接将关闭,代码为1009。

我试图找到如何使用本地javascript websocket将消息拆分为多个帧,但在文档或其他任何中都找不到与帧相关的任何配置

虽然我发现了一些与消息碎片有关的东西,但它似乎是一个需要在前端和后端实现的自定义解决方案https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_servers#message_fragmentation

据我所知,您无法使用JS AWS SDK"postToConnection";API你能做的最好的事情就是写下你自己穷人的片段,并将这些片段作为独立的信息发送。

const splitInChunks =
(sizeInBytes: number) =>
(buffer: Buffer): Buffer[] => {
const size = Buffer.byteLength(buffer);
let start = 0;
let end = sizeInBytes;
const chunks: Buffer[] = [];
do {
chunks.push(buffer.subarray(start, end));
start += sizeInBytes;
end += sizeInBytes;
} while (start < size);
return chunks;
};

其中sizeInBytes必须小于32KB。然后在块上迭代:

await Promise.all(chunks.map(c => apiGatewayClient.postToConnection({ data: JSON.stringify(c), connectionId: myConnectionId })

根据块的数量,可能会遇到速率限制,因此考虑串行发送请求,而不是并行发送


最后一句话:Buffer.prototype.subarray非常有效,因为它不重新分配内存:新的块指向原始缓冲区的相同内存空间。C.中的指针算法

最新更新