日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

轉(zhuǎn)轉(zhuǎn)基于MQ的分布式重試框架設(shè)計(jì)方案

來源: 責(zé)編: 時(shí)間:2024-02-01 12:48:02 239觀看
導(dǎo)讀1 背景在分布式場景下,為了保障系統(tǒng)的可用性和數(shù)據(jù)的最終一致性,采用基于消息隊(duì)列(MQ)的重試機(jī)制是一種常見的解決方案。偽代碼如下:/** * 需要保證最終一致性的函數(shù) */public void doSomething(Object args) { try {

1 背景

在分布式場景下,為了保障系統(tǒng)的可用性和數(shù)據(jù)的最終一致性,采用基于消息隊(duì)列(MQ)的重試機(jī)制是一種常見的解決方案。偽代碼如下:T9528資訊網(wǎng)——每日最新資訊28at.com

/** * 需要保證最終一致性的函數(shù) */public void doSomething(Object args) {    try {      // 執(zhí)行事務(wù)的操作      executeTransaction();      // 提交事務(wù)      commitTransaction();    } catch (Exception e) {        // 回滾事務(wù)        rollbackTransaction();        // 記錄日志        log.error(e);        // 序列化參數(shù)        byte[] body = serialize(args);        // 構(gòu)建消息, 指定Topic、Body        Message msg = new Message("doSomethingTopic", body);        // 發(fā)送失敗重試消息        mq.send(msg);    }}/** * 消費(fèi)者,用于失敗重試處理 */@Consumer(topic = "doSomethingTopic")public void consume(Message msg) {    // 反序列化    Object args = msg.deserialize();    // 重試    doSomething(args);}

在上述示例中,我們需要編寫一系列與業(yè)務(wù)無關(guān)的代碼來實(shí)現(xiàn)業(yè)務(wù)邏輯的重試機(jī)制。為了減輕開發(fā)人員的負(fù)擔(dān)并讓其專注于核心業(yè)務(wù),我們可以對這些無關(guān)代碼進(jìn)行抽象和優(yōu)化,以提高開發(fā)效率和代碼質(zhì)量。T9528資訊網(wǎng)——每日最新資訊28at.com

2 方案

通過如下步驟,我們對重試邏輯進(jìn)行了封裝,開發(fā)人員只需要在需要保證最終一致性的函數(shù)上標(biāo)注一個(gè)重試注解,便擁有基于MQ的分布式重試能力。T9528資訊網(wǎng)——每日最新資訊28at.com

1. 使用注解與AOP: 通過使用注解與面向切面編程(AOP)的技術(shù),將重試邏輯模塊與業(yè)務(wù)代碼解耦。開發(fā)人員可以在需要保證最終一致性的業(yè)務(wù)方法上添加注解,通過AOP將重試邏輯應(yīng)用到目標(biāo)方法中,從而自動(dòng)觸發(fā)重試機(jī)制。T9528資訊網(wǎng)——每日最新資訊28at.com

2. 提供配置化選項(xiàng):為重試邏輯提供可配置化的選項(xiàng),例如設(shè)置最大重試次數(shù)、重試間隔時(shí)間等。這樣,開發(fā)人員可以根據(jù)具體業(yè)務(wù)需求進(jìn)行調(diào)整,而無需修改代碼。T9528資訊網(wǎng)——每日最新資訊28at.com

3. 異常處理和日志記錄:在重試邏輯中合理地處理異常,并在必要時(shí)記錄相關(guān)日志。這樣可以幫助開發(fā)人員及時(shí)發(fā)現(xiàn)問題并進(jìn)行排查。T9528資訊網(wǎng)——每日最新資訊28at.com

4. 提供可視化監(jiān)控工具:開發(fā)一個(gè)可視化的監(jiān)控工具,用于實(shí)時(shí)跟蹤重試操作和相關(guān)指標(biāo)。這樣可以幫助開發(fā)人員更好地理解重試的執(zhí)行情況,并進(jìn)行故障排查和性能優(yōu)化。T9528資訊網(wǎng)——每日最新資訊28at.com

圖片圖片T9528資訊網(wǎng)——每日最新資訊28at.com

3 效果

我們引入了@MQRetry注解用于標(biāo)記業(yè)務(wù)邏輯函數(shù),一旦該函數(shù)發(fā)生異常,該注解會(huì)將服務(wù)名、類的完整名稱、方法名稱以及實(shí)際參數(shù)列表發(fā)送到消息隊(duì)列(MQ)中。同時(shí)系統(tǒng)會(huì)注冊一個(gè)MQ消費(fèi)者來消費(fèi)這些消息,并進(jìn)行重試處理。T9528資訊網(wǎng)——每日最新資訊28at.com

舉個(gè)例子,假設(shè)我們有一個(gè)名為doSomething的函數(shù),它包含了需要保證最終一致性執(zhí)行的業(yè)務(wù)邏輯。僅需在該函數(shù)上添加@MQRetry注解,當(dāng)函數(shù)出現(xiàn)異常時(shí),框架會(huì)自動(dòng)發(fā)送一條MQ重試消息。這條消息可以被當(dāng)前服務(wù)的任意一臺服務(wù)器消費(fèi),并重新執(zhí)行doSomething函數(shù)。T9528資訊網(wǎng)——每日最新資訊28at.com

@Serviceclass Service {     @MQRetry    public void doSomething(String params1, String params2, List<String> params3) {        //throw new RuntimeException(); 拋異常將重試        //RetryContext.markRetryLater(); 標(biāo)記為需要下次重試         //int retryCount = RetryContext.getRetryCount(); 獲取重試次數(shù)    } } @Controllerclass Controller {         @Autowired    private Service service;     service.doSomething("1", "2", Arrays.asList("3", "4"));}

4 可選項(xiàng)

除此之外,我們還為開發(fā)人員提供了一些可選項(xiàng),提供一些可配置的能力。T9528資訊網(wǎng)——每日最新資訊28at.com

/** * 基于MQ的分布式重試組件 */@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface MQRetry {    /**     * 最大重試次數(shù),默認(rèn)與上限為16次     */    int maxAttempts() default 16;        /**     * 忽略的異常類列表,默認(rèn)所有異常都重試     */    Class<? extends Throwable>[] exclude() default {};        /**     * 需要重試的異常類列表,默認(rèn)所有異常都重試     */    Class<? extends Throwable>[] include() default {};        /**     * 出現(xiàn)異常時(shí)的處理函數(shù), 格式: Bean名.方法名. 如: smsService.onError     * 也可以只設(shè)置函數(shù)名, 不設(shè)置Bean名將執(zhí)行本類的函數(shù). 如: onError     * 要求函數(shù)參數(shù)必須與重試函數(shù)的參數(shù)完全一致     */    String errorHandler() default "";        /**     * true: 第一次調(diào)用時(shí), 同步執(zhí)行@MQRetry函數(shù), 如果失敗再使用MQ     * false: 調(diào)用@MQRetry函數(shù)時(shí), 只會(huì)發(fā)送MQ     */    boolean firstSyncCall() default true;        /**     * 消費(fèi)線程數(shù),默認(rèn)為20個(gè)     */    int consumeThread() default 20;    }

5 注意事項(xiàng)

  1. 適用于異步場景,重試函數(shù)不要設(shè)置返回值,函數(shù)的返回值將不會(huì)有任何的實(shí)際意義。
  2. At lease Once保證,重試函數(shù)需要保證冪等。
  3. 使用了AOP代理實(shí)現(xiàn),因此,@Transactional的注意事項(xiàng)同樣適用于@MQRetry,如this調(diào)用、private函數(shù)、final函數(shù)會(huì)導(dǎo)致重試失效。
  4. 如果重試函數(shù)需要增加參數(shù),請?jiān)诤瘮?shù)參數(shù)最后位置添加。歷史消息消費(fèi)時(shí)對應(yīng)參數(shù)將填充為null。

6 總結(jié)

在計(jì)算機(jī)領(lǐng)域中,重試機(jī)制的重要性不言而喻。它通常分為兩種模式:客戶端模式和服務(wù)端模式。客戶端模式簡單易用,但可靠性較低;而服務(wù)端模式雖然相對復(fù)雜,但能夠提供更高的可靠性。T9528資訊網(wǎng)——每日最新資訊28at.com

無論是客戶端模式還是服務(wù)端模式,重試機(jī)制都是保障系統(tǒng)正常運(yùn)行的重要一環(huán)。選擇適合您業(yè)務(wù)需求的模式,并通過合理的配置項(xiàng)進(jìn)行優(yōu)化,將為您的系統(tǒng)帶來更好的表現(xiàn)和用戶體驗(yàn)。T9528資訊網(wǎng)——每日最新資訊28at.com

圖片圖片T9528資訊網(wǎng)——每日最新資訊28at.com

關(guān)于作者T9528資訊網(wǎng)——每日最新資訊28at.com

苑沖,轉(zhuǎn)轉(zhuǎn)架構(gòu)部存儲服務(wù)負(fù)責(zé)人,負(fù)責(zé)MQ、監(jiān)控系統(tǒng)、KV存儲、時(shí)序數(shù)據(jù)庫、Redis、KMS秘鑰管理等基礎(chǔ)組件。喜歡深入思考問題,對探索新領(lǐng)域和解決問題充滿熱情。T9528資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-70413-0.html轉(zhuǎn)轉(zhuǎn)基于MQ的分布式重試框架設(shè)計(jì)方案

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 互動(dòng)游戲團(tuán)隊(duì)如何將性能體驗(yàn)優(yōu)化做到TOP級別

下一篇: 為什么 Bun 可能對 Node 降維打擊?

標(biāo)簽:
  • 熱門焦點(diǎn)
  • 5月iOS設(shè)備好評榜:iPhone 14僅排第43?

    來到新的一月,安兔兔的各個(gè)榜單又重新匯總了數(shù)據(jù),像安卓陣營的榜單都有著比較大的變動(dòng),不過iOS由于設(shè)備的更新?lián)Q代并沒有那么快,所以相對來說變化并不大,特別是iOS好評榜,老款設(shè)
  • 帥氣純真少年!日本最帥初中生選美冠軍出爐

    日本第一帥哥初一生選美大賽冠軍現(xiàn)已正式出爐,冠軍是來自千葉縣的宗田悠良。日本一直熱衷于各種選美大賽,從&ldquo;最美JK&rdquo;起到&ldquo;最美女星&r
  • 三言兩語說透設(shè)計(jì)模式的藝術(shù)-單例模式

    寫在前面單例模式是一種常用的軟件設(shè)計(jì)模式,它所創(chuàng)建的對象只有一個(gè)實(shí)例,且該實(shí)例易于被外界訪問。單例對象由于只有一個(gè)實(shí)例,所以它可以方便地被系統(tǒng)中的其他對象共享,從而減少
  • 一篇聊聊Go錯(cuò)誤封裝機(jī)制

    %w 是用于錯(cuò)誤包裝(Error Wrapping)的格式化動(dòng)詞。它是用于 fmt.Errorf 和 fmt.Sprintf 函數(shù)中的一個(gè)特殊格式化動(dòng)詞,用于將一個(gè)錯(cuò)誤(或其他可打印的值)包裝在一個(gè)新的錯(cuò)誤中。使
  • 在線圖片編輯器,支持PSD解析、AI摳圖等

    自從我上次分享一個(gè)人開發(fā)仿造稿定設(shè)計(jì)的圖片編輯器到現(xiàn)在,不知不覺已過去一年時(shí)間了,期間我經(jīng)歷了裁員失業(yè)、面試找工作碰壁,寒冬下一直沒有很好地履行計(jì)劃.....這些就放在日
  • 一文掌握 Golang 模糊測試(Fuzz Testing)

    模糊測試(Fuzz Testing)模糊測試(Fuzz Testing)是通過向目標(biāo)系統(tǒng)提供非預(yù)期的輸入并監(jiān)視異常結(jié)果來發(fā)現(xiàn)軟件漏洞的方法。可以用來發(fā)現(xiàn)應(yīng)用程序、操作系統(tǒng)和網(wǎng)絡(luò)協(xié)議等中的漏洞或
  • 零售大模型“干中學(xué)”,攀爬數(shù)字化珠峰

    文/侯煜編輯/cc來源/華爾街科技眼對于絕大多數(shù)登山愛好者而言,攀爬珠穆朗瑪峰可謂終極目標(biāo)。攀登珠峰的商業(yè)路線有兩條,一是尼泊爾境內(nèi)的南坡路線,一是中國境內(nèi)的北坡路線。相
  • 微博大門常打開,迎接海外畫師漂洋東渡

    作者:互聯(lián)網(wǎng)那些事&ldquo;起猛了,我能看得懂日語了&rdquo;。&ldquo;為什么日本人說話我能聽懂?&rdquo;&ldquo;中文不像中文,日語不像日語,但是我竟然看懂了&rdquo;&hellip;&hell
  • 自研Exynos回歸!三星Galaxy S24系列將提供Exynos和驍龍雙版本

    年初,全新的三星Galaxy S23系列發(fā)布,包含Galaxy S23、Galaxy S23+和Galaxy S23 Ultra三個(gè)版本,全系搭載超頻版驍龍8 Gen 2,雖同樣采用臺積電4nm工藝制
Top 主站蜘蛛池模板: 莲花县| 台中县| 潼南县| 娄底市| 平原县| 东港市| 高雄县| 梧州市| 农安县| 吉隆县| 乌拉特中旗| 邛崃市| 鸡东县| 赤壁市| 霸州市| 宝清县| 叙永县| 威宁| 双江| 浦东新区| 浦北县| 石泉县| 福泉市| 喀喇| 房产| 三原县| 静宁县| 蓝田县| 越西县| 沅陵县| 湖州市| 乐清市| 天气| 南川市| 和顺县| 措美县| 肥城市| 墨玉县| 十堰市| 佛学| 鄂尔多斯市|