サーキットブレーカー付きの非同期RESTクライアントを作ってみた

Lagomを触っていて、サーキットブレーカー付きのHTTPクライアントがあるといろんなフレームワークと組み合わせて使えて便利かも、と思ったのでScala用のものを作ってみました。

github.com

RESTクライアントとしての基本的な使い方はこんな感じ。

import restbreaker._

val client = new AHCServiceClient()

// Assemble POST request which send JSON as request body
val request = Request.post("http://localhost:9000/api/blog")
  .withBody(BlogPost(...))

// Send request
val f = client.call[Result](request) recover { 
  case e: Exception => Result(false)
}

f.foreach { result: Result =>
  if(result.success){
    println("success")
  } else {
    println("failure")
  }
}

サーキットブレーカーを有効にするにはクライアントをラップします。

val client = new CircuitBreaker(new AHCServiceClient(), 
  callTimeout = 1000, maxFailures = 5, resetTimeout = 30000)

callTimeoutを過ぎると即座にエラーを返します。また、エラー回数がmaxFailuresを超えるとresetTimeoutで指定した期間はサーバにアクセスせず即時エラーを返し続けるモードになります。resetTimeoutを過ぎるとサーバへのアクセスにリトライし、成功すれば通常モードに、失敗したら再度resetTimeoutが経過するまで即時エラーモードを継続します。

まだかなり雑な感じなのでもう少し作り込んだらMavenセントラルから使えるようにしたいと思います。