$30 off During Our Annual Pro Sale. View Details »

5分で導入!Failurewall で障害対策 / Failurewall - ScalaMatsuri 2016

5分で導入!Failurewall で障害対策 / Failurewall - ScalaMatsuri 2016

ScalaMatsuri 2016 ランチタイム LT の発表資料です。
Scala 標準ライブラリの Future にリトライ機能や Circuit Breaker 機能を導入するライブラリ、Failurewall の紹介です。

https://2016.scalamatsuri.org/
https://github.com/failurewall/failurewall
https://qiita.com/okumin/items/d7a108ea36f3ad2e3882

okumin

July 03, 2019
Tweet

More Decks by okumin

Other Decks in Programming

Transcript

  1. ෼Ͱಋೖʂ
    'BJMVSFXBMMͰো֐ରࡦ
    @okumin

    View Slide

  2. I am @okumin.
    ß 
    IUUQTUXJUUFSDPNPLVNJO
    ß 
    IUUQTHJUIVCDPNPLVNJO
    ß 
    IUUQRJJUBDPNPLVNJO
    ß 
    IUUQCMPHPLVNJODPN

    View Slide

  3. akka-persistence-sql-async
    ß 
    "LLBQFSTJTUFODFͷϓϥάΠϯ
    ß 
    4DBMJLF+%#$"TZODΛ࢖ͬͯ࡞ͬͨ
    ß 
    IUUQTHJUIVCDPNPLVNJOBLLBQFSTJTUFODFTRMBTZOD

    View Slide

  4. scalacture
    ß 
    4DBMBͰ༷ʑͳσʔλߏ଄Λ࣮૷͍ͨ͠ϥΠϒϥϦ
    ß 
    IUUQTHJUIVCDPNPLVNJOTDBMBDUVSF

    View Slide

  5. ainterface
    ß 
    "LLBͷ্Ͱ&SMBOHOPEF͕࡞ΕΔϥΠϒϥϦ
    ß 
    IUUQTHJUIVCDPNBJOUFSGBDFBJOUFSGBDF

    View Slide

  6. ґଘγεςϜͱো֐

    View Slide

  7. 8FC ΞϓϦ
    3FEJT
    .Z42-
    &MBTUJDTFBSDI
    5XJUUFS
    'BDFCPPL

    View Slide

  8. 8FC ΞϓϦ
    3FEJT
    .Z42-
    &MBTUJDTFBSDI
    5XJUUFS
    'BDFCPPL

    View Slide

  9. Failurewall

    View Slide

  10. Failurewall
    ß 
    ΤϥʔॲཧΛγϯϓϧʹऔΓѻ͏ͨΊͷϥΠϒϥϦ
    ß 
    )ZTUSJYʹΠϯεύΠϠ͞Εͨ
    ß 
    IUUQTHJUIVCDPNGBJMVSFXBMMGBJMVSFXBMM

    View Slide

  11. ࢖͍ํ
    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")  
    }  

    View Slide

  12. ༷ʑͳน

    View Slide

  13. Retry
    ß 
    Ұ࣌తͳΤϥʔ͸ϦτϥΠʹΑΔϦΧόϦʔ͕༗ޮ
    ϚΠΞϓϦέʔγϣϯ 5XJUUFS

    View Slide

  14. Retry
    val  system  =  ActorSystem("mofu")  
    val  strategy  =  ExponentialBackoffStrategy(  
       minBackoff  =  1.seconds,  
       maxBackoff  =  5.seconds  
    )  
    val  retry  =  AkkaRetryFailurewall[HTTPResponse](  
       maxTrialTimes  =  5,  
       strategy,  
       system.scheduler,  
       system.dispatcher  
    )  

    View Slide

  15. Semaphore
    ß 
    ಉҰϦιʔεͷಉ࣌࢖༻਺Λ੍ޚ
    ϚΠΞϓϦέʔγϣϯ 5XJUUFS

    View Slide

  16. Semaphore
    val  executor:  ExecutionContext  =  ???  
    val  semaphore  =  StdSemaphoreFailurewall[HTTPResponse](  
       permits  =  128,  
       executor  
    )  

    View Slide

  17. Circuit Breaker
    ß 
    ґଘγεςϜͷ௕Ҿ͘ো֐ʹରॲ
    ß 
    ো֐Λݕ஌͢Δͱݺͼग़͠ΛఘΊ͙ͯ͢ʹΤϥʔΛฦ͢ GBJMGBTU

    $-04&%
    ਖ਼ৗϞʔυ
    )"-'01&/
    ෮چ֬ೝϞʔυ
    01&/
    GBJMGBTUϞʔυ

    View Slide

  18. Circuit Breaker
    val  system  =  ActorSystem("mofu")  
    val  circuitBreaker  =  AkkaCircuitBreakerFailurewall[HTTPResponse](  
       system.scheduler,  
       maxFailures  =  16,  
       callTimeout  =  5.seconds,  
       resetTimeout  =  10.seconds,  
       system.dispatcher  
    )  

    View Slide

  19. Composable
    ß 
    ΋͏Կ΋ා͘ͳ͍
    val  retry:  Failurewall[HTTPResponse,  HTTPResponse]  =  ???  
    val  semaphore:  Failurewall[HTTPResponse,  HTTPResponse]  =  ???  
    val  circuitBreaker:  Failurewall[HTTPResponse,  HTTPResponse]  =  ???  
    circuitBreaker  compose  semaphore  compose  retry  

    View Slide

  20. ੕Λ͍ͩ͘͞
    ß 
    ϓϧϦΫ΋େ׻ܴ
    ß 
    IUUQTHJUIVCDPNGBJMVSFXBMMGBJMVSFXBMM

    View Slide