精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Node.js DNS 模塊的小優化

開發 前端
c-ares 支持緩存 DNS 響應,具體的緩存時間取決于 DNS 響應報文的 ttl 和 c-ares 的配置。下面是處理 DNS 響應時記錄緩存的代碼。

這幾天看到了一個關于緩存 Node.js DNS 結果的 PR,然后看了下 c-ares 的代碼,發現 Node.js DNS 模塊也有些可以改進的小地方,所以提交了兩個 PR 嘗試進行優化,本文簡單介紹下相關的內容。

c-ares

c-ares 庫是一個異步的 DNS 解析庫,在 Node.js 中的工作原理如下。

  1. Node.js 調用 c-ares 發起一個 DNS 查詢,并注冊回調。
  2. c-ares 創建一個 socket,通知 Node.js 監聽該 socket 的讀事件。
  3. 該 socket 可讀,Node.js 通知 c-ares,c-ares 讀取響應,并通知 Node.js。
  4. Node.js 調 c-ares 接口解析 DNS 響應。
  5. c-ares 回調 Node.js。

另外 Node.js 還會定時調 c-ares 函數,c-ares 會判斷是否查詢請求是否超時。大致了解 c-ares 的基礎后,接下來看看相關的內容。

1. DNS 緩存

c-ares 支持緩存 DNS 響應,具體的緩存時間取決于 DNS 響應報文的 ttl 和 c-ares 的配置。下面是處理 DNS 響應時記錄緩存的代碼。

static ares_status_t ares_qcache_insert_int(ares_qcache_t           *qcache,
                                            ares_dns_record_t       *qresp,
                                            const ares_dns_record_t *qreq,
                                            const ares_timeval_t    *now)
{
  ares_qcache_entry_t *entry;
  unsigned int         ttl;
  // DNS 響應報文信息
  ares_dns_rcode_t     rcode = ares_dns_record_get_rcode(qresp);
  ares_dns_flags_t     flags = ares_dns_record_get_flags(qresp);
  // 獲取 DNS 響應報文的 ttl
  ttl = ares_qcache_calc_minttl(qresp);
  // 和用戶配置的 ttl 比較,取最小值
  if (ttl > qcache->max_ttl) {
    ttl = qcache->max_ttl;
  }
  // 插入緩存
  entry->dnsrec    = qresp;
  entry->expire_ts = (time_t)now->sec + (time_t)ttl;
  entry->insert_ts = (time_t)now->sec;

  entry->key = ares_qcache_calc_key(qreq);
  ares_htable_strvp_insert(qcache->cache, entry->key, entry);
  ares_slist_insert(qcache->expire, entry);
  return ARES_SUCCESS;

}

下面是 DNS 查詢時緩存的處理。

if (!(flags & ARES_SEND_FLAG_NOCACHE)) {
    status = ares_qcache_fetch(channel, &now, dnsrec, &dnsrec_resp);
    // 存在緩存直接返回
    if (status != ARES_ENOTFOUND) {
      callback(arg, status, 0, dnsrec_resp);
      return status;
    }
  }

但是 c-ares 1.31.0 后自動開啟了緩存,這對于用戶來說可能不是預期的行為,所以 Node.js 提交了 PR 關閉了緩存能力,保證了兼容性。同時,Node.js 后續會提供選項讓用戶可以自定義配置緩存的時間。具體可以參考以下 PR。

在了解這個 PR 的同時,也發現了兩個 Node.js DNS 模塊的優化點。

2. 定時器的超時時間

Node.js 會定時調用 c-ares 函數,讓 c-ares 判斷查詢請求是否超時,目前 Node.js DNS 模塊的定時器邏輯如下。

void ChannelWrap::StartTimer() {
  int timeout = timeout_;
  if (timeout == 0) timeout = 1;
  if (timeout < 0 || timeout > 1000) timeout = 1000;
  uv_timer_start(timer_handle_, AresTimeout, timeout, timeout);
}

可以看到當 timeout 小于 0 時,定時間隔為 1000ms,也就是說 Node.js 會每隔 1000ms 回調 c-ares 判斷查詢是否超時,而當 timeout 等于 0 時,Node.js 設置的定時間隔為 1ms,但是在 c-ares 中當 timeout 等于 -1 和等于 0 時的邏輯是一樣的,都是使用默認的超時時間 2s,相關代碼如下。

if (optmask & ARES_OPT_TIMEOUTMS) {
    // 小于 0 則使用默認值
    if (options->timeout <= 0) {
      optmask &= ~(ARES_OPT_TIMEOUTMS);
    } else {
      channel->timeout = (unsigned int)options->timeout;
    }
}

if (channel->timeout == 0) {
  channel->timeout = DEFAULT_TIMEOUT; // 2s
}

所以如果用戶設置 timeout = 0,Node.js 就會頻繁地調用(每隔 1ms)c-ares 判斷是否超時,但這是沒必要的。優化后的代碼如下。

void ChannelWrap::StartTimer() {
  int timeout = timeout_;
  if (timeout <= 0 || timeout > 1000) timeout = 1000;
  uv_timer_start(timer_handle_, AresTimeout, timeout, timeout);
}

優化的邏輯很簡單,保證 timeout 等于 0 和等于 -1 時的邏輯一致即可。通過測試大概 CPU 使用率下降 2% 左右,測試例子如下。

const { Resolver } = require('dns');
const { createSocket } = require('dgram');
const socket = createSocket('udp4');
socket.bind(0, 'localhost', () => {
    const resolver = new Resolver({ timeout: 0, tries: 4 });
    resolver.setServers([`${socket.address().address}:${socket.address().port}`])
    resolver.resolve('nodejs.org', () => {
        socket.close();
    });
});

具體可以參考 PR:https://github.com/nodejs/node/pull/58441。

3. 最大超時時間

Node.js DNS 解析有 timeout 和 tries 兩個參數,timeout 表示對于一個 DNS 服務器,一個 DNS 首次查詢的超時時間,tries 表示超時次數,但是超時間隔是按照一定算法計算的(比如指數退避),而不是固定的??匆粋€例子。

const { Resolver } = require('dns');
const { createSocket } = require('dgram');
const socket = createSocket('udp4');
socket.bind(0, 'localhost', () => {
    const resolver = new Resolver({ timeout: 1000, tries: 3 });
    resolver.setServers([`${socket.address().address}:${socket.address().port}`])
    const start = Date.now();
    resolver.resolve('nodejs.org', () => {
        socket.close();
        console.log(`time: ${Date.now() - start}`);
    });
});

例子中輸入的時間大概為 8s,說明不是等間隔重試的,但是有些時候我們希望可以快點重試,比如服務器宕機時快速感知超時,服務重啟時快速獲取結果等,所以我們希望有一種方式可以控制每次重試時的超時時間,而不是使用 c-ares 的默認算法,這個配置就是 c-ares 的 max timeout 配置,最近提了一個 PR 支持該特性,測試例子如下。

const { Resolver } = require('dns');
const { createSocket } = require('dgram');
const socket = createSocket('udp4');
socket.bind(0, 'localhost', () => {
    const resolver = new Resolver({ timeout: 1000, tries: 3, maxTimeout: 1000 });
    resolver.setServers([`${socket.address().address}:${socket.address().port}`])
    const start = Date.now();
    resolver.resolve('nodejs.org', () => {
        socket.close();
        console.log(`time: ${Date.now() - start}`);
    });
});

上面代碼輸出是 4s 左右,說明每次重試間隔都是 1s。具體可以參考 PR:https://github.com/nodejs/node/pull/58440。

Node.js DNS 模塊是比較穩定的模塊,功能上變化不大,但是仍然有一些小地方可以進行優化,也算是不斷完善 Node.js 的功能。

責任編輯:武曉燕 來源: 編程雜技
相關推薦

2021-09-26 05:06:04

Node.js模塊機制

2020-04-15 15:48:03

Node.jsstream前端

2022-09-04 15:54:10

Node.jsAPI技巧

2019-12-17 11:40:44

Node.js模塊前端

2023-06-30 23:25:46

HTTP模塊內存

2011-12-09 11:16:48

Node.js

2021-09-26 22:22:42

js模塊Node

2015-03-10 10:59:18

Node.js開發指南基礎介紹

2013-11-01 09:34:56

Node.js技術

2023-06-20 19:35:00

Node.js工具

2011-09-08 14:07:28

Node.js

2021-12-25 22:29:57

Node.js 微任務處理事件循環

2012-02-03 09:25:39

Node.js

2020-05-29 15:33:28

Node.js框架JavaScript

2021-01-26 08:07:44

Node.js模塊 Async

2020-08-31 15:00:17

Node.jsrequire前端

2012-10-24 14:56:30

IBMdw

2011-11-10 08:55:00

Node.js

2011-11-01 10:30:36

Node.js

2011-09-08 13:46:14

node.js
點贊
收藏

51CTO技術棧公眾號

国产视频一区二区三区四区| 久久国产色av| 在线免费av播放| 黄网页在线观看| 国产激情91久久精品导航| 97成人超碰免| 天堂а√在线中文在线鲁大师| 2020最新国产精品| 在线日韩av片| 国产自产在线视频| 日本天堂在线观看| 99精品久久只有精品| 国产欧美在线看| 国产一级18片视频| 911精品美国片911久久久| 日韩黄色在线免费观看| 国产999免费视频| 一二三四视频在线中文| 亚洲欧美成人一区二区三区| 欧美日本亚洲| 手机看片1024国产| 国产一区久久久| 国产精品久久久久久一区二区| 日韩av一二三区| 日韩久久综合| 精品亚洲国产成av人片传媒| 先锋资源在线视频| 日韩毛片免费视频一级特黄| 欧美香蕉大胸在线视频观看| 99精品一级欧美片免费播放| 国产在线一二三区| 91视频国产资源| 不卡视频一区二区| 国产美女精品视频国产| 日韩二区三区四区| 欧美在线视频网| 国产精品1000| 亚洲国产专区校园欧美| 免费成人高清视频| 国产91在线播放九色| 国内精品视频在线观看| 亚洲欧美日韩一区二区在线| 波多野结衣先锋影音| y111111国产精品久久久| 欧美一区二区三区不卡| 欧美成人手机在线视频| 国内自拍亚洲| 欧美日本视频在线| 亚洲天堂2018av| 欧美成人毛片| 欧美日韩久久久一区| 性chinese极品按摩| 黄色精品视频| 欧美日本乱大交xxxxx| 777一区二区| 国产精品亚洲综合在线观看| 91精品国产色综合久久ai换脸 | 超碰手机在线观看| 亚洲色图欧美| 欧美二区乱c黑人| 国产一级在线播放| 日韩图片一区| 欧美一级免费看| 潘金莲一级淫片aaaaaa播放| 久久性天堂网| 国产在线久久久| 性生活视频软件| 成人一级片网址| 精品久久久久久中文字幕动漫 | 欧美韩日一区二区三区| 亚洲日本精品国产第一区| 日本中文字幕伦在线观看| 最新日韩在线视频| 99久久免费观看| 松下纱荣子在线观看| 欧美在线不卡一区| 亚洲三级在线观看视频| 99精品国产高清一区二区麻豆| 亚洲第一页中文字幕| 国产色视频一区二区三区qq号| 久久最新网址| 成人97在线观看视频| 日本熟妇一区二区| 日韩成人午夜精品| 91精品国产一区二区三区动漫| 亚洲老妇色熟女老太| 91麻豆蜜桃一区二区三区| 亚洲一区二区三区精品动漫| 暖暖在线中文免费日本| 欧美性开放视频| av中文字幕网址| 欧美偷窥清纯综合图区| 中文字幕欧美日韩在线| 国产亚洲精品码| 首页亚洲欧美制服丝腿| 亚洲aⅴ日韩av电影在线观看| 人妻无码一区二区三区久久99| 国产日韩欧美精品综合| 成人小视频在线观看免费| 精品国产第一福利网站| 欧美一区二区视频免费观看| av网站免费在线播放| 天天做天天爱天天爽综合网| 97超碰色婷婷| 精品国产伦一区二区三| 国产欧美一区二区在线观看| 欧美另类videosbestsex日本| 欧美大电影免费观看| 日韩一区二区在线观看| 国产真实乱人偷精品人妻| 欧美日韩午夜| 成人激情视频在线观看| 日本高清中文字幕二区在线| 一区二区在线观看av| 国产精品亚洲二区在线观看 | 久久精品日产第一区二区三区乱码| 午夜在线播放| 色哟哟国产精品| 俄罗斯黄色录像| 偷偷www综合久久久久久久| 日本高清视频一区| 人妻与黑人一区二区三区| 亚洲日本一区二区三区| 亚洲欧美另类动漫| 日本三级久久| 国内外成人免费激情在线视频网站| 亚洲天堂自拍偷拍| 国产人成一区二区三区影院| 日本a级片免费观看| 国语一区二区三区| 久久6免费高清热精品| 亚洲一区二区色| 欧美极品少妇xxxxⅹ高跟鞋 | 精品香蕉在线观看视频一| 国产小视频在线观看免费| 国产在线一区二区| 亚洲一区综合| 欧美成人家庭影院| 色噜噜国产精品视频一区二区| 国产主播第一页| 国产亚洲精品久| 日韩在线第三页| 国产欧美日韩精品一区二区免费| 欧美一级片免费在线| 人妻中文字幕一区| 五月天国产精品| 亚州av综合色区无码一区| 亚洲大胆av| 精品999在线观看| 国产免费拔擦拔擦8x高清在线人| 精品免费国产一区二区三区四区| 特级片在线观看| 成人免费视频播放| 国产一区二区网| 私拍精品福利视频在线一区| 国产91在线高潮白浆在线观看| 欧美色视频免费| 欧美中文字幕一区二区三区亚洲| 国产特级黄色录像| 麻豆久久久久久久| gogogo免费高清日本写真| 免费观看亚洲天堂| 国内精品小视频| 六十路在线观看| 欧美日韩dvd在线观看| 亚洲伦理一区二区三区| 国产a视频精品免费观看| 日本中文字幕网址| 国产成人精品999在线观看| 国产乱肥老妇国产一区二| 黄色成人在线| 亚洲国产精品热久久| 日本高清不卡码| 国产精品久久久爽爽爽麻豆色哟哟 | 黄色小网站在线观看| 欧美刺激脚交jootjob| 国产污片在线观看| 国产午夜精品在线观看| 热久久久久久久久| 亚洲人成免费| 亚洲精品一区二| eeuss鲁片一区二区三区| 欧美在线免费观看| 国产在线一区二区视频| 亚洲第一区在线观看| 国产无遮挡又黄又爽又色视频| 日韩一区中文字幕| 一本色道综合久久欧美日韩精品| 日本在线不卡视频| 免费网站永久免费观看| 国内黄色精品| 国产日韩欧美精品| 91精品国产66| 亚州国产精品久久久| 日本在线视频观看| 日韩激情在线视频| 国产又大又黄的视频| 精品福利在线看| caoporn91| 久久午夜电影网| 国产黄色一区二区三区| 久久久人人人| 国内少妇毛片视频| 日韩精品中文字幕第1页| 精品国产一区二区三区免费| 日日夜夜亚洲精品| 青草热久免费精品视频| 性xxxfreexxxx性欧美| 亚洲人成啪啪网站| 欧美一级视频免费| 欧美一区二区精品在线| 天堂网视频在线| 亚洲成人av福利| 九九精品视频免费| 国产午夜精品一区二区三区嫩草| 在线观看你懂的视频| 免费精品视频在线| 久久婷婷国产精品| 激情久久久久久| 大桥未久一区二区三区| sdde在线播放一区二区| 久久久久久久久久久久久久久久av | 91视频国产一区| 激情亚洲影院在线观看| 91精品国产99久久久久久| 欧美xxxx视频| 九九精品在线视频| yellow91字幕网在线| 日韩在线视频二区| 波多野结衣一区二区| 亚洲欧美中文日韩在线| 亚洲 欧美 激情 另类| 精品久久久久久久久久久院品网 | 久草手机视频在线观看| 国产欧美精品区一区二区三区| 极品人妻一区二区三区| 成a人片亚洲日本久久| 日本wwwwwww| 粉嫩aⅴ一区二区三区四区| 国产伦精品一区二区三区妓女下载| 久久精品国产一区二区三| mm1313亚洲国产精品无码试看| 先锋影音久久久| 又粗又黑又大的吊av| 影院欧美亚洲| av7777777| 免费在线观看成人av| 91黄色小网站| 丝袜美腿高跟呻吟高潮一区| 国产一级特黄a大片免费| 日本欧美久久久久免费播放网| 久久综合久久色| 毛片基地黄久久久久久天堂| 亚洲黄色小视频在线观看| 蜜臀av性久久久久蜜臀aⅴ| 在线黄色免费看| 国产精品亚洲一区二区三区在线| 欧美一级大片免费看| 不卡电影一区二区三区| 亚洲最大成人网站| 国产精品天天摸av网| 69夜色精品国产69乱| 亚洲一区二区三区影院| 国产成人精品一区二三区| 欧美性生交大片免费| 中文字幕 人妻熟女| 欧美精品久久天天躁| 精品免费久久久| 日韩高清免费在线| 国产成人天天5g影院在线观看| 在线精品国产欧美| yellow91字幕网在线| 久久久久久伊人| 欧美精选视频一区二区| 成人网中文字幕| eeuss国产一区二区三区四区| 久中文字幕一区| 日韩一区三区| 我的公把我弄高潮了视频| 久久最新视频| 日韩高清一二三区| 久久久美女毛片| 毛片aaaaa| 欧美自拍偷拍一区| 成人午夜福利视频| 国产亚洲欧美aaaa| 啦啦啦中文在线观看日本| 欧美在线视频一区二区| 国产精品久久久久久久久久久久久久久 | 国产精品欧美综合在线| 亚洲国产精品成人无久久精品| 91国偷自产一区二区开放时间| 国产黄色av网站| 亚洲日本欧美日韩高观看| 国产在线观看91| 国产成人一区二| gogo人体一区| 中文字幕一区二区三区最新| 亚洲在线成人| 人妻精油按摩bd高清中文字幕| 国产亚洲欧美一级| 国产无码精品在线观看| 欧美日韩在线观看一区二区| 手机看片一区二区三区| 最近的2019中文字幕免费一页| a√中文在线观看| 国产中文字幕91| 国产99亚洲| 岛国大片在线播放| 久久国产精品99精品国产| 天天插天天射天天干| 亚洲理论在线观看| 中日韩av在线| 亚洲女同精品视频| 波多野结衣在线观看| 91久久久久久久久久久久久| 国产精品欧美在线观看| 国产人妻777人伦精品hd| 国产一区二区三区美女| 天堂av网手机版| 在线免费观看日本一区| 天堂а在线中文在线无限看推荐| 美日韩精品免费观看视频| 久久精品黄色| 三区精品视频观看| 美女黄色成人网| 中文文字幕文字幕高清| 亚洲午夜激情av| 国内老熟妇对白hdxxxx| 久久久91精品国产| 伊人国产精品| 一区二区在线不卡| 蜜乳av一区二区| 国产三级短视频| 欧美午夜理伦三级在线观看| 久草视频在线看| 日韩av成人在线观看| 国内成人自拍| 色综合手机在线| 国产欧美日产一区| 精品国产青草久久久久96| 一区二区三区国产视频| 日日夜夜天天综合| 日本免费高清一区| 日本91福利区| 99自拍偷拍视频| 欧美日韩高清在线| 国产在线激情| 99热在线播放| 尤物在线精品| 3d动漫精品啪啪一区二区下载| 第一福利永久视频精品| 看电影就来5566av视频在线播放| 欧美在线观看网址综合| 国内精品视频在线观看| wwwwxxxx日韩| 亚洲欧洲日韩女同| 国产av无码专区亚洲a∨毛片| 欧美极品少妇全裸体| 另类在线视频| 污污视频网站免费观看| 中文字幕人成不卡一区| 精品人妻无码一区二区色欲产成人 | 欧美人与性动交α欧美精品济南到| 成人av影视在线| 国产精品入口66mio| 亚洲精品国产91| 91精品久久久久久久久99蜜臂| 欧美韩日亚洲| 欧美极品日韩| 国内国产精品久久| 久久婷婷一区二区| 亚洲三级免费看| 国产一区二区三区| 国产av国片精品| 国产日韩欧美麻豆| 精品人妻aV中文字幕乱码色欲| 97免费视频在线播放| 欧美人与牛zoz0性行为| 午夜啪啪小视频| 亚洲国产成人tv| av网站在线播放| 俄罗斯精品一区二区三区| 国产农村妇女精品一区二区| 国产精品69久久久久孕妇欧美| 717成人午夜免费福利电影| av人人综合网| 亚洲欧美在线网| av中文字幕一区| 在线免费观看视频网站| 久久免费成人精品视频| 欧美一区二区性| 欧美夫妇交换xxx| 欧美男男青年gay1069videost | 日本福利片在线| 亚洲综合第一页| 日本不卡一二三区黄网| 久久免费视频精品| 精品国产区一区二区三区在线观看| 国产精品男女|