国产av一二三区|日本不卡动作网站|黄色天天久久影片|99草成人免费在线视频|AV三级片成人电影在线|成年人aV不卡免费播放|日韩无码成人一级片视频|人人看人人玩开心色AV|人妻系列在线观看|亚洲av无码一区二区三区在线播放

網(wǎng)易首頁(yè) > 網(wǎng)易號(hào) > 正文 申請(qǐng)入駐

盤一盤 XXL-JOB 中那些驚艷的架構(gòu)設(shè)計(jì)

0
分享至

Java精選面試題(微信小程序):5000+道面試題和選擇題,包含Java基礎(chǔ)、并發(fā)、JVM、線程、MQ系列、Redis、Spring系列、Elasticsearch、Docker、K8s、Flink、Spark、架構(gòu)設(shè)計(jì)、大廠真題等,在線隨時(shí)刷題!

1、通信底層介紹

xxl-job 使用 netty http 的方式進(jìn)行通信,雖然也支持 Mina,jetty,netty tcp 等方式,但是代碼里面固定寫(xiě)死的是 netty http。

2、通信整體流程

我以調(diào)度器通知執(zhí)行器執(zhí)行任務(wù)為例,繪制的活動(dòng)圖:


3、驚艷的設(shè)計(jì)

看完了整個(gè)處理流程代碼,設(shè)計(jì)上可以說(shuō)獨(dú)具匠心,將 netty,多線程的知識(shí)運(yùn)用得行云流水。

我現(xiàn)在就將這些設(shè)計(jì)上出彩的點(diǎn)總結(jié)如下:

使用動(dòng)態(tài)代理模式,隱藏通信細(xì)節(jié)

xxl-job 定義了兩個(gè)接口 ExecutorBiz,AdminBiz,ExecutorBiz 接口中封裝了向心跳,暫停,觸發(fā)執(zhí)行等操作,AdminBiz 封裝了回調(diào),注冊(cè),取消注冊(cè)操作,接口的實(shí)現(xiàn)類中,并沒(méi)有通信相關(guān)的處理。

XxlRpcReferenceBean 類的 getObject() 方法會(huì)生成一個(gè)代理類,這個(gè)代理類會(huì)進(jìn)行遠(yuǎn)程通信。

全異步處理

執(zhí)行器收到消息進(jìn)行反序列化,并沒(méi)有同步執(zhí)行任務(wù)代碼,而是將任務(wù)信息存儲(chǔ)在 LinkedBlockingQueue 中,異步線程從這個(gè)隊(duì)列中獲取任務(wù)信息,然后執(zhí)行。

而任務(wù)的處理結(jié)果,也不是說(shuō)處理完之后,同步返回的,也是放到回調(diào)線程的阻塞隊(duì)列中,異步的將處理結(jié)果返回回去。

這樣處理的好處就是減少了 netty 工作線程的處理時(shí)間,提升了吞吐量。

對(duì)異步處理的包裝

對(duì)異步處理進(jìn)行了包裝,代碼看起來(lái)是同步調(diào)用的。

我們看下調(diào)度器,XxlJobTrigger 類觸發(fā)任務(wù)執(zhí)行的代碼:

public static ReturnT 

   
runExecutor(TriggerParam triggerParam, String address){
ReturnT runResult = null;
try {
ExecutorBiz executorBiz = XxlJobScheduler.getExecutorBiz(address);
//這里面做了很多異步處理,最終同步得到處理結(jié)果
runResult = executorBiz.run(triggerParam);
} catch (Exception e) {
logger.error(">>>>>>>>>>> xxl-job trigger error, please check if the executor[{}] is running.", address, e);
runResult = new ReturnT (ReturnT.FAIL_CODE, ThrowableUtil.toString(e));
}

StringBuffer runResultSB = new StringBuffer(I18nUtil.getString("jobconf_trigger_run") + ":");
runResultSB.append("
address:").append(address);
runResultSB.append("
code:").append(runResult.getCode());
runResultSB.append("
msg:").append(runResult.getMsg());

runResult.setMsg(runResultSB.toString());
return runResult;
}

ExecutorBiz.run 方法我們說(shuō)過(guò)了,是走的動(dòng)態(tài)代理,和執(zhí)行器進(jìn)行通信,執(zhí)行器執(zhí)行結(jié)果也是異步處理完,才返回的,而這里看到的 run 方法是同步等待處理結(jié)果返回。

我們看下xxl-job是如何同步獲取處理結(jié)果的:調(diào)度器向執(zhí)行器發(fā)出消息后,該線程阻塞。等到執(zhí)行器處理完畢后,將處理結(jié)果返回,喚醒被阻塞的線程,調(diào)用處拿到返回值。

動(dòng)態(tài)代理代碼如下:

//代理類中的觸發(fā)調(diào)用
if (CallType.SYNC == callType) {
// future-response set
XxlRpcFutureResponse futureResponse = new XxlRpcFutureResponse(invokerFactory, xxlRpcRequest, null);
try {
// do invoke
client.asyncSend(finalAddress, xxlRpcRequest);

// future get
XxlRpcResponse xxlRpcResponse = futureResponse.get(timeout, TimeUnit.MILLISECONDS);
if (xxlRpcResponse.getErrorMsg() != null) {
thrownew XxlRpcException(xxlRpcResponse.getErrorMsg());
}
return xxlRpcResponse.getResult();
} catch (Exception e) {
logger.info(">>>>>>>>>>> xxl-rpc, invoke error, address:{}, XxlRpcRequest{}", finalAddress, xxlRpcRequest);

throw (e instanceof XxlRpcException)?e:new XxlRpcException(e);
} finally{
// future-response remove
futureResponse.removeInvokerFuture();
}
}

XxlRpcFutureResponse 類中實(shí)現(xiàn)了線程的等待,和線程喚醒的處理:

//返回結(jié)果,喚醒線程
public void setResponse(XxlRpcResponse response) {
this.response = response;
synchronized (lock) {
done = true;
lock.notifyAll();
}
}

@Override
public XxlRpcResponse get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException {
if (!done) {
synchronized (lock) {
try {
if (timeout < 0) {
//線程阻塞
lock.wait();
} else {
long timeoutMillis = (TimeUnit.MILLISECONDS==unit)?timeout:TimeUnit.MILLISECONDS.convert(timeout , unit);
lock.wait(timeoutMillis);
}
} catch (InterruptedException e) {
throw e;
}
}
}

if (!done) {
thrownew XxlRpcException("xxl-rpc, request timeout at:"+ System.currentTimeMillis() +", request:" + request.toString());
}
return response;
}

有的同學(xué)可能會(huì)問(wèn)了,調(diào)度器接收到返回結(jié)果,怎么確定喚醒哪個(gè)線程呢?

每一次遠(yuǎn)程調(diào)用,都會(huì)生成 uuid 的請(qǐng)求 id,這個(gè) id 是在整個(gè)調(diào)用過(guò)程中一直傳遞的,就像一把鑰匙,在你回家的的時(shí)候,拿著它就帶開(kāi)門。

這里拿著請(qǐng)求 id 這把鑰匙,就能找到對(duì)應(yīng)的 XxlRpcFutureResponse,然后調(diào)用 setResponse 方法,設(shè)置返回值,喚醒線程。

public void notifyInvokerFuture(String requestId, final XxlRpcResponse xxlRpcResponse){

// 通過(guò)requestId找到XxlRpcFutureResponse,
final XxlRpcFutureResponse futureResponse = futureResponsePool.get(requestId);
if (futureResponse == null) {
return;
}
if (futureResponse.getInvokeCallback()!=null) {

// callback type
try {
executeResponseCallback(new Runnable() {
@Override
public void run() {
if (xxlRpcResponse.getErrorMsg() != null) {
futureResponse.getInvokeCallback().onFailure(new XxlRpcException(xxlRpcResponse.getErrorMsg()));
} else {
futureResponse.getInvokeCallback().onSuccess(xxlRpcResponse.getResult());
}
}
});
}catch (Exception e) {
logger.error(e.getMessage(), e);
}
} else {
// 里面調(diào)用lock的notify方法
futureResponse.setResponse(xxlRpcResponse);
}

// do remove
futureResponsePool.remove(requestId);

}

來(lái)源:https://blog.csdn.net/weixin_45334346?type=blog

公眾號(hào)“Java精選”所發(fā)表內(nèi)容注明來(lái)源的,版權(quán)歸原出處所有(無(wú)法查證版權(quán)的或者未注明出處的均來(lái)自網(wǎng)絡(luò),系轉(zhuǎn)載,轉(zhuǎn)載的目的在于傳遞更多信息,版權(quán)屬于原作者。如有侵權(quán),請(qǐng)聯(lián)系,筆者會(huì)第一時(shí)間刪除處理!

最近有很多人問(wèn),有沒(méi)有讀者或者摸魚(yú)交流群!加入方式很簡(jiǎn)單,公眾號(hào)Java精選,回復(fù)“加群”,即可入群!

文章有幫助的話,點(diǎn)在看,轉(zhuǎn)發(fā)吧!

特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相關(guān)推薦
熱點(diǎn)推薦
被曝生下畸形兒傳聞僅1月,闞清子官宣喜訊,連發(fā)三文表明態(tài)度

被曝生下畸形兒傳聞僅1月,闞清子官宣喜訊,連發(fā)三文表明態(tài)度

一口娛樂(lè)
2026-01-29 09:31:09
已確認(rèn),浙江有大到暴雪!今晚變天

已確認(rèn),浙江有大到暴雪!今晚變天

魯中晨報(bào)
2026-01-29 13:39:09
不敢置信!女子十二樂(lè)坊成員直播養(yǎng)不活自己,一晚上打賞不到3000

不敢置信!女子十二樂(lè)坊成員直播養(yǎng)不活自己,一晚上打賞不到3000

云中浮生
2026-01-24 21:37:46
奇葩!35歲女子4年不回家,母親來(lái)探望卻被懟,女子:就當(dāng)我死了

奇葩!35歲女子4年不回家,母親來(lái)探望卻被懟,女子:就當(dāng)我死了

娛樂(lè)帝皇丸
2026-01-28 15:18:51
16歲武漢男生凌晨離家,失聯(lián)超70小時(shí), 父親:未帶手機(jī)現(xiàn)金,最后出現(xiàn)在橋上不見(jiàn)蹤跡

16歲武漢男生凌晨離家,失聯(lián)超70小時(shí), 父親:未帶手機(jī)現(xiàn)金,最后出現(xiàn)在橋上不見(jiàn)蹤跡

大風(fēng)新聞
2026-01-29 13:53:22
人民日?qǐng)?bào)怒批!炫富、偷稅749萬(wàn)、跑國(guó)外,現(xiàn)又來(lái)“割內(nèi)地韭菜”

人民日?qǐng)?bào)怒批!炫富、偷稅749萬(wàn)、跑國(guó)外,現(xiàn)又來(lái)“割內(nèi)地韭菜”

小熊侃史
2026-01-18 07:20:09
港股地產(chǎn)股大漲,融創(chuàng)中國(guó)漲超30%

港股地產(chǎn)股大漲,融創(chuàng)中國(guó)漲超30%

每日經(jīng)濟(jì)新聞
2026-01-29 11:39:06
外交部:繼續(xù)深化國(guó)際執(zhí)法合作 加大力度打擊網(wǎng)賭電詐

外交部:繼續(xù)深化國(guó)際執(zhí)法合作 加大力度打擊網(wǎng)賭電詐

財(cái)聯(lián)社
2026-01-29 15:26:24
尼帕病毒來(lái)勢(shì)洶洶,建議:每家最好備6樣?xùn)|西,關(guān)鍵時(shí)刻能救命呢

尼帕病毒來(lái)勢(shì)洶洶,建議:每家最好備6樣?xùn)|西,關(guān)鍵時(shí)刻能救命呢

現(xiàn)代小青青慕慕
2026-01-28 08:59:53
阿富汗的鍋,拜登不背!

阿富汗的鍋,拜登不背!

山河路口
2026-01-28 23:12:39
心理學(xué)上有一個(gè)詞叫:梅拉賓法則(搞好人際關(guān)系最好的辦法)

心理學(xué)上有一個(gè)詞叫:梅拉賓法則(搞好人際關(guān)系最好的辦法)

經(jīng)濟(jì)觀察報(bào)
2025-09-01 10:06:25
1971年,劉思齊蒙冤入獄后向毛主席求助,毛澤東作出:娃娃們無(wú)罪

1971年,劉思齊蒙冤入獄后向毛主席求助,毛澤東作出:娃娃們無(wú)罪

史海孤雁
2026-01-27 18:02:17
瞞不住了!美媒:美軍高官已進(jìn)臺(tái)島指揮導(dǎo)彈戰(zhàn),戰(zhàn)時(shí)先炸福建沿海

瞞不住了!美媒:美軍高官已進(jìn)臺(tái)島指揮導(dǎo)彈戰(zhàn),戰(zhàn)時(shí)先炸福建沿海

史智文道
2026-01-29 16:14:14
要打就打痛!中國(guó)手段已升級(jí),日本:中方不批準(zhǔn)駐重慶總領(lǐng)事任命

要打就打痛!中國(guó)手段已升級(jí),日本:中方不批準(zhǔn)駐重慶總領(lǐng)事任命

通文知史
2026-01-28 14:30:03
太頂了!明明什么都沒(méi)露,卻性感得要命!

太頂了!明明什么都沒(méi)露,卻性感得要命!

貴圈真亂
2025-12-20 12:02:06
最新傷勢(shì)情況曝光,德約科維奇直言:對(duì)辛納絕不舉白旗

最新傷勢(shì)情況曝光,德約科維奇直言:對(duì)辛納絕不舉白旗

體育妞世界
2026-01-29 12:38:11
起風(fēng)了!加拿大已改口,禁止與中國(guó)簽協(xié)定,65萬(wàn)噸油菜籽白買了?

起風(fēng)了!加拿大已改口,禁止與中國(guó)簽協(xié)定,65萬(wàn)噸油菜籽白買了?

墨印齋
2026-01-29 11:47:54
加快男性衰老的因素:喝酒僅第5,排在第1的,很多男性還沒(méi)發(fā)現(xiàn)!

加快男性衰老的因素:喝酒僅第5,排在第1的,很多男性還沒(méi)發(fā)現(xiàn)!

醫(yī)學(xué)科普匯
2026-01-27 10:41:31
中國(guó)人一年少買了10萬(wàn)輛進(jìn)口寶馬

中國(guó)人一年少買了10萬(wàn)輛進(jìn)口寶馬

第一財(cái)經(jīng)資訊
2026-01-29 10:34:13
1973年,毛主席問(wèn)楊振寧:萬(wàn)壽無(wú)疆科學(xué)嗎?楊振寧的回答,讓主席笑了

1973年,毛主席問(wèn)楊振寧:萬(wàn)壽無(wú)疆科學(xué)嗎?楊振寧的回答,讓主席笑了

寄史言志
2026-01-24 17:53:13
2026-01-29 17:15:00
Java精選
Java精選
一場(chǎng)永遠(yuǎn)也演不完的戲
1768文章數(shù) 3859關(guān)注度
往期回顧 全部

科技要聞

周亞輝的AI新賭局:國(guó)內(nèi)太卷 出海另起爐灶

頭條要聞

女大學(xué)生到東北游玩暈倒雪地凍傷 三根手指或面臨截肢

頭條要聞

女大學(xué)生到東北游玩暈倒雪地凍傷 三根手指或面臨截肢

體育要聞

詹姆斯哭了!騎士視頻致敬41歲超巨

娛樂(lè)要聞

張譯不再隱瞞!公開(kāi)回應(yīng)退圈息影真相

財(cái)經(jīng)要聞

崔東樹(shù):中國(guó)汽車未來(lái)年銷或達(dá)5000萬(wàn)輛

汽車要聞

車長(zhǎng)超5米還帶后輪轉(zhuǎn)向 比亞迪海豹08/海獅08將亮相

態(tài)度原創(chuàng)

時(shí)尚
本地
旅游
藝術(shù)
游戲

冬天大衣怎么穿才更好看?選好顏色、找對(duì)單品,高級(jí)簡(jiǎn)約又大氣

本地新聞

云游中國(guó)|撥開(kāi)云霧,巫山每幀都是航拍大片

旅游要聞

投資30億,一年收入500萬(wàn),玉龍雪山觀光火車關(guān)停的蛛絲馬跡

藝術(shù)要聞

梵高全集(高清350張)震撼……

PS+港區(qū)2月會(huì)免來(lái)了! 包含《冰點(diǎn)之下》等

無(wú)障礙瀏覽 進(jìn)入關(guān)懷版