You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by GitBox <gi...@apache.org> on 2019/06/12 09:49:42 UTC

[GitHub] [servicecomb-java-chassis] yhs0092 commented on issue #1238: 容器化的后端服务升级,容器IP变化,导致网关服务短时间内会报大量的No route to host:/旧的IP

yhs0092 commented on issue #1238: 容器化的后端服务升级,容器IP变化,导致网关服务短时间内会报大量的No route to host:/旧的IP
URL: https://github.com/apache/servicecomb-java-chassis/issues/1238#issuecomment-501201765
 
 
   这种升级导致的请求失败问题,直接原因是provider端的旧实例下线消息不能实时通知到consumer端,于是consumer端会继续把请求发到已下线的实例地址上。
   
   从consumer端来看,如果微服务是通过pull模式连接sc的,那么consumer会周期性地从service-center查询provider实例列表。最坏的情况是sc刷新了provider端实例列表后,consumer要等整整一个pull周期的时长才能刷新地址列表。如果consumer通过watch模式连接sc(不是所有的环境都支持这种模式),那么consumer在接到sc推送的通知消息后就会查询一次实例列表,这个速度会快一些,但是仍然不是实时的。
   
   从provider端来看,让sc将旧实例下线的途径有两种。一种是provider实例进程退出时触发ServiceComb-Java-Chassis的[优雅停机](https://docs.servicecomb.io/java-chassis/zh_CN/general-development/shutdown.html)机制,主动去sc注销该实例记录,这个会相对比较及时;另一种是provider进程退出后,由sc通过检测实例连续心跳失败来将实例记录注销(看看[这里的文档](https://docs.servicecomb.io/java-chassis/zh_CN/general-development/visit-sc.html) ,关于`healthCheck.times`配置项的),这个相对会慢很多,默认配置下需要等1.5~2min。
   
   所以要保障微服务升级过程中业务请求不中断,也需要针对这些入手:
   -  首先是确认开启了[负载均衡](https://docs.servicecomb.io/java-chassis/zh_CN/references-handlers/loadbalance.html)模块的请求重试和实例隔离功能。请求重试机制可以在碰到 "No route to host" 错误时将请求重试到下一个provider实例来保障业务调用不失败;实例隔离机制会在检测到某个实例有问题后把它从本地缓存的provider实例列表中暂时剔除出去,减少调用问题实例和重试的次数 : )
   -  其次是确保自己的部署方式在下线旧实例时能触发ServiceComb-Java-Chassis的优雅停机功能,让sc能够更及时地感知到实例下线,让consumer端的本地实例缓存不一致状态持续的时间短一些。
   - 最后,控制好实例下线的速度。我们默认的重试策略是 `tryOnSame=0, tryOnNext=1`,如果你一口气下线了多个实例的话,可能会出现请求调用失败后又重试到了另一个下线的实例上的情况,于是业务调用仍然失败了。具体两个实例的下线时间间隔多少合适需要结合 consumer端从sc查询实例列表的时间间隔、`tryOnNext`配置值、provider实例下线的时延 来决定。
   
   上面三点做好了的话,应该能保障你的业务调用不失败了。当然 "No route to host" 错误日志仍然是难以避免的,但是应该不会太多 ; )

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


With regards,
Apache Git Services