偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Xxl-Job執(zhí)行器自動(dòng)注冊(cè)是怎么做的?

開(kāi)發(fā) 前端
相信使用過(guò) xxl-job 的眾多開(kāi)發(fā)同學(xué)里,有很多人新增執(zhí)行器時(shí)都是跟我們一樣選擇自動(dòng)注冊(cè)。這個(gè)操作在容器化部署來(lái)臨之前沒(méi)什么問(wèn)題,但是隨著后來(lái) docker 容器的流行,線上服務(wù)大多以容器方式放行。

一、xxl-job 執(zhí)行器自動(dòng)注冊(cè) ip 錯(cuò)誤

先說(shuō)一下問(wèn)題發(fā)生的場(chǎng)景,這個(gè)問(wèn)題來(lái)自我們測(cè)試 xxl-job 后管新增一個(gè)執(zhí)行器時(shí),新增執(zhí)行器時(shí)選擇的是自動(dòng)注冊(cè)機(jī)制,也就是由 xxl-job 自動(dòng)填寫(xiě)我們的執(zhí)行器 ip 地址。

相信使用過(guò) xxl-job 的眾多開(kāi)發(fā)同學(xué)里,有很多人新增執(zhí)行器時(shí)都是跟我們一樣選擇自動(dòng)注冊(cè)。這個(gè)操作在容器化部署來(lái)臨之前沒(méi)什么問(wèn)題,但是隨著后來(lái) docker 容器的流行,線上服務(wù)大多以容器方式放行。

容器的 ip 都是虛擬 ip,不代表物理機(jī)真實(shí)通信地址的 ip,這里就有一個(gè)問(wèn)題,如果 xxl-job 后管跟執(zhí)行器不在同一個(gè)服務(wù)器部署,并且執(zhí)行器自動(dòng)注冊(cè)提交的是容器 ip,那么就會(huì)產(chǎn)生定時(shí)任務(wù)執(zhí)行失敗的問(wèn)題,因?yàn)?xxl-job 后管調(diào)用不通執(zhí)行器。

這里給大家畫(huà)一個(gè) xxl-job 調(diào)用執(zhí)行器的示意圖,方便大家理解,

調(diào)用流程調(diào)用流程

給大家講一下示意圖:

1.xxl-job 執(zhí)行器在啟動(dòng)時(shí)會(huì)向 xxl-job 后管提交當(dāng)前服務(wù)器 ip,獲取邏輯在 com.xxl.job.core.util.IpUtil#getIp 方法中,這個(gè)方法在最新版本里默認(rèn)優(yōu)先使用 JDK 提供的 InetAddress.getLocalHost() 方法獲取本機(jī) ip。獲取不到的話再使用 JDK 提供的 NetworkInterface.getNetworkInterfaces() 方法遍歷本機(jī)網(wǎng)卡獲取 ip。

InetAddress.getLocalHost() 的一些坑:

  • 在 Linux 環(huán)境通過(guò)獲取 /etc/hosts 和 /etc/resolv.conf 文件內(nèi)容,如果在 /etc/hosts 文件內(nèi)容中沒(méi)有匹配到對(duì)應(yīng)的 ip 地址,則通過(guò) /etc/resolv.conf 中配置的 DNS 地址,向 DNS 服務(wù)器發(fā)出域名解析請(qǐng)求;
  • 如果訪問(wèn) DNS 服務(wù)存在性能問(wèn)題;
  • InetAddress.getLocalHost() 實(shí)現(xiàn)中還加了 synchronized 鎖,并發(fā)環(huán)境中會(huì)影響性能。

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

3.xxl-job 后管觸發(fā)定時(shí)任務(wù)時(shí),會(huì)調(diào)用 xxl-job 執(zhí)行器提供的 /run 接口來(lái)執(zhí)行對(duì)應(yīng)任務(wù)。

在上面流程中,因?yàn)榈诙教峤坏?xxl-job 執(zhí)行器通信地址錯(cuò)誤,因而導(dǎo)致第三步執(zhí)行失敗。那么怎么解決這個(gè)問(wèn)題嘞,其實(shí)很簡(jiǎn)單,xxl-job 后管使用手動(dòng)注冊(cè)填寫(xiě)可以聯(lián)通的執(zhí)行器地址即可。

二、xxl-job執(zhí)行器自動(dòng)注冊(cè)流程

xxl-job 執(zhí)行器的自動(dòng)注冊(cè)流程其實(shí)很簡(jiǎn)單,這里給大家梳理一下,

自動(dòng)注冊(cè)、移除流程自動(dòng)注冊(cè)、移除流程

三、執(zhí)行器注冊(cè)

客戶端在引入 xxl-job 執(zhí)行器啟動(dòng)時(shí),xxl-job 執(zhí)行器會(huì)啟動(dòng) ExecutorRegistryThread 線程,

圖片圖片

這個(gè)線程是專門(mén)來(lái)做執(zhí)行器注冊(cè)的,它會(huì)每隔 30 秒調(diào)用 xxl-job 后管的 /api/register 接口提交執(zhí)行器地址和名稱。

xxl-job 后管收到執(zhí)行器的注冊(cè)信息后,會(huì)通過(guò) registryOrRemoveThreadPool 線程池異步保存執(zhí)行器信息并發(fā)送成功響應(yīng)。

圖片圖片

registryOrRemoveThreadPool 線程池會(huì)判斷是否已經(jīng)存在當(dāng)前執(zhí)行器注冊(cè)記錄,不存在就新建,存在就更新執(zhí)行器最新注冊(cè)時(shí)間。

所以當(dāng)我們?cè)?xxl-job 后管新增執(zhí)行器,選擇自動(dòng)注冊(cè)的時(shí)候,執(zhí)行器的地址就是這么來(lái)的。

四、執(zhí)行器移除

移除有兩個(gè)方式,一種是正常結(jié)束 xxl-job 執(zhí)行器,比如停止應(yīng)用程序,xxl-job 執(zhí)行器就會(huì)調(diào)用 /api/registryRemove 接口用來(lái)移除當(dāng)前執(zhí)行器注冊(cè)信息。還有一種 xxl-job 后管啟動(dòng)的 registryMonitorThread 線程自動(dòng)檢測(cè)注冊(cè)時(shí)間已經(jīng)超期的執(zhí)行器注冊(cè)信息。

圖片圖片

registryMonitorThread 線程會(huì)查詢所有自動(dòng)注冊(cè)類型的執(zhí)行器,然后查詢它們對(duì)應(yīng)的注冊(cè)記錄最新時(shí)間是否超期,在xxl-job中,這個(gè)超期時(shí)間是90秒。超過(guò) 90 秒后就會(huì)移除執(zhí)行器。

移除時(shí)會(huì)同時(shí)刪除 xxl_job_group、xxl_job_registry 表的執(zhí)行器信息。

四、最后關(guān)于IpUtil.getIp() 的一點(diǎn)思考

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

圖片圖片

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

圖片圖片

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


看了提交歷史和上面關(guān)于InetAddress.getLocalHost() 一些坑的朋友,此處應(yīng)該一臉疑問(wèn)。。。

這里就暫且當(dāng)作者基于某種考慮這么做,至于為什么,我已經(jīng)去 github 提交了 issue,幫大家問(wèn)了。。。

圖片圖片

責(zé)任編輯:武曉燕 來(lái)源: 程序員wayn
相關(guān)推薦

2023-11-07 07:56:40

2022-03-26 17:13:22

ElasticJobxxl-job分布式

2020-07-17 09:33:39

CPU內(nèi)存調(diào)度

2025-02-18 14:08:14

2022-09-23 13:57:11

xxl-job任務(wù)調(diào)度中間件

2025-05-26 09:31:23

2024-11-06 18:01:15

分布式任務(wù)調(diào)度組件

2024-08-27 09:34:24

2023-01-04 09:23:58

2024-09-09 08:11:12

2025-06-27 09:31:25

2023-11-30 22:06:43

2024-07-31 08:18:40

2021-12-26 19:07:51

MySQL存儲(chǔ)容器

2012-05-24 14:58:55

開(kāi)源代碼

2022-12-29 08:32:50

xxl-job緩存Schedule

2023-06-27 07:44:53

xxl-job分布式任務(wù)調(diào)度平臺(tái)

2021-12-26 00:03:27

響應(yīng)式編程異步

2022-01-27 08:44:58

調(diào)度系統(tǒng)開(kāi)源

2017-07-20 13:11:46

Code ReviewPR評(píng)審
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)