规划网站的总结,大型门户网站建设效果怎么样,石家庄手机网站制作多少钱,广告做网站一、问题描述 若 Apache HttpClient 未设置 timeToLive#xff0c;通过服务域名访问服务的实例并且服务域名解析出的 IP 发生变化时#xff0c;在短时间内会有部分请求出现连接异常错误。 二、问题分析 Apache HttpClient 通过服务域名从连接池获取连接#xff0c;当连接…一、问题描述 若 Apache HttpClient 未设置 timeToLive通过服务域名访问服务的实例并且服务域名解析出的 IP 发生变化时在短时间内会有部分请求出现连接异常错误。 二、问题分析 Apache HttpClient 通过服务域名从连接池获取连接当连接池没有连接可用时会使用服务域名当前解析出的IP生成连接放入这个连接池。 正常情况下Apache HttpClient 通过服务域名从连接池获取连接此时获取到的连接的 IP 与服务域名当前解析的 IP 相同HTTP请求正常。 当做单边切换时一般会先将服务域名切换到新 IP 上被调服务旧 IP 的实例会一般做优雅停机处理。但由于 Apache HttpClient 还是通过服务域名从连接池获取连接此时获取到的连接仍然连的是服务旧 IP 的实例一旦服务旧 IP 的实例下线会导致部分 Apache HttpClient 发起的请求出现连接异常然后 Apache HttpClient 会将这个异常连接销毁。当Apache HttpClient 随后发起请求时由于从连接池中获取不到连接会使用服务域名当前解析的 新IP 生成新的连接并放入连接池中此时 HTTP 请求将恢复正常。 三、举例说明 正常情况下服务域名解析采用就近路由方式AZ1 下的服务 A 的实例使用 IP-1 访问 AZ1 下的服务 B 的实例AZ2 下的服务 A 的实例使用 IP-2 访问 AZ2 下的服务 B 的实例。 当服务 B 在 AZ2 中的实例停单边后AZ2 下的服务 A 的实例应使用 IP-1 访问 AZ1 下的服务 B 的实例但 由于未设置 timeToLive 并且 A2 连接池中的连接仍然是以前的旧连接当 LB2 停止时这些连接会报连接异 常错误如果此时有在途的交易这些交易的就成了“结果未知的交易”。 四、解决方案 Apache HttpClient 设置 timeToLive并设置 timeToLive 服务优雅停机时间 当服务域名切换到新 IP 后由于连接池中使用旧 IP 生成的连接会在服务旧 IP 的实例下线前销毁所以在做单边切换时不会在短时间内出现连接异常错误。 五、问题总结 1、通过此案例发现优雅停机需要调用方和被调方都要实现一定的功能才能保证只其中一方提供优雅停机功能并不能保证在停机过程中不出现“结果未知的交易”。 2、JDK 提供域名缓存功能缓存时长默认为 60stimeToLive 应小于域名缓存时长保证缓存更新前旧的连接能及时销毁总之timeToLive 应满足如下条件 timeToLive min(服务优雅停机时间, 域名缓存时长)