记服务启停时大量交易超时的问题

184 阅读1分钟

前言

起因

服务发版时启停阶段有大量交易超时,超时时间为1s

原因

  • 停服务时,springboot 管理的nacos下线时机非常靠后。具体原因见nacos源码浅析
  • 停服务时,在服务终止前一刻,定时调度触发加载mysql信息,导致连接中断
  • 停服务时,线程池部分交易没有处理完,上游socket time out
  • 起服务时,服务未启动时就注册了nacos,启动后才订阅nacos,蜜汁操作
  • 起服务时,大量交易瞬间涌入,线程池创建线程耗时,ribbon初始化连接耗时,kafka创建实例耗时(不是线程安全的)

解决

  • 停服务时,自定义实现优先下线nacos;所有线程池统一管理,监听线程池状态;监听tomcat连接状态,直到没有未处理的消息,并没有新请求进来
  • 起服务时,加载缓存,将所有缓存数据优化为hashmap,时间复杂度降低到O(1); 线程池预热; ribbon开启饥饿模式;自定义实现nacos延迟注册(不支持);灰度发布(未实现);测试用例预热http连接池(未实现);