Java分散アプリケーションでの現在の制限の実装
碑文
ご存知のように、現在、分散型の電流制限ツールは数多くあり、さまざまなアプリケーションフレームワークのサポートは同じではありません。現在のプロジェクトアーキテクチャに適した電流制限テクノロジを選択するのが最適です。
配布
配布されるもの
分散システム(distributed system
)は、ネットワーク上に構築されたソフトウェアシステムです。分散システムが非常にまとまりがあり、透過的であるのは、まさにソフトウェアの特性によるものです。したがって、ネットワークと分散システムの違いは、ハードウェアではなく、高レベルのソフトウェア(特にオペレーティングシステム)にあります。
分散システムの利点
素人の言葉で言えば、システムの同時実行性とスループット率を向上させることは、単一のマシンと複数のマシンが同時に動作することの違いです。
分散コアの問題
並行性によって引き起こされるシステムの問題、有名なCAP
理論は分散システムの問題の解釈です:一貫性、可用性、パーティションの障害耐性
データ整合性ソリューション
最も単純で最も一般的な方法は、データベース実装の使用、Zookeeper
実装の使用、実装の使用などの分散ロックをRedis
実装することです。
上に要約した方法は、分散同時実行問題の解決策です。この記事では、主に、同時実行率の高いシナリオでの現在の制限を最適化して解決します。
制限
java
同時電流制限
Java同時実行ツール(4)セマフォ
Java同時実行ツール(3つ)Exchanger
Java同時実行ツール(2つ)CyclicBarrier
Java同時実行ツール(1)CountDownLatch
java
現在の制限とは、スタンドアロンシナリオでのインターフェイス実行の制限を指し、指定されたシナリオを満たすことができます。しかし、分散アーキテクチャを備えたシステムでは時代遅れです。
分散アプリケーションの現在の制限
分散電流制限を実装するための多くのアイデアがあります
Redis
電流制限に基づく
Redis
setnx
操作
固定時間ウィンドウサイズは、それが一致しない限りN:N
、つまり、N単位時間がN
1key
に対応し、カウントが動的に実現されない限り、スライディングウィンドウの効果はありません。
Redis
データ構造zset
public boolean limitZset(){
int currentTime = Helper.getCurrentTime();
int intervalTime = 10 * 1000;
System.err.println("开始时间:" + currentTime);
if(redisTemplate.hasKey("limit_key")) {
Integer count = redisTemplate.opsForZSet().rangeByScore("limit_key", currentTime - intervalTime, currentTime).size(); // intervalTime是限流的时间
System.out.println(count);
if (count != null && count > 5) {
return false;
}
}
redisTemplate.opsForZSet().add("limit_key",UUID.randomUUID().toString(),currentTime);
System.err.println("结束时间:" + Helper.getCurrentTime());
return true;
}
Redis
トークンバケットアルゴリズム
public boolean limitLeakyBuckets (){
Object result = redisTemplate.opsForList().leftPop("limit_leaky_buckets");
if(result == null){
return false;
}
return true;
}
@Scheduled(fixedDelay = 10000,initialDelay = 0)
public void setToken(){
redisTemplate.opsForList().rightPush("limit_leaky_buckets",UUID.randomUUID().toString());
}
}
Hystrix
電流制限に基づく
Netflix
分散型マイクロサービスアーキテクチャの実践の下で、同社はサービスの安定性を保護するように設計されたクライアントヒューズおよび回路ブレーカーソリューションを呼び出しますHystrix
。
Future
電流制限の実現
public class FutureDemo {
private static final Random random = new Random();
public static void main(String[] args) throws InterruptedException, ExecutionException {
ExecutorService executorService = Executors.newSingleThreadExecutor();
Future<String> future = executorService.submit(()->{
int nextInt = random.nextInt(200);
System.out.printf("Thread : %s,睡眠时间: %s ms \n", Thread.currentThread().getName(),nextInt);
try {
Thread.sleep(nextInt);
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
executorService.shutdown();
}
return "hello world";
});
try {
future.get(100, TimeUnit.MILLISECONDS);
} catch (TimeoutException e) {
System.out.println("服务熔断保护");
e.printStackTrace();
}
}
}
Hystrix
成し遂げる
@RestController
public class HelloWorldController {
private final Random random = new Random();
@GetMapping("/hello")
@HystrixCommand(fallbackMethod = "errorOfHello",
commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "100")
}
)
public String hello() throws InterruptedException {
int nextInt = random.nextInt(200);
System.out.printf("Thread : %s,睡眠时间: %s ms \n", Thread.currentThread().getName(), nextInt);
Thread.sleep(nextInt);
return "hello world";
}
@GetMapping("/hello2")
public String hello2() throws InterruptedException {
return new HystrixCommendDemo().execute();
}
public String errorOfHello() {
return "error of hello world";
}
}
Sentinel
電流制限に基づく
Sentinel
これは、Aliミドルウェアチームによる分散サービスアーキテクチャ用のオープンソースで軽量で可用性の高いフロー制御コンポーネントです。主にフローをエントリポイントとして使用して、フロー制御、ヒューズの劣化、システム負荷保護などの複数の側面からサービスを保護します。安定。
public static void main(String[] args) {
initFlowRules(); //初始化规则
while(true){
Entry entry=null;
try{
entry= SphU.entry(resource); //准入判断
System.out.println("Hello Word");
}catch (BlockException e){
//异常处理
e.printStackTrace();
}finally {
if(entry!=null){
entry.exit();// 资源释放
}
}
}
}
Sentinel
比較 Hystrix
コントラストコンテンツ | センチネル | Hystrix |
---|---|---|
分離戦略 | セマフォ分離 | スレッドプールの分離/セマフォの分離 |
ヒューズダウングレード戦略 | 応答時間または失敗率に基づく | 失敗率に基づく |
リアルタイムインジケーターの実現 | スライドウィンドウ | スライディングウィンドウ(RxJavaに基づく) |
ルール構成 | 複数のデータソースをサポートする | 複数のデータソースをサポートする |
スケーラビリティ | 複数の拡張ポイント | プラグインフォーム |
注釈ベースのサポート | 待機する | 待機する |
制限 | QPSに基づいて、通話関係に基づいて現在の制限をサポートします | サポートしません |
トラフィックシェーピング | スロースタート、均一速度モードをサポート | サポートしません |
システム負荷保護 | 待機する | サポートしません |
コンソール | 箱から出して、ルールを構成したり、第2レベルの監視、マシン検出などを表示したりできます。 | 不完全 |
共通のフレームワークの適応 | サーブレット、Spring Cloud、Dubbo、gRPC等 | サーブレット、Spring Cloud Netflix |