読者です 読者をやめる 読者になる 読者になる

おくみん公式ブログ

おくみん公式ブログ

Failurewall 0.1.1 をリリースしました #scala

f:id:okumin:20170320170958p:plain

scala.concurrent.Future を安全便利に扱うためのライブラリ、Failurewall の新バージョンをリリースしました。 テストコードやビルド設定のリファクタリングを除くと、変更は以下の二点です。

変更点

StopwatchFailurewall

Future が完了するまでの経過時間を計測することができます。

val failurewall = StopwatchFailurewall[String](executionContext)
val result = failurewall.call(Future {
  Thread.sleep(100)
  "mofu"
})
result.toString // Success((Success(mofu),107716546 nanoseconds))

成功時には上記のように (Success[A], FiniteDuration) が、失敗時には (Failure[A], FiniteDuration) が返ります。

val result = failurewall.call(Future {
  Thread.sleep(100)
  throw new RuntimeException("mofu")
})
result.toString // Success((Failure(java.lang.RuntimeException: mofu),105863733 nanoseconds))

実行に時間がかかっている処理をログを出力したり、

failurewall.call(Future {
  Thread.sleep(3000)
  "mofu"
}).andThen {
  case Success((_, time)) if time >= 3000.millis =>
    logger.warn(s"It took $time to do mofu")
}

ありえんくらいレスポンスが遅い場合に CircuitBreaker の失敗カウンタを増加させたりといった使い方ができます。

val stopwatchFailurewall = StopwatchFailurewall[String](executionContext)
val akkaCircuitBreakerFailurewall = AkkaCircuitBreakerFailurewall.withFeedback[(Try[String], FiniteDuration)](akkaCircuitBreaker, executionContext) {
  case Success((Success(_), time)) if time < 3000.millis => Available
  case Success((Success(_), _)) => Unavailable
  case Success((Failure(_), _)) => Unavailable
  case Failure(_) => throw new AssertionError("never happens")
}
val failurewall = akkaCircuitBreakerFailurewall compose stopwatchFailurewall

Scala 2.12 対応

Failurewallserious scala project なので、xuwei-k さんが対応してくれました

関連リンク