Lagomを触っていて、サーキットブレーカー付きのHTTPクライアントがあるといろんなフレームワークと組み合わせて使えて便利かも、と思ったのでScala用のものを作ってみました。
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セントラルから使えるようにしたいと思います。