这几天折腾了一下~ , 把这个服务程序搭了出来, 总结来说结构上十分简单, 线程池, 搭配getaddrinfo就可以了, 不过一涉及到队列就会有容量限制, 现在来看满足自己的需求是足够了, 不过毕竟getaddrinfo也是阻塞接口, 开了32个线程每个线程1M的队列也总会出现队列满的情况, 仔细想了想, 要么告知客户程序服务繁忙稍后再试, 要么在网络层面上就要予以阻塞, 不过这回导致客户端程序的buff填充满一样会导致客户程序阻塞 ...
总结来说, 这个服务还需要解决以下问题:
1. 全局的缓存层. 因为不同客户机器内的缓存可能并没有缓存别人已经解析过的IP, 那么会重复的请求DNS去解析相同的域名, 导致不必要的处理延时. 所以有必要在该服务内部增加一个有限的缓存, 可以采用LRU进行保留最常用的域名解析结果.
2. 使用getaddrinfo_a代替getaddrinfo. 这个接口可以一定程度上缓解由于阻塞的API导致的队列问题, 不过线程池就不必要了, 可以开多个服务进程, 客户机器配置一个端口范围进行请求, 不过这样的话需要更强的容错处理, 更换请求机制, 一个好的分布式程序需要容忍任何一个进程随时挂掉和重启.
:)