成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Xxl-Job執行器自動注冊是怎么做的?

開發 前端
相信使用過 xxl-job 的眾多開發同學里,有很多人新增執行器時都是跟我們一樣選擇自動注冊。這個操作在容器化部署來臨之前沒什么問題,但是隨著后來 docker 容器的流行,線上服務大多以容器方式放行。

一、xxl-job 執行器自動注冊 ip 錯誤

先說一下問題發生的場景,這個問題來自我們測試 xxl-job 后管新增一個執行器時,新增執行器時選擇的是自動注冊機制,也就是由 xxl-job 自動填寫我們的執行器 ip 地址。

相信使用過 xxl-job 的眾多開發同學里,有很多人新增執行器時都是跟我們一樣選擇自動注冊。這個操作在容器化部署來臨之前沒什么問題,但是隨著后來 docker 容器的流行,線上服務大多以容器方式放行。

容器的 ip 都是虛擬 ip,不代表物理機真實通信地址的 ip,這里就有一個問題,如果 xxl-job 后管跟執行器不在同一個服務器部署,并且執行器自動注冊提交的是容器 ip,那么就會產生定時任務執行失敗的問題,因為 xxl-job 后管調用不通執行器。

這里給大家畫一個 xxl-job 調用執行器的示意圖,方便大家理解,

調用流程調用流程

給大家講一下示意圖:

1.xxl-job 執行器在啟動時會向 xxl-job 后管提交當前服務器 ip,獲取邏輯在 com.xxl.job.core.util.IpUtil#getIp 方法中,這個方法在最新版本里默認優先使用 JDK 提供的 InetAddress.getLocalHost() 方法獲取本機 ip。獲取不到的話再使用 JDK 提供的 NetworkInterface.getNetworkInterfaces() 方法遍歷本機網卡獲取 ip。

InetAddress.getLocalHost() 的一些坑:

  • 在 Linux 環境通過獲取 /etc/hosts 和 /etc/resolv.conf 文件內容,如果在 /etc/hosts 文件內容中沒有匹配到對應的 ip 地址,則通過 /etc/resolv.conf 中配置的 DNS 地址,向 DNS 服務器發出域名解析請求;
  • 如果訪問 DNS 服務存在性能問題;
  • InetAddress.getLocalHost() 實現中還加了 synchronized 鎖,并發環境中會影響性能。

2.調用 xxl-job 后管提供的 api/registry 接口,傳遞 xxl-job 執行器名稱以及通信地址。

3.xxl-job 后管觸發定時任務時,會調用 xxl-job 執行器提供的 /run 接口來執行對應任務。

在上面流程中,因為第二步提交的 xxl-job 執行器通信地址錯誤,因而導致第三步執行失敗。那么怎么解決這個問題嘞,其實很簡單,xxl-job 后管使用手動注冊填寫可以聯通的執行器地址即可。

二、xxl-job執行器自動注冊流程

xxl-job 執行器的自動注冊流程其實很簡單,這里給大家梳理一下,

自動注冊、移除流程自動注冊、移除流程

三、執行器注冊

客戶端在引入 xxl-job 執行器啟動時,xxl-job 執行器會啟動 ExecutorRegistryThread 線程,

圖片圖片

這個線程是專門來做執行器注冊的,它會每隔 30 秒調用 xxl-job 后管的 /api/register 接口提交執行器地址和名稱。

xxl-job 后管收到執行器的注冊信息后,會通過 registryOrRemoveThreadPool 線程池異步保存執行器信息并發送成功響應。

圖片圖片

registryOrRemoveThreadPool 線程池會判斷是否已經存在當前執行器注冊記錄,不存在就新建,存在就更新執行器最新注冊時間。

所以當我們在 xxl-job 后管新增執行器,選擇自動注冊的時候,執行器的地址就是這么來的。

四、執行器移除

移除有兩個方式,一種是正常結束 xxl-job 執行器,比如停止應用程序,xxl-job 執行器就會調用 /api/registryRemove 接口用來移除當前執行器注冊信息。還有一種 xxl-job 后管啟動的 registryMonitorThread 線程自動檢測注冊時間已經超期的執行器注冊信息。

圖片圖片

registryMonitorThread 線程會查詢所有自動注冊類型的執行器,然后查詢它們對應的注冊記錄最新時間是否超期,在xxl-job中,這個超期時間是90秒。超過 90 秒后就會移除執行器。

移除時會同時刪除 xxl_job_group、xxl_job_registry 表的執行器信息。

四、最后關于IpUtil.getIp() 的一點思考

其實查看 xxl-job 執行器獲取執行器 ip 的 com.xxl.job.core.util.IpUtil 文件的提交歷史,我們可以發現,早在 18 年就有人發現了這個問題,并向官方提交了 issue 和 pr,并且這個 pr 也被官方認可合并了。

圖片圖片

然而官方在 2020 的提交記錄中又修改了 com.xxl.job.core.util.IpUtil.getIp 方法,

圖片圖片

把本來放到方法末尾的 InetAddress.getLocalHost() 方法又提到了方法開頭。。。


看了提交歷史和上面關于InetAddress.getLocalHost() 一些坑的朋友,此處應該一臉疑問。。。

這里就暫且當作者基于某種考慮這么做,至于為什么,我已經去 github 提交了 issue,幫大家問了。。。

圖片圖片

責任編輯:武曉燕 來源: 程序員wayn
相關推薦

2023-11-07 07:56:40

2020-07-17 09:33:39

CPU內存調度

2022-03-26 17:13:22

ElasticJobxxl-job分布式

2022-09-23 13:57:11

xxl-job任務調度中間件

2025-02-18 14:08:14

2025-05-26 09:31:23

2024-11-06 18:01:15

分布式任務調度組件

2024-08-27 09:34:24

2023-01-04 09:23:58

2023-11-30 22:06:43

2024-09-09 08:11:12

2021-12-26 19:07:51

MySQL存儲容器

2024-07-31 08:18:40

2012-05-24 14:58:55

開源代碼

2022-12-29 08:32:50

xxl-job緩存Schedule

2023-06-27 07:44:53

xxl-job分布式任務調度平臺

2021-12-26 00:03:27

響應式編程異步

2022-01-27 08:44:58

調度系統開源

2017-07-20 13:11:46

Code ReviewPR評審

2011-03-11 09:53:46

FacebookMySQL
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美一区二区三区视频在线 | 在线观看免费黄色片 | 国产精品无码专区在线观看 | 成人国产精品久久久 | 操射视频 | 超级黄色一级片 | 国产精品1 | 亚洲精品日韩精品 | 亚洲小视频在线观看 | 国产亚洲一区二区精品 | 久久中文字幕av | 国产精品a久久久久 | 欧美黑人又粗大 | 精品一区二区在线观看 | 天天干天天爱天天 | 国产精品久久久久久久7电影 | 福利片在线观看 | 国产精品久久久久久婷婷天堂 | 99re在线视频 | av一区二区三区四区 | 成人免费在线小视频 | 天天干夜夜操 | 亚洲精品一区二三区不卡 | 欧美日韩国产精品一区二区 | 欧美日韩中文字幕在线 | 国产精品久久av | 久久久久久看片 | 精品乱码一区二区 | 国产精品黄视频 | 日本高清视频在线播放 | 2020天天操 | 精品视频一区二区 | 在线小视频 | 成人在线小视频 | 国产线视频精品免费观看视频 | 亚洲一区二区在线播放 | 国产视频一区二区 | 久久视频精品 | 天天干天天插天天 | 欧美精品一区二区三区在线 | 色资源在线视频 |