执行器下线时的destroy逻辑

step 1. onDestroy

1.png

step 2. stopExecutorServer

先销毁了web容器,销毁后无法接受调度,然后再从注册表中下线,没有主动先下线

2.png

3.png4.png

5.png6.png

toStop方法置toStop=true,终止心跳线程循环,走下面registry remove的逻辑从注册表(trigger_registry)中删除下线

7.png

此时通过rpc远程调用每个gts-admin执行registryRemove方法,registryRemove方法中仅仅删除了registry表中的执行器地址

8.png

但是admin服务触发任务时读的执行器地址是从job_group表中取的执行器:

9.png

10.png

11.png

这里addressList都是通过自动注册拿到的,自动注册通过admin侧的心跳监听线程更新registry表到group表中

12.png

也就是说,执行器上下线后即使已经注册到了registry表中,也需要等待下一轮心跳才能同步到group表中,而admin的调度查的是group表,造成无法立即更新上下线信息

问题总结

  1. 优雅停机注册表下线顺序问题
  2. trigger_group表缓存问题

优雅关闭时服务网格RPC调用问题

知道上面两个问题后,只要修复两点就可以。

  1. 调整优雅下线顺序,先从注册表下线再停止服务
  2. 下线时主动删掉group表里缓存的当前执行器地址

但是修复后QA发了一版发现还是不能优雅下线,每次都得等心跳几十秒之后被动更新缓存,查看下线日志后发现异常:

2021-07-08T16:50:23+08:00 java.lang.RuntimeException: Client-error:Connect to gts:80 [gts/172.21.117.106] failed: Connection refused (Connection refused)
2021-07-08T16:50:23+08:00 2021-07-08 16:50:22.824 [Thread-14] INFO c.enmonster.job.core.thread.ExecutorRegistryThread - >>>>>>>>>>> xxl-job registry-remove error, registryParam:RegistryParam{registGroup='EXECUTOR', registryKey='gts-mq-job-executor', registryValue='172.20.128.17:8202'}
2021-07-08T16:50:23+08:00 ... 18 common frames omitted

这里是因为执行器优雅关闭的逻辑需要发起RPC调用,通知调度器从注册表和缓存中下掉自己,此时网络调用走了网格的sidecar,而优雅关闭时istio-proxy容器关的快已经挂了,导致执行器发送的下线请求RPC调用无法被调度器接收处理

此时观察调度器日志可以看到Apollo和MQ也报了类似的 netty connection refused

解决方案:

暂时QA环境GTE先关掉服务网格恢复正常

标签: 分布式, 调度, 定时任务, xxljob

添加新评论