首页 > 解决方案 > NodeJS 的“https”库是否支持 DNS 故障转移?

问题描述

假设我正在向 DNS 记录包含多个 IP 地址的主机发出 HTTP GET 请求,例如twitter.com

twitter.com.        45  IN  A   104.244.42.1
twitter.com.        45  IN  A   104.244.42.65

让我们假设由于某些原因(例如传出连接在防火墙上被阻止),此 IP 地址之一不可用。

https.get()是从 DNS 查询结果中尝试所有这些 IP 地址还是只尝试其中一个?

var https = require('https');

https.get('https://www.twitter.com', function(res) { ... }

我已经执行了一个阻止这些地址之一的示例测试,当第一个尝试的 IP 地址不可用时,它似乎不会对另一个 IP 地址执行重试。但由于缺乏调试日志,我不是 100% 有信心。有人可以根据库的源代码或官方文档来确认或反驳这个假设吗?


]$ dig twitter.com

...

;; ANSWER SECTION:
twitter.com.        60  IN  A   104.244.42.1
twitter.com.        60  IN  A   104.244.42.193

104.244.42.193在防火墙中被阻止

]$ node failovertest.js 
Error: connect ETIMEDOUT 104.244.42.193:443
    at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1137:16) {
  errno: -110,
  code: 'ETIMEDOUT',
  syscall: 'connect',
  address: '104.244.42.193',
  port: 443
}

标签: node.jshttpsdns

解决方案


推荐阅读