簡體   English   中英

當有一個進行中的請求時,如何處理連接切換?

[英]How to handle connection switch while there is a OnGoing Request?

早上好 !! 我目前正在編寫一個Node.js腳本,該腳本正在與彈性集群聯系以獲取一些數據。

好腳本確實運行順利..我正在使用Mac。

現在,我遇到了一種情況,當腳本運行時,WiFi會從一個連接切換到另一連接,無論何時發生這種情況,我的腳本都會掛起。

如何在node.js中處理這些情況以重試該特定請求。

我正在使用請求模塊和節點v6 +。

每當我嘗試重現此錯誤時。 我的腳本掛起了很長時間,沒有拋出任何錯誤。

PS:我已經在嘗試“ ETIMEDOUT”,“ ECONNREFUSED”,“ ENETUNREACH”

更新1:

const request = require('request');
const co = require('co');

function _makeRequest(options) {
  return new Promise((resolve, reject) => {
    request(options, function (error, response, body) {
      if (error) return reject(error);
      return resolve(body);
    });
  })
}

function makeRequest() {
  let esOptions = { 
    method: 'GET',
    url: `http://www.google.com`
  };
  return _makeRequest(esOptions);
}


co(function *() {

  let result = yield makeRequest();

  console.log(result);

}).catch(err => {
  console.log(err);
})

要重現我面臨的問題,只需使用上面的腳本並使用wifi連接1。首先,不做任何調整,它將在控制台中打印html。 2.現在啟動腳本,一旦它開始將您的wifi連接切換到其他網絡並等待(對我而言,它不會引發任何超時錯誤或控制台中的任何錯誤)。

HTTP請求對TCP具有基礎依賴性。 當您的Mac切換與其關聯的wifi網絡時,您正在中斷已建立的TCP連接(沒有兩端通過RST數據包正常協商終止連接)。 然后,已建立的TCP連接將進入空閑但keep_alive狀態,在大多數Linux或Mac上,默認情況下,將在修剪此類空閑連接之前大約2小時。

(您可以通過以下方式檢查Mac的默認設置(以毫秒為單位):

# sysctl net.inet.tcp | grep keep
net.inet.tcp.keepidle: 7200000
net.inet.tcp.keepintvl: 75000
net.inet.tcp.keepinit: 75000
net.inet.tcp.keepcnt: 8
net.inet.tcp.always_keepalive: 0

因此,正如您所發現的那樣,您不會從已建立但空閑的TCP連接(從網絡層傳播)中自動收到中斷的大量通知; 您是否可以通過使用一些旨在管理基於wifi的網絡的npm模塊來創建另一個事件,以重新觸發重試邏輯?

我建議您使用google npm wifi ,看看是否有任何建議的軟件包適合您的情況。

暫無
暫無

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

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