Node.js Nginx代理+;NodeJS-WebSocket+&燃气轮机;17KB的消息。禁止通行。谁是罪魁祸首?
无法增加缓冲区宽度以避免丢弃帧 或 无法正确管理WS-fragmentationNode.js Nginx代理+;NodeJS-WebSocket+&燃气轮机;17KB的消息。禁止通行。谁是罪魁祸首?,node.js,go,nginx,websocket,buffer,Node.js,Go,Nginx,Websocket,Buffer,无法增加缓冲区宽度以避免丢弃帧 或 无法正确管理WS-fragmentation 总结 我的目标: GoLang app(Client) ---> :443 NGINX Proxy(Debian) ---> :8050 NodeJS WS Server 一件非常简单的事情:让websocket隧道在每个隧道中传输至少2/3MB的数据。我需要发送目录结构,因此数据可以非常多 问题: GoLang app(Client) ---> :443 NGINX Proxy(Debian
总结 我的目标:
GoLang app(Client) ---> :443 NGINX Proxy(Debian) ---> :8050 NodeJS WS Server
一件非常简单的事情:让websocket隧道在每个隧道中传输至少2/3MB的数据。我需要发送目录结构,因此数据可以非常多
问题:
GoLang app(Client) ---> :443 NGINX Proxy(Debian) ---> :8050 NodeJS WS Server
从A到B发送超过17KB的WebSocket消息会导致“通信丢失”或数据包丢失/丢失;连接/隧道仍然无法通过同一隧道从A到B发送新消息;相反,从B到A继续工作
我必须重新启动隧道才能恢复功能
这也可能是一个想法,即在达到阈值时重新启动隧道的数据包堆管理,但很明显,我需要一次发送超过阈值的数据包
信号路径:
GoLang app(Client) ---> :443 NGINX Proxy(Debian) ---> :8050 NodeJS WS Server
测试:
GoLang app(Client) ---> :443 NGINX Proxy(Debian) ---> :8050 NodeJS WS Server
- 发送X条消息/每个1000字节的数据块|在第17个数据块之前收到消息,但未收到以下消息(见下文)
GoLang app(Client) ---> :443 NGINX Proxy(Debian) ---> :8050 NodeJS WS Server
- Wiresharkon-Go应用程序显示所有数据包的流量
- tcpdump,在Debian机器上,设置为侦听
(公共),显示所有数据包的流eth
- tcpdump,在Debian机器上,设置为侦听
接口(用于rev代理扫描),显示所有数据包的流lo
- NodeJS/fastfy-websocket
显示到第17个区块ws.on('message',(msg)=>{console.log(msg)})
GoLang app(Client) ---> :443 NGINX Proxy(Debian) ---> :8050 NodeJS WS Server
GoLang应用程序相关部分
websocket.DefaultDialer = &websocket.Dialer{
Proxy: http.ProxyFromEnvironment,
HandshakeTimeout: 45 * time.Second,
WriteBufferSize: 1000, //also tried with 2000, 5000, 10000, 11000
}
c, _, err := websocket.DefaultDialer.Dial(u.String(), nil)
wsConn = c
bufferChunk := 1000
bufferSample := ""
for j := 7; j <= bufferChunk; j++ {
bufferSample = bufferSample + "0"
}
i := 1
for {
sendingBytes := i * bufferChunk
fmt.Println(strconv.Itoa(sendingBytes) + " bytes sent")
wsConn.WriteMessage(websocket.TextMessage, []byte(bufferSample))
i++
time.Sleep(1000 * time.Millisecond)
}
NodeJS代码:
//index.js
const config = require("./config.js");
const fastify = require('fastify')();
const WsController = require("./controller");
fastify.register(require('fastify-websocket'), {
/*these options are the same as the native nodeJS WS*/
options :{
maxPayload: 10 * 1024 * 1024,
maxReceivedFrameSize: 131072,
maxReceivedMessageSize: 10 * 1024 * 1024,
autoAcceptConnections: false
}
});
fastify.ready(err => {
if (err) throw err
console.log("Server started")
fastify.websocketServer
.on("connection", WsController)
})
//controller.js
module.exports = (ws, req) => {
ws.on("message", (msg) => {
log("msg received"); //it is shown as long as the tunnel does not "fill" up to 17KB
})
})
解决了的
更新fastfy和fastfy websocket问题消失。真可惜
我通过创建一个新的云实例并从头开始安装所有东西,提出了这个解决方案
只需npm更新
谢谢大家的支持
NGIX访问和错误日志文件中有什么?你有没有想过在中间没有NGIX的测试?“O.J.JONE什么都没有,只是<代码> *************************[[ 31 /OCT/2020:22:46:49 + 0100 ] ]当我关闭GO应用程序时,获取/终端HTTP / 1.1“101”63“-”“去HTTP客户机/1.1”< /C>在访问日志上。错误日志为clean@DanielFarrell嗯,我考虑过了。但实际上,真正的问题似乎(我说似乎)是NodeJS,在lo
接口上看到了tcpdump的结果。数据包正确地通过NGINX,正如我在NGINX节点之后看到的那样。我必须使用chromews客户端进行测试,因为在NodeJS的上下文中,我担心源代码中的错误碎片可能是问题的根源。我会尽量让你know@DanielFarrellChromeWS客户端已测试。总是一样的。