@cryptotax计算器/xios-cached-dns-resolve
这个图书馆是原作的叉子 axios-cached-dns-resolve 软件包,但添加/更改如下:
- 添加类型安全
- 将模块分辨率改为CJS(从无害环境管理)
- 更改测试跑道从
ava改为jest - 添加对 Redis 的支持作为缓存
关于完整的更改清单,见 变化。 。 。 .
Axios 使用 node.js dns. lookup 来解决主机名称. dns. lookup是同步的,在有限的libuv线程池上执行. 每个轴请求将解析 kubernetes 中的 dns 名称, 开班, 以及云环境, 有意将 TTL 设置为低或为 0 以快速动态更新 . Dns 解析器可以被负载所淹没. DNS 分辨率中存在/ 存在一个错误, 它显示为非常长 dns. lookups in node.js.
从库伯内特 文档
Even if apps and libraries did proper re-resolution, the load of every client re-resolving DNS over and over would be difficult to manage.
这个库使用dns.resolve,并且可以在地址中可选择性地缓存分辨率和圆旋. 缓存大小可配置. 如果启用缓存, 背景线程会用 dns.resolve 而不是每个请求来定期刷新分辨率 . 有一种闲置的 TTL 如果一个地址不再使用, 则驱逐背景更新 . 这个自由代理通过OS解析机制,可以提供进一步的缓存.
目标
- Async 请求 - dns 解析 vs 查找
- 快速 - 本地内存缓存搜索
- 新鲜 - 定期(经常)更新
- 恒定 DNS 负载/纬度与随机负载/可变纬度
- 提供统计和回顾
所需资源
节点14+
开始
npm i -S @cryptotaxcalculator/axios-cached-dns-resolve
使用量
import { registerInterceptor } from "@cryptotaxcalculator/axios-cached-dns-resolve";
const axiosClient = axios.create(config);
registerInterceptor(axiosClient);
使用 arxiosclient 为普通
配置
export const config = {
disabled: process.env.AXIOS_DNS_CACHE_DISABLE === "true",
dnsTtlMs: parseInt(process.env.AXIOS_DNS_CACHE_TTL_MS || "5000"), // when to refresh actively used dns entries (5 sec)
cacheGraceExpireMultiplier: parseInt(
process.env.AXIOS_DNS_CACHE_EXPIRE_MULTIPLIER || "2"
), // maximum grace to use entry beyond TTL
dnsIdleTtlMs:
parseInt(process.env.AXIOS_DNS_CACHE_IDLE_TTL_MS || "1000") * 60 * 60, // when to remove entry entirely if not being used (1 hour)
backgroundScanMs: parseInt(
process.env.AXIOS_DNS_CACHE_BACKGROUND_SCAN_MS || "2400"
), // how frequently to scan for expired TTL and refresh (2.4 sec)
dnsCacheSize: parseInt(process.env.AXIOS_DNS_CACHE_SIZE || "100"), // maximum number of entries to keep in cache
// pino logging options
logging: {
name: "axios-cache-dns-resolve",
// enabled: true,
level: process.env.AXIOS_DNS_CACHE_LOG_LEVEL || "info", // default 'info' others trace, debug, info, warn, error, and fatal
// timestamp: true,
prettyPrint: process.env.NODE_ENV === "DEBUG" || false,
formatters: {
level: (label: string) => {
return { level: label };
},
},
},
redisConfig:
process.env.AXIOS_DNS_CACHE_USE_REDIS === "true"
? {
url: process.env.AXIOS_DNS_CACHE_REDIS_URL || "localhost:6379",
password: process.env.AXIOS_DNS_CACHE_REDIS_PASSWORD,
ttl: parseInt(process.env.AXIOS_DNS_CACHE_REDIS_TTL || "5"), // default 5 seconds
}
: undefined,
cache: undefined as LRUCache<string, DnsEntry> | undefined,
} as Config;
config.lruCacheConfig = {
max: config.dnsCacheSize,
ttl: config.dnsTtlMs * config.cacheGraceExpireMultiplier, // grace for refresh
} as LRUCacheConfig;
统计
可通过下列渠道获得统计数据:
getStats()
{
"dnsEntries": 4,
"refreshed": 375679,
"hits": 128689,
"misses": 393,
"idleExpired": 279,
"errors": 0,
"lastError": 0,
"lastErrorTs": 0
}
AND
getDnsCacheEntries()
[
{
"host": "foo-service.domain.com",
"ips": [
"51.210.235.165",
"181.73.135.40"
],
"nextIdx": 1,
"lastUsedTs": 1604151366910,
"updatedTs": 1604152691039
},
...
]
特快统计
import {
getStats,
getDnsCacheEntries,
} from "@cryptotaxcalculator/axios-cached-dns-resolve";
router.get("/axios-dns-cache-statistics", getAxiosDnsCacheStatistics);
function getAxiosDnsCacheStatistics(req, resp) {
resp.json(getStats());
}
router.get("/axios-dns-cache-entries", getAxiosDnsCacheEntries);
function getAxiosDnsCacheEntries(req, resp) {
resp.json(getDnsCacheEntries());
}