信号量メカニズムによるサービス同時ストリーム制限の実現
1624 ワード
マイクロサービスアーキテクチャの一般的な同時ストリーム制限の原理:
1.カウンタ
原子変数によって単位時間当たりのアクセス数を計算し、バルブ値を超えた場合、後続のリクエストを拒否し、次の単位時間まで待って再カウントします.
2.トークンカートリッジ
トークンバケットは、スレッドを介して単位時間当たりに一定数のトークンを生産し、キューにトークンを入れ、リクエスト呼び出しを食べていない場合はバケツからトークンを取り出し、トークンを手に入れた後にリクエスト呼び出しを実行する資格があります.そうしないと、トークンを手に入れてから実行するか、直接破棄するしかありません.
3.信号量
例実装:信号量メカニズムによるサービス同時制限ストリームの実現
1.カウンタ
原子変数によって単位時間当たりのアクセス数を計算し、バルブ値を超えた場合、後続のリクエストを拒否し、次の単位時間まで待って再カウントします.
2.トークンカートリッジ
トークンバケットは、スレッドを介して単位時間当たりに一定数のトークンを生産し、キューにトークンを入れ、リクエスト呼び出しを食べていない場合はバケツからトークンを取り出し、トークンを手に入れた後にリクエスト呼び出しを実行する資格があります.そうしないと、トークンを手に入れてから実行するか、直接破棄するしかありません.
3.信号量
例実装:信号量メカニズムによるサービス同時制限ストリームの実現
package com.app.main.architecture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
/**
*
* Created with IDEA
* author:Dingsheng Huang
* Date:2019/8/20
* Time: 7:33
*/
public class SemaphoreExample {
private static ExecutorService executorService = Executors.newCachedThreadPool();
public static void main(String[] args) {
final Semaphore semaphore = new Semaphore(5);
for (int i = 0; i < 200; i++) {
Runnable runnable = new Runnable() {
@Override
public void run() {
try {
//
semaphore.acquire();
// do something
Thread.sleep(300L);
//
semaphore.release();
System.out.println(" : " + semaphore.availablePermits());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
executorService.execute(runnable);
}
executorService.shutdown();
}
}