簡體   English   中英

如何防止 socket io 客戶端(瀏覽器)被來自服務器的巨大負載溢出?

[英]How to prevent socket io client (browser) from being overflowed with huge payload coming from server?

我有一個 React.js 客戶端應用程序和一個 Node.js 服務器應用程序,Node.js 應用程序通過socket.io從另一個微服務實時接收 json 數據。 JSON 數據發送非常頻繁,這會破壞客戶端應用程序。 例如:

  • 我停止了服務器,但客戶端仍然收到數據
  • 如果我嘗試刷新瀏覽器,刷新需要很長時間
  • 它還用於斷開和重新連接套接字(我通過增加pingTimeout解決了這個問題,但這並沒有解決其他問題)

我還通過增加maxHttpBufferSizeupdateTimeout來使用它們,但這並沒有真正幫助。 減少maxHttpBufferSize停止接收消息,但我希望它們以不破壞我的客戶端應用程序的方式接收。

有什么建議可以改善我的處境嗎?

編輯:如果我不發送所有消息而是每隔一秒左右跳過一次,它也可以工作,但我不確定如何實現這一點?

背壓可以通過確認來實現:

  • 客戶端在成功處理數據包后通知服務器
socket.on("my-event", (data, cb) => {
  // do something with the data
  // then call the callback
  cb();
});
  • 服務器必須在發送更多數據包之前等待確認
io.on("connection", (socket) => {
  socket.emit("my-event", data, () => {
    // the client has acknowledged the packet, we can continue
  });
})

參考: https ://socket.io/docs/v4/emitting-events/#acknowledgements

注意:使用易失性數據包在這里不起作用,因為沒有考慮服務器上緩沖的數據量

參考: https ://github.com/websockets/ws/blob/master/doc/ws.md#websocketbufferedamount

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM