同步操作将从 搜狗开源/workflow 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
DNS(域名服务协议)是一种分布式网络目录服务,主要用于域名与IP地址的相互转换。
在进行通信访问的时候,需要对非IP的域名进行DNS解析,这个过程就是域名到IP地址的转换过程。
DNS解析是一个比较大的消耗,不管是服务器还是本地操作系统,通常都会有自己的DNS Cache负责减少不必要的请求。
有一些程序也会在自己的进程内设计自己的DNS Cache,包括常见流行的浏览器、通信框架等。
workflow也设计了自己的DNS Cache,为了方便用户使用,DNS这部分功能被框架完全接管“隐藏”了起来。
全称是“生存时间(Time To Live)”,简单的说TTL表示DNS记录在DNS Cache上缓存的时间。
通过调用系统函数getaddrinfo获取结果,一些细节:
框架实现了完备的DNS协议解析,当前版本需要用户手动指定resolv_conf_path
来启用此功能。在常见的Linux发行版上,resolv_conf_path
一般是/etc/resolv.conf
,hosts_path
一般是/etc/hosts
。将上述参数置空,则会使用同步请求方案。
在WFGlobal.h文件里,可以看到我们一个全局配置信息:
struct WFGlobalSettings
{
EndpointParams endpoint_params;
unsigned int dns_ttl_default;
unsigned int dns_ttl_min;
int dns_threads;
int poller_threads;
int handler_threads;
int compute_threads;
const char *resolv_conf_path;
const char *hosts_path;
};
static constexpr struct WFGlobalSettings GLOBAL_SETTING_DEFAULT =
{
.endpoint_params = ENDPOINT_PARAMS_DEFAULT,
.dns_ttl_default = 12 * 3600, /* in seconds */
.dns_ttl_min = 180, /* reacquire when communication error */
.dns_threads = 4,
.poller_threads = 4,
.handler_threads = 20,
.compute_threads = -1,
.resolv_conf_path = "/etc/resolv.conf",
.hosts_path = "/etc/hosts",
};
//compute_threads<=0 means auto-set by system cpu number
其中,与DNS相关的配置包括:
简单来讲,每次通信都会检查TTL来决定要不要重新进行DNS解析。
默认检查dns_ttl_default,通信失败重试时才会去检查dns_ttl_min。
全局的DNS配置,可以通过upstream功能,被单独的地址配置覆盖。
Upstream每一个AddressParams也有dns_ttl_default和dns_ttl_min配置项,使用方式与Global相仿。
具体结构详见upstream文档。
我们的主分支代码(不包括windows分支)支持通过SSL连接访问DNS服务器,即DoT。
我们简单的扩展了resolv.conf的格式,你可以通过以下方式加入一个SSL dns server:
nameserver dnss://8.8.8.8/
我们用dnss:// 来表示一个SSL dns server地址。通过以上的配置,我们所有的DNS请求都将通过SSL连接与全球DNS server 8.8.8.8通信。
全球DNS server完美支持SSL连接,大家可以立刻试用一下这个功能。
为了不用修改系统的resolv.conf文件,你可能需要创建一个私有的resolv.conf,并修改workflow配置:
#include <workflow/WFGlobal.h>
#include <workflow/WFTaskFactory.h>
int main()
{
struct WFGlobalSettings settings = GLOBAL_SETTINGS_DEFAULT;
settings.resolv_conf_path = "./myresolv.conf";
WORKFLOW_library_init(&settings);
WFHttpTask *task = WFTaskFactory::create_http_task("https://www.example.com", ...);
...
}
如果TTL过期瞬间,对这个域名正在发生大量的并发请求,可能会面临同一时刻对同一个域名进行大量DNS解析。
框架通过自洽逻辑,合理规避/降低这种可能的发生:
框架目前仍然有两种场景会面临同一时刻对同一个域名进行大量DNS解析:
框架认为这两种场景是可以接受的,更确切的说这种场景下的大量DNS请求是完全合理且逻辑严密的。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。