circuit breaker pattern をGoで実装したいので、いくつかのライブラリを試してみる。
ライブラリ
metricsもとれる https://github.com/cep21/circuit/ https://github.com/afex/hystrix-go 古い
bulk headなどcircuit breaker以外の機能もある https://github.com/slok/goresilience metricsとれる https://github.com/eapache/go-resiliency
circuit breakerのみ https://github.com/mercari/go-circuitbreaker https://github.com/sony/gobreaker https://github.com/streadway/handy/tree/master/breaker https://github.com/rubyist/circuitbreaker
Hystrix dashboard も使ってみると、サーキットの状態を見れておもしろい
cep21/circuit
- Hystrixライクなサーキットブレーカーを提供するライブラリ
- 設定値は https://github.com/Netflix/Hystrix/wiki/Configuration を参考にできる
- メトリクスを取れる
- Prometheus で収集できる
- メモリアロケーションのコストが低い、ベンチマークがいい
- Hystrix dashboard をサポートしている
Prometheus で収集するにはこちらのライブラリを使う https://github.com/jiacai2050/prometrics これによって、サーキットのオープン回数、実行回数などがわかる
実装例
http://localhost:8080/metrics
を開くとgo_gcなど標準のメトリクスに加えてcircuitの状態が取得できるようになっている
# HELP circuit_failure_duration_seconds Duration of failed func run
# TYPE circuit_failure_duration_seconds histogram
circuit_failure_duration_seconds_bucket{func="fallback",name="hystrix-circuit",le="0.005"} 2
circuit_failure_duration_seconds_bucket{func="fallback",name="hystrix-circuit",le="0.01"} 2
circuit_failure_duration_seconds_bucket{func="fallback",name="hystrix-circuit",le="0.025"} 2
circuit_failure_duration_seconds_bucket{func="fallback",name="hystrix-circuit",le="0.05"} 2
circuit_failure_duration_seconds_bucket{func="fallback",name="hystrix-circuit",le="0.1"} 2
circuit_failure_duration_seconds_bucket{func="fallback",name="hystrix-circuit",le="0.25"} 2
circuit_failure_duration_seconds_bucket{func="fallback",name="hystrix-circuit",le="0.5"} 2
circuit_failure_duration_seconds_bucket{func="fallback",name="hystrix-circuit",le="1"} 2
circuit_failure_duration_seconds_bucket{func="fallback",name="hystrix-circuit",le="2.5"} 2
circuit_failure_duration_seconds_bucket{func="fallback",name="hystrix-circuit",le="5"} 2
circuit_failure_duration_seconds_bucket{func="fallback",name="hystrix-circuit",le="10"} 2
circuit_failure_duration_seconds_bucket{func="fallback",name="hystrix-circuit",le="+Inf"} 2
circuit_failure_duration_seconds_sum{func="fallback",name="hystrix-circuit"} 1.6e-05
circuit_failure_duration_seconds_count{func="fallback",name="hystrix-circuit"} 2
circuit_failure_duration_seconds_bucket{func="run",name="hystrix-circuit",le="0.005"} 2
circuit_failure_duration_seconds_bucket{func="run",name="hystrix-circuit",le="0.01"} 2
circuit_failure_duration_seconds_bucket{func="run",name="hystrix-circuit",le="0.025"} 2
circuit_failure_duration_seconds_bucket{func="run",name="hystrix-circuit",le="0.05"} 2
circuit_failure_duration_seconds_bucket{func="run",name="hystrix-circuit",le="0.1"} 2
circuit_failure_duration_seconds_bucket{func="run",name="hystrix-circuit",le="0.25"} 2
circuit_failure_duration_seconds_bucket{func="run",name="hystrix-circuit",le="0.5"} 2
circuit_failure_duration_seconds_bucket{func="run",name="hystrix-circuit",le="1"} 2
circuit_failure_duration_seconds_bucket{func="run",name="hystrix-circuit",le="2.5"} 2
circuit_failure_duration_seconds_bucket{func="run",name="hystrix-circuit",le="5"} 2
circuit_failure_duration_seconds_bucket{func="run",name="hystrix-circuit",le="10"} 2
circuit_failure_duration_seconds_bucket{func="run",name="hystrix-circuit",le="+Inf"} 2
circuit_failure_duration_seconds_sum{func="run",name="hystrix-circuit"} 0.000570084
circuit_failure_duration_seconds_count{func="run",name="hystrix-circuit"} 2
afex/hystrix-go
Hystrix と名前に入っている通り、JavaのHystrixと同じように使用できる goroutineで実行される メトリクスを取る仕組みは組み込まれていない 最終コミットは2018年
slok/goresilience
サーキットブレーカーに限らず、resilliencyを高めるためのパターンをいくつか提供している Hystrixライク Prometheusで収集できる