作業ドキュメンタリー 35-API データ クリーニングと電流制限

インターフェイスは非同期データ クリーニングを行うためにサードパーティのサービスを呼び出しますが、他の人のサービスが崩壊することを恐れているため、Guava の現在の制限戦略をインターフェイスに追加します


/**
 * @author 寒夜
 */
@RestController
@Slf4j
public class Controller {
    
    

    volatile RateLimiter rateLimiter = RateLimiter.create(10);
 
    /**
     * 非阻塞限流
     *
     * @param count 每秒消费的令牌个数 (每秒允许放行的请求次数)
     * @return success/fail
     */
    @GetMapping("/tryAcquire")
    public String tryAcquire(Integer count) {
    
    
        if (limiter.tryAcquire(count)) {
    
    
            log.info("success,rate is {}", limiter.getRate());
            return "success";
        } else {
    
    
            log.info("fail ,rate is {} ", limiter.getRate());
            return "fail";
        }
 
    }
 
    /**
     * 限定时间的非阻塞限流
     *
     * @param count 每秒消费的令牌个数 (每秒允许放行的请求次数)
     * @return success/fail
     */
    @GetMapping("/tryAcquireWithTimeOut")
    public String tryAcquireWithTimeOut(Integer count, Integer timeout) {
    
    
        if (limiter.tryAcquire(count, timeout, TimeUnit.SECONDS)) {
    
    
            log.info("success,rate is {}", limiter.getRate());
            return "success";
        } else {
    
    
            log.info("fail ,rate is {} ", limiter.getRate());
            return "fail";
        }
 
    }
 
    /**
     * 同步阻塞限流
     * @param count 每秒消费的令牌个数 (每秒允许放行的请求次数)
     * @return success
     */
    @GetMapping("/acquire")
    public String acquire(Integer count) {
    
    
        limiter.acquire(count);
        log.info("success,rate is {}", limiter.getRate());
        return "success";
    }
 
}
}

RateLimiter は同時シナリオで安全に使用でき、すべてのスレッドの合計レートを制限しますが、公平性は保証されません。

上記はスタンドアロン電流制限、分散型電流制限 [Redisson RRateLimiter]: https://blog.csdn.net/truelove12358/article/details/127751211

SemaphoreやGuavaのRateLimiterなどを利用して同時実行数やレートを制限しますが、現状の単体マシンの制限では、DBへのアクセスや操作の全体的な上限や、サービス全体のしきい値を拡張することはできません。フロー、この種の分散では、サービス クラスター全体のフロー制限を確保でき、クラスター内の不均衡なトラフィック分割の問題によって引き起こされるきめ細かいフロー制限制御を無視できます。良い戦略です。

スタンドアロン電流制限:

アドバンテージ:

1. シンプルで実装が簡単: スタンドアロンの電流制限は、複雑なアーキテクチャや構成を必要とせずに単一のサーバーに実装されます。 2. 低遅延: リクエストは単一のサーバーで処理されるため、単一マシンの電流制限により、ネットワークによって引き起こされる遅延を削減できます。ご連絡をお待ちしております。3. 低コスト: 分散型電流制限と比較して、スタンドアロン型電流制限は追加のハードウェアやネットワーク設備を必要とせず、コストが低くなります。

欠点:

1. 単一障害点: 電流制限手段が 1 台のサーバーにのみ展開されている場合、サーバーに障害が発生するか使用できなくなると、システム全体で電流制限を実行できなくなります。大規模なリクエストに対処するのが難しい バースト性の高い状況では、高いスループットとスケーラビリティを提供できません。

分散型電流制限:

アドバンテージ:

1. 高可用性: 電流制限戦略は複数のサーバーに分散されているため、サーバーの 1 つが利用できない場合でも、他のサーバーが電流制限操作を実行してシステムの可用性を確保できます。
2. 水平方向の拡張: 分散電流制限により拡張性が向上し、サーバー数を増やすことで大規模なリクエストに対応できます 3. 柔軟性: 分散電流制限は、さまざまなサーバーの負荷状況に応じて動的に調整でき、より適切に適応できます
。システムの変更。

欠点:

1. 複雑さ: 分散型電流制限には、負荷分散、メッセージング、調整などのメカニズムを含む複雑なアーキテクチャの設計と実装が必要です。2. 高遅延: 複数のサーバー間の通信が関係するため、特に大規模なリクエストの場合、分散型電流制限によって高遅延が発生する可能性があります。

おすすめ

転載: blog.csdn.net/u013553309/article/details/131975402