ScalaMatsuri 2016 ランチタイム LT の発表資料です。 Scala 標準ライブラリの Future にリトライ機能や Circuit Breaker 機能を導入するライブラリ、Failurewall の紹介です。
https://2016.scalamatsuri.org/ https://github.com/failurewall/failurewall https://qiita.com/okumin/items/d7a108ea36f3ad2e3882
Ͱಋೖʂ'BJMVSFXBMMͰোରࡦ@okumin
View Slide
I am @okumin.ß IUUQTUXJUUFSDPNPLVNJOß IUUQTHJUIVCDPNPLVNJOß IUUQRJJUBDPNPLVNJOß IUUQCMPHPLVNJODPN
akka-persistence-sql-asyncß "LLBQFSTJTUFODFͷϓϥάΠϯß 4DBMJLF+%#$"TZODΛͬͯ࡞ͬͨß IUUQTHJUIVCDPNPLVNJOBLLBQFSTJTUFODFTRMBTZOD
scalactureß 4DBMBͰ༷ʑͳσʔλߏΛ࣮͍ͨ͠ϥΠϒϥϦß IUUQTHJUIVCDPNPLVNJOTDBMBDUVSF
ainterfaceß "LLBͷ্Ͱ&SMBOHOPEF͕࡞ΕΔϥΠϒϥϦß IUUQTHJUIVCDPNBJOUFSGBDFBJOUFSGBDF
ґଘγεςϜͱো
8FC ΞϓϦ3FEJT.Z42-&MBTUJDTFBSDI5XJUUFS'BDFCPPL
Failurewall
Failurewallß ΤϥʔॲཧΛγϯϓϧʹऔΓѻ͏ͨΊͷϥΠϒϥϦß )ZTUSJYʹΠϯεύΠϠ͞Εͨß IUUQTHJUIVCDPNGBJMVSFXBMMGBJMVSFXBMM
͍ํtrait HTTPClient { def get(url: String): Future[HTTPResponse] } val client: HTTPClient = ??? // ԿΒ͔ͷΤϥʔॲཧΛߦ͏Failurewall val wall: Failurewall[HTTPResponse, HTTPResponse] = ??? val actual: Future[HTTPResponse] = wall.call { client.get("https://twitter.com/okumin") }
༷ʑͳน
Retryß Ұ࣌తͳΤϥʔϦτϥΠʹΑΔϦΧόϦʔ͕༗ޮϚΠΞϓϦέʔγϣϯ 5XJUUFS
Retryval system = ActorSystem("mofu") val strategy = ExponentialBackoffStrategy( minBackoff = 1.seconds, maxBackoff = 5.seconds ) val retry = AkkaRetryFailurewall[HTTPResponse]( maxTrialTimes = 5, strategy, system.scheduler, system.dispatcher )
Semaphoreß ಉҰϦιʔεͷಉ࣌༻Λ੍ޚϚΠΞϓϦέʔγϣϯ 5XJUUFS
Semaphoreval executor: ExecutionContext = ??? val semaphore = StdSemaphoreFailurewall[HTTPResponse]( permits = 128, executor )
Circuit Breakerß ґଘγεςϜͷҾ͘োʹରॲß োΛݕ͢Δͱݺͼग़͠ΛఘΊ͙ͯ͢ʹΤϥʔΛฦ͢ GBJMGBTU$-04&%ਖ਼ৗϞʔυ)"-'01&/෮چ֬ೝϞʔυ01&/GBJMGBTUϞʔυ
Circuit Breakerval system = ActorSystem("mofu") val circuitBreaker = AkkaCircuitBreakerFailurewall[HTTPResponse]( system.scheduler, maxFailures = 16, callTimeout = 5.seconds, resetTimeout = 10.seconds, system.dispatcher )
Composableß ͏Կා͘ͳ͍val retry: Failurewall[HTTPResponse, HTTPResponse] = ??? val semaphore: Failurewall[HTTPResponse, HTTPResponse] = ??? val circuitBreaker: Failurewall[HTTPResponse, HTTPResponse] = ??? circuitBreaker compose semaphore compose retry
Λ͍ͩ͘͞ß ϓϧϦΫେܴß IUUQTHJUIVCDPNGBJMVSFXBMMGBJMVSFXBMM