このリポジトリは、2022年3月9日に開催された「実例で学ぶレジリエンスプログラミング教室」の ハンズオン用リポジトリ のForkです。
オリジナルのREADME.mdは README_original.md にあります。
go/
に以下の変更を加えています。
- CircuitBreakerのstate変更時のログ出力を追加
- CircuitBreakerを無効化したhttp.Getのwrapper関数、
weak_get
を追加
- k6
- 負荷テストツールです。JavaScriptで負荷テストのシナリオを記述できます。
- ハンズオンでどのようなツールを使っていたか失念したため、自分で選定しました。
- 必要なパッケージのインストール
cd go go mod tidy
- 並行性を制限してHTTPサーバを起動する
go run main.go -c 10
- 別Terminalを立ち上げ、負荷テストを実施する
k6 run ./k6_test.js --vus 10 --duration 10s
--vus 10
は同時接続数10、--duration 10s
はテストの実行時間10秒の指定です。
- HTTPサーバが起動されているTerminalで以下のようなログ出力がされ、
CircuitBreakerのstateがOpenになっていることを確認する{"level":"info","ts":1647323079.09885,"caller":"go/main.go:48","msg":"gobreaker state changed","from":"closed","to":"open"}
今度は、CircuitBreakerが無効な状態で負荷テストを実施します。
- main.go を書き換え、CircuitBreakerを無効にする
func testEndpoint(w http.ResponseWriter, r *http.Request) { - body, err := get("http://localhost:9082/api/java/slow") + body, err := weak_get("http://localhost:9082/api/java/slow")
- 本当はコマンドライン引数等で切り替えられた方がいいのですが、コード書き換えで対応しています。
- 並行性を制限してHTTPサーバを起動する
go run main.go -c 10
- 別Terminalを立ち上げ、負荷テストを実施する
k6 run ./k6_test.js --vus 10 --duration 10s
- 先程よりもiterations(シナリオの実行回数)が少ないことが確認できると思います。
- HTTPサーバが起動されているTerminalで、state変更のログ出力がされていないことを確認する
Secure integrations with Circuit Breaker in Go - DEV Community