精品欧美一区二区三区在线观看 _久久久久国色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| 国产福利一区二区精品秒拍| 色久综合一二码| 欧美日韩dvd| 国产福利片在线| 国产.欧美.日韩| 久久久精品久久久久| 精品一区二区三区四区五区六区| 主播大秀视频在线观看一区二区| 一区二区成人在线| 亚洲一区三区电影在线观看| 波多野结衣一区二区三区在线| 五月久久久综合一区二区小说| 欧美视频中文字幕| 欧美日韩成人免费视频| 黄色片免费在线观看| 久久久亚洲精品一区二区三区| 亚洲影院高清在线| 中文字幕资源网| 亚洲在线电影| 欧美激情视频网| 国产福利视频网站| 色综合五月天| 尤物99国产成人精品视频| 日韩aaaaa| 国产成人澳门| 欧美xfplay| 麻豆精品国产传媒| gogo久久| 一区二区三区91| 最新av在线免费观看| gogogo高清在线观看免费完整版| 91热门视频在线观看| 国产乱码精品一区二区三区卡| 日本在线观看视频网站| 欧美久久99| 欧美成年人视频网站欧美| 亚洲少妇一区二区| 国产区一区二| 91精品国产欧美日韩| 日韩在线一区视频| 不卡一区视频| 欧美一区午夜精品| 欧美人与性动交α欧美精品| 亚洲国产aⅴ精品一区二区三区| 在线观看三级视频欧美| 妺妺窝人体色www在线观看| 朝桐光一区二区| 欧美色图天堂网| avav在线播放| 男人添女人下部高潮视频在线观看| 亚洲精品一卡二卡| 妞干网在线播放| аⅴ资源天堂资源库在线| 午夜精品在线看| 日本毛片在线免费观看| 看黄网站在线| 亚洲欧美国产77777| www.日本三级| 日本不卡1234视频| 欧美性猛交xxxx黑人猛交| 精品久久久久久久无码| 欧美天堂一区| 日韩精品中文字幕一区| 中国免费黄色片| 国产精品视频一区二区三区四蜜臂| 国产一区二区三区久久精品| 婷婷社区五月天| 欧美三区不卡| 日韩av电影手机在线| 在线观看国产小视频| 99热精品在线观看| 国产精品69av| 99视频在线观看免费| av电影在线观看一区| 91久久精品国产91性色| 国产成人麻豆精品午夜在线| a美女胸又www黄视频久久| 蜜桃久久影院| 亚洲国产精品视频在线| 99国产精品国产精品久久| 91午夜理伦私人影院| 女人18毛片一区二区三区| 国产午夜亚洲精品不卡| 亚洲AV无码成人精品一区| 精品极品在线| 在线成人小视频| 国产精品jizz| 欧美一区二区| 国产成人精品在线视频| 国产成人精品一区二区无码呦| 91麻豆蜜桃一区二区三区| 亚洲日本精品| 松下纱荣子在线观看| 91精品在线一区二区| 风间由美一二三区av片| 一本一道久久综合狠狠老| 欧美在线xxx| 国产成人精品白浆久久69| 国产亚洲精品中文字幕| 日本熟妇人妻xxxx| 久久不卡日韩美女| 亚洲欧美制服第一页| 大地资源二中文在线影视观看| 欧美色婷婷久久99精品红桃| 久久久欧美一区二区| 一级片视频播放| 久久久久国产一区二区三区四区| www.亚洲成人网| 久久三级毛片| 亚洲一区第一页| 欧美三级韩国三级日本三斤在线观看| 国产一区二区成人久久免费影院 | 亚洲 欧美 日韩 国产综合 在线| 国产91欧美| 亚洲欧洲自拍偷拍| 免费看日韩毛片| 国产91丝袜在线观看| 一级一片免费播放| 国产精品黄色片| 亚洲欧美激情一区| 久久青青草视频| 99久久精品国产毛片| 国产免费一区二区视频| 91综合精品国产丝袜长腿久久| 久久精品99久久香蕉国产色戒| 久久久久久亚洲av无码专区| 久久久久久影视| 成年人在线看片| 精品福利久久久| 中文字幕日韩免费视频| 国产精品视频一区在线观看| 91亚洲精华国产精华精华液| 免费看又黄又无码的网站| 最新精品在线| 欧美精品福利在线| 黄色片一区二区三区| 亚洲国产精品久久久久秋霞影院| 97在线播放视频| 一区二区三区日本视频| 日日骚久久av| 一级特黄aaa大片| 国产欧美一区二区在线观看| 91香蕉视频污版| 久久一区二区三区电影| 国产日韩欧美在线播放| 免费观看成人高潮| 欧美丰满少妇xxxxx高潮对白| 波兰性xxxxx极品hd| 亚洲美女黄网| 精品久久久久久综合日本| 在线观看特色大片免费视频| 亚洲人午夜精品| 国产精品露脸视频| 亚洲品质自拍视频| 稀缺小u女呦精品呦| 国产亚洲一区在线| 亚洲ai欧洲av| 国产精品成人3p一区二区三区| 久久99久久99精品中文字幕| 欧美一级片免费| 色综合天天视频在线观看| 18啪啪污污免费网站| 国产成人av网站| 久久网站免费视频| 日韩欧美综合| 国产精品乱码| 99精品国自产在线| 欧美人与性动交| 国产精品一区二区婷婷| 欧美一区二区三区免费大片 | 中文成人无字幕乱码精品区| 欧美顶级大胆免费视频| 97久草视频| 六月婷婷综合| 欧美裸体xxxx极品少妇| 免费一级在线观看| 91精品国产高清一区二区三区蜜臀| 国产网址在线观看| 中文字幕国产一区二区| 久久久久亚洲av成人网人人软件| 久久美女性网| 日本一级黄视频| 久久99视频| 日本韩国欧美精品大片卡二| 久久77777| 亚洲片在线观看| 亚洲爱情岛论坛永久| 欧美在线观看一区| 免费在线不卡视频| 亚洲人成精品久久久久| 色一情一交一乱一区二区三区| 国产一区二区三区四| 欧美两根一起进3p做受视频| 中文在线日韩| 亚洲综合五月天| 欧美激情在线精品一区二区三区| 51国偷自产一区二区三区的来源| av高清一区| 欧美有码在线视频| 成人性生交大片免费看网站 | 婷婷色中文字幕| 国产片一区二区| 中文在线一区二区三区| 国产福利精品导航| 污视频网站观看| 日韩在线一区二区三区| 久激情内射婷内射蜜桃| 欧美日本国产| 中文字幕一区二区三区精彩视频 | 日韩精品成人免费观看视频| 亚洲国产裸拍裸体视频在线观看乱了| 国产探花在线视频| 国产精品视频九色porn| 双性尿奴穿贞c带憋尿| 成人精品gif动图一区| 无人码人妻一区二区三区免费| 蜜臀a∨国产成人精品| 农村妇女精品一二区| 国产一区二区三区久久| 精品无码一区二区三区爱欲| 亚洲欧美综合| 无码人妻aⅴ一区二区三区日本| 91精品在线免费视频| 国产精品久久久久影院日本 | 色噜噜久久综合| 青青草免费观看视频| 黑人巨大精品欧美一区二区一视频| 麻豆一区产品精品蜜桃的特点 | 在线日韩一区二区| 少妇高潮av久久久久久| 欧美日韩中文字幕在线| 在线能看的av| 欧美性xxxx18| av一级在线观看| 欧美午夜电影在线播放| 亚洲精品国产精品乱码视色| 欧美色图在线观看| 国产精品久久久国产盗摄| 4hu四虎永久在线影院成人| 国产免费一区二区三区最新不卡 | 色操视频在线| 久久久久久久久久久网站| 国产网红在线观看| 97超级碰在线看视频免费在线看 | 欧美日韩国产亚洲一区| www污在线观看| 亚洲欧美日本日韩| 欧美一级裸体视频| 精品一区二区在线播放| 国产调教打屁股xxxx网站| 99久久免费精品| a级片在线观看| 最新中文字幕一区二区三区| 精品99久久久久成人网站免费| 亚洲国产一区二区三区青草影视| 日韩特黄一级片| 日本高清不卡视频| 国产精品嫩草影院桃色| 亚洲第一免费播放区| 飘雪影视在线观看免费观看| 色噜噜亚洲精品中文字幕| 亚洲淫性视频| 欧美性做爰毛片| 久久久国产精品网站| 国产成人精品一区二区三区福利| 一个色免费成人影院| 在线观看成人av| 亚洲青色在线| 男女视频在线看| 成人午夜大片免费观看| 成人综合久久网| 免费视频久久| 国产性生活一级片| 99re成人在线| 小泽玛利亚一区二区免费| 亚洲成人精品一区| 亚洲天堂视频在线| 亚洲国产精品字幕| 日韩欧美小视频| 91精品国产高清自在线| 亚洲狼人综合| 久久综合九色综合久99| 亚洲理论电影网| 国产精品免费观看久久| 国产一区二区不卡在线| www.色天使| 一卡二卡欧美日韩| 中文字幕+乱码+中文乱码91| 精品国产91乱码一区二区三区| av网站在线免费观看| 97在线看免费观看视频在线观看| 精品久久99| 欧美不卡在线一区二区三区| 午夜日韩电影| 在线观看免费不卡av| 91麻豆国产香蕉久久精品| 丁香花五月激情| 欧美日韩一区二区在线视频| 五月天婷婷激情网| 欧美日本高清一区| 亚洲福利影视| 日本一区视频在线| 伊人久久大香线蕉综合热线| 91国内在线播放| 日本一二三不卡| 日本一区二区三区精品| 亚洲黄色在线看| 青春草在线视频| 亚洲va久久久噜噜噜| 日韩精品午夜| 日本va中文字幕| 久久久精品日韩欧美| 亚州国产精品视频| 亚洲成人av片| 成人超碰在线| www 成人av com| 欧美淫片网站| 99久久综合网| 亚洲美女视频在线观看| 91精品国产综合久| 色老头一区二区三区在线观看| 成人日韩在线| 色一情一乱一伦一区二区三区| 久久久精品网| 国产欧美激情视频| 国产女人18水真多18精品一级做| 99超碰在线观看| 日韩精品在线免费| 黄色18在线观看| 久久综合婷婷综合| 久久xxxx精品视频| 中文字幕第4页| 在线一区二区视频| аⅴ资源新版在线天堂| 国产精品你懂得| 99国内精品久久久久久久| 拔插拔插华人永久免费| 亚洲特黄一级片| www.日韩在线观看| 亚洲乱码国产乱码精品精天堂| 国产不卡人人| 玖玖玖精品中文字幕| 日韩精品一二三| 久久久久人妻一区精品色| 5月丁香婷婷综合| 日韩影视在线| 蜜桃91精品入口| 男男视频亚洲欧美| 亚洲成人生活片| 亚洲激情第一页| 校园春色亚洲色图| 中文字幕欧美日韩一区二区三区| 国产精品一级在线| 日韩免费黄色片| 亚洲性xxxx| 国产亚洲观看| 国产综合av在线| 日本一区二区不卡视频| 精品国产亚洲一区二区麻豆| 国内精品中文字幕| 国产一区二区亚洲| 欧美性受xxxx黒人xyx性爽| 亚洲成人免费av| 国产无套粉嫩白浆在线2022年 | 中文字幕a在线观看| 91在线看国产| 久久这里只有精品9| 久久精品视频中文字幕| 白嫩白嫩国产精品| 久久精品一区二| 自拍偷拍亚洲激情| 五月婷婷六月色| 国产三级精品网站| 亚洲免费播放| 久久久久久久久久97| 日韩成人av网址| 午夜不卡一区| 日韩在线视频在线观看| 亚洲欧洲成人精品av97| 天堂中文在线看| 国产综合在线观看视频| 在线日韩av| 国产男女猛烈无遮挡在线喷水| 国产午夜精品久久久| 欧美成人精品午夜一区二区| 日韩欧美在线免费观看视频| 亚洲资源中文字幕| 最新av网站在线观看|