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

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

開發(fā) 前端
在計(jì)算機(jī)領(lǐng)域中,重試機(jī)制的重要性不言而喻。它通常分為兩種模式:客戶端模式和服務(wù)端模式。客戶端模式簡(jiǎn)單易用,但可靠性較低;而服務(wù)端模式雖然相對(duì)復(fù)雜,但能夠提供更高的可靠性。

1 背景

在分布式場(chǎng)景下,為了保障系統(tǒng)的可用性和數(shù)據(jù)的最終一致性,采用基于消息隊(duì)列(MQ)的重試機(jī)制是一種常見(jiàn)的解決方案。偽代碼如下:

/**
 * 需要保證最終一致性的函數(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ù)無(wú)關(guān)的代碼來(lái)實(shí)現(xiàn)業(yè)務(wù)邏輯的重試機(jī)制。為了減輕開發(fā)人員的負(fù)擔(dān)并讓其專注于核心業(yè)務(wù),我們可以對(duì)這些無(wú)關(guān)代碼進(jìn)行抽象和優(yōu)化,以提高開發(fā)效率和代碼質(zhì)量。

2 方案

通過(guò)如下步驟,我們對(duì)重試邏輯進(jìn)行了封裝,開發(fā)人員只需要在需要保證最終一致性的函數(shù)上標(biāo)注一個(gè)重試注解,便擁有基于MQ的分布式重試能力。

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

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

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

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

圖片圖片

3 效果

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

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

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

4 可選項(xiàng)

除此之外,我們還為開發(fā)人員提供了一些可選項(xiàng),提供一些可配置的能力。

/**
 * 基于MQ的分布式重試組件
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @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. 適用于異步場(chǎng)景,重試函數(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ù),請(qǐng)?jiān)诤瘮?shù)參數(shù)最后位置添加。歷史消息消費(fèi)時(shí)對(duì)應(yīng)參數(shù)將填充為null。

6 總結(jié)

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

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

圖片圖片

關(guān)于作者

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

責(zé)任編輯:武曉燕 來(lái)源: 轉(zhuǎn)轉(zhuǎn)技術(shù)
相關(guān)推薦

2024-07-31 20:45:45

2021-06-04 20:09:19

ID分布式設(shè)計(jì)

2014-09-23 10:05:55

2022-09-15 18:32:13

SPI模型框架

2022-06-15 11:01:59

自定義SPIJava

2024-04-02 09:32:08

Spring@Retry開發(fā)者

2023-01-06 09:19:12

Seata分布式事務(wù)

2009-01-18 09:11:16

JavaIDLJava分布式程序設(shè)計(jì)

2010-01-15 10:15:34

分布式交換技術(shù)

2015-04-21 09:39:03

javajava分布式爬蟲

2017-10-24 11:28:23

Zookeeper分布式鎖架構(gòu)

2024-01-10 08:02:03

分布式技術(shù)令牌,

2012-08-17 11:01:52

設(shè)計(jì)方案

2025-01-13 08:05:04

2023-10-08 10:49:16

搜索系統(tǒng)分布式系統(tǒng)

2023-05-18 14:02:00

分布式系統(tǒng)冪等性

2022-03-08 15:24:23

BitMapRedis數(shù)據(jù)

2017-04-13 10:51:09

Consul分布式

2021-09-09 15:45:17

機(jī)器學(xué)習(xí)人工智能Ray

2021-07-29 07:48:36

Zookeeper 核心設(shè)計(jì)
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 91成人精品视频 | 国产精品一区二区在线免费观看 | 免费一级黄色录像 | 亚洲精品乱码8久久久久久日本 | 国产成人网| 午夜精品一区二区三区在线视频 | 波多野结衣一区二区三区在线观看 | 天天拍天天射 | 亚洲国产一区二区三区四区 | 搞黄网站在线观看 | 免费观看黄网站 | 日韩在线精品视频 | 2020亚洲天堂 | www.一区二区三区.com | 欧美成人精品在线 | 精品无码久久久久国产 | 亚洲a级 | 欧美日韩在线视频一区 | 香蕉久久a毛片 | 国产精品一区在线观看你懂的 | 伊人狠狠操| 国产精品视频在线播放 | 免费看91 | 久久久福利 | 国产丝袜一区二区三区免费视频 | 午夜视频免费在线观看 | 亚洲三区在线观看 | 97在线播放| 夜夜爽99久久国产综合精品女不卡 | 亚洲一区二区在线视频 | 狠狠干狠狠插 | 久久久久国产成人精品亚洲午夜 | 亚洲精品欧美精品 | 欧美精品福利视频 | 欧美一区二区免费 | 久久99精品久久久水蜜桃 | 日日操av| 亚洲国产成人精品久久久国产成人一区 | 国产乱码精品1区2区3区 | 欧美精品久久久久 | 一级做a |