Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Design pattern for embedding mruby into middleware

Design pattern for embedding mruby into middleware

A design and implementation to connect middleware
supporting Internet service with mruby

Ryosuke Matsumoto / Pepabo R&D Institute, GMO Pepabo, Inc.
2018.06.02 RubyKaigi2018

MATSUMOTO Ryosuke
PRO

June 02, 2018
Tweet

More Decks by MATSUMOTO Ryosuke

Other Decks in Technology

Transcript

  1. A design and implementation to connect middleware
    supporting Internet service with mruby
    Ryosuke Matsumoto / Pepabo R&D Institute, GMO Pepabo, Inc.
    2018.06.02 RubyKaigi2018
    Design pattern for embedding
    mruby into middleware

    View Slide

  2. • Chief engineer at GMO Pepabo, inc.
    • Chief researcher at Pepabo R&D Institute
    • Ph.D of Informatics, Kyoto University
    • my interests: Operation technology, Internet foundation
    technology, System programming, Highly integrated multi-
    tenant architecture, Hosting service, Cloud platform, C,
    mruby, Rust
    • Engineering => Technology <= Research
    2
    Ryosuke Matsumoto @matsumotory

    View Slide

  3. 3

    View Slide

  4. 4

    View Slide

  5. 1. Introduction of embedding mruby into
    middleware
    2. Design pattern for middleware
    1. init / exit
    2. each request
    3. non-blocking
    3. Conclusion
    5
    Table of Contents

    View Slide

  6. 1. Introduction of embedding
    mruby into middleware

    View Slide

  7. • System management for network, OS and middleware
    • Hosting service, Cloud platform service
    • operation technology for middleware written by C
    • Apache, nginx, dovecot, postfix, sendmail, bind, proftp…
    • want to write operation tools for middleware using perl
    • want to write extension module for middleware
    • each middleware dependency
    • Apache module, nginx module, dovecot plugin….
    7
    I’m a former web operation engineer

    View Slide

  8. met mruby in April 2012

    View Slide

  9. mruby / CRuby for middleware
    9
    NJEEMFXBSFJO$
    NSVCZ
    NJEEMFXBSFNFUIPE
    JONSVCZ
    NJEEMFXBSFGVODUJPOTJO$
    NJEEMFXBSFJO$3VCZ
    NJEEMFXBSFNFUIPE
    JO$3VCZ
    NSVCZGPSNJEEMFXBSF $3VCZGPSNJEEMFXBSF

    View Slide

  10. middleware configuration
    as code

    View Slide

  11. basically embed mruby into middleware
    11
    NJEEMFXBSFQSPDFTT
    [email protected]
    NSVCZCZUFDPEF
    NJEEMFXBSFGVODUJPOTJO$
    NSVCZ4DSJQUT
    lNJEEMFXBSFzXBTJNQMFNFOUFECZ$JOUIJTQSFTFOUBUJPO
    NBTUFS
    TFSWBOU

    View Slide

  12. • mod_mruby / ngx_mruby (http server extension)
    • dovecot-mruby-plugin (imap server extension)
    • pmilter (milter server)
    • Trusterd HTTP/2 Web Server
    • h2o_mruby (Initial implementation with v1.4)
    • other system tools: rcon, capcon, pfds, virtualing, ab-mruby
    • developed the greatest number of mrbgem in mgem-list
    • also received Ph.D of informatics
    12
    my developed middleware with mruby

    View Slide

  13. • middleware behavior scripting with mruby
    • middleware configuration as code
    • limit Ruby methods by mruby
    • dynamically control middleware by session parameters
    • cooperate with microservices
    • record a session data and utilize the data
    • implement Service Mesh functions
    • HTTP(S)ɾTCP/UDP stream
    13
    Why embed mruby into middleware

    View Slide

  14. • consider several viewpoints
    • memory management (allocate/free/leak)
    • performance
    • usability, operation / development technology
    • strategy for multi process / multi threading
    • ʮmruby = mrb_stateʯ in this presentation
    14
    How embed mruby into middleware

    View Slide

  15. Basic multi threading strategy

    View Slide

  16. Concurrency with native thread

    View Slide

  17. multi-threading strategy for mruby
    17
    QSPDFTT
    UISFBE
    [email protected]
    CZUFDPEF
    UISFBE
    [email protected]
    CZUFDPEF
    QSPDFTT
    [email protected]
    UISFBE
    CZUFDPEF
    UISFBE
    CZUFDPEF
    QSPDFTT
    [email protected]
    CZUFDPEF
    UISFBE
    UISFBE

    View Slide

  18. multi-threading strategy for mruby
    18
    QSPDFTT
    UISFBE
    [email protected]
    CZUFDPEF
    UISFBE
    [email protected]
    CZUFDPEF
    QSPDFTT
    [email protected]
    UISFBE
    CZUFDPEF
    UISFBE
    CZUFDPEF
    QSPDFTT
    [email protected]
    CZUFDPEF
    UISFBE
    UISFBE
    MPDL
    MPDL

    View Slide

  19. • The basic strategy is embedding mruby into each thread
    • lock between threads in single mrb_state is complicated
    • A cost of creating mrb_state is much higher than creating
    thread
    • The cost becomes bottleneck each request to
    middleware
    • We want to create mrb_state on init phase of middleware
    • control only bytecode each request
    19
    considerations

    View Slide

  20. • talk about design patterns for embedding mruby into
    middleware
    • try and error over and over again for 6 years
    • consider several viewpoints
    • memory management
    • performance
    • usability, operation / development technology
    20
    In this presentation

    View Slide

  21. 2. Design pattern for
    middleware

    View Slide

  22. 1.
    init / exit

    View Slide

  23. init: independent mrb_state
    23
    NBTUFSQSPDFTT
    XPSLFSQSPDFTT
    [email protected]
    [email protected]
    CZUFDPEF
    CZUFDPEF
    HFOFSBUFDPEFBOESVOPONBTUFSJOJU
    GPSL

    [email protected]
    [email protected]
    CZUFDPEF
    HFOFSBUFDPEFBOESVOPOXPSLFSJOJU
    [email protected]
    NVMUJQSPDFTTNPEFM

    View Slide

  24. init: independent mrb_state
    24
    NBTUFSQSPDFTT
    XPSLFSQSPDFTT
    [email protected]
    [email protected]
    CZUFDPEF
    CZUFDPEF
    GSFFDPEFPONBTUFSJOJU
    GPSL

    [email protected]
    [email protected]
    CZUFDPEF
    GSFFDPEFPOXPSLFSJOJU
    [email protected]
    NVMUJQSPDFTTNPEFM
    GSFF
    GSFF
    GSFF
    OPUIJOHUPEPPOXPSLFSBOENBTUFSFYJU

    View Slide

  25. • Advantages
    • mruby scripts are executed completely independently
    • can save memory
    • Disadvantages
    • can’t pass objects to a request phase
    • can’t share objects with each other script
    25
    init: independent mrb_state

    View Slide

  26. init: share mrb_state
    26
    NBTUFSQSPDFTT
    XPSLFSQSPDFTT
    [email protected]
    [email protected]
    CZUFDPEF
    CZUFDPEF
    CZUFDPEF
    HFOFSBUFDPEFBOESVOPONBTUFSJOJU
    POMZHFOFSBUFDPEFPOXPSLFSJOJU
    GPSL

    [email protected]
    NVMUJQSPDFTTNPEFM

    View Slide

  27. init: share mrb_state
    27
    NBTUFSQSPDFTT
    XPSLFSQSPDFTT
    [email protected]
    [email protected]
    CZUFDPEF
    CZUFDPEF
    CZUFDPEF
    GSFFDPEFPONBTUFSJOJU
    GPSL

    [email protected]
    NVMUJQSPDFTTNPEFM
    GSFFDPEFPOXPSLFSJOJU
    [email protected]
    OPUIJOHUPEPPOXPSLFSBOENBTUFSFYJU

    View Slide

  28. • Advantages
    • decrease a cost of creating mrb_state each script
    • can save memory
    • can share objects with each other script on init phase
    • Disadvantages
    • can’t pass objects to a request phase
    28
    init: share mrb_state

    View Slide

  29. init: share mrb_state with request phase
    29
    NBTUFSQSPDFTT
    XPSLFSQSPDFTT
    [email protected]
    [email protected]
    CZUFDPEF
    CZUFDPEF
    CZUFDPEF
    HFOFSBUFDPEFBOESVOPONBTUFSJOJU
    POMZHFOFSBUFDPEFPOXPSLFSJOJU
    [email protected]
    GPSL

    [email protected]
    NVMUJQSPDFTTNPEFM

    View Slide

  30. exit: share mrb_state with request phase
    30
    NBTUFSQSPDFTT
    XPSLFSQSPDFTT
    [email protected]
    [email protected]
    CZUFDPEF
    CZUFDPEF
    CZUFDPEF
    GSFFDPEFPONBTUFSFYJU
    GPSL

    [email protected]
    NVMUJQSPDFTTNPEFM
    GSFFDPEFPOXPSLFSFYJU
    [email protected]

    View Slide

  31. • Advantages
    • decrease a cost of creating mrb_state each script
    • can share objects with each other script on init phase
    • can pass objects to a request phase
    • use DB object which connect the DB at init phase
    • Disadvantages
    • use more memory than other init pattern
    • complicated memory management each request
    31
    init: share mrb_state with request phase

    View Slide

  32. 2.
    each request

    View Slide

  33. multi process model

    View Slide

  34. XPSLFSQSPDFTT
    request: independent mrb_state
    34
    XPSLFSQSPDFTT
    [email protected]
    CZUFDPEF
    [email protected]
    CZUFDPEF
    3FRVFTU
    XPSLFSQSPDFTT
    3FRVFTU
    3FTQPOTF
    3FTQPOTF
    [email protected]
    CZUFDPEF
    3FRVFTU
    [email protected]
    CZUFDPEF
    [email protected]
    CZUFDPEF
    GSFF
    GSFF
    [email protected]
    BOESVOCZUFDPEFFBDISFRVFTU
    *OJU 3FRVFTU 3FTQPOTF

    View Slide

  35. • Advantages
    • mruby scripts are executed completely independently
    • can manage memory easily and correctly
    • change script each request
    • Disadvantages
    • low performance because of creating mrb_state each
    request
    • can’t share objects with each other script each request
    35
    request: independent mrb_state

    View Slide

  36. request: shared mrb_state
    36
    XPSLFSQSPDFTT
    XPSLFSQSPDFTT
    3FRVFTU
    XPSLFSQSPDFTT
    3FRVFTU
    3FTQPOTF
    3FTQPOTF
    *OJU 3FRVFTU 3FTQPOTF
    [email protected] [email protected]
    CZUFDPEF
    CZUFDPEF
    [email protected]
    CZUFDPEF
    CZUFDPEF
    CZUFDPEF
    3FRVFTU
    BSFOB
    FYD
    BSFOB
    FYD
    BSFOB
    FYD
    DMFBOVQBSFOBBOEFYD
    PCKFDUTFBDISFRVFTU
    GSFF
    GSFF
    QBSTFTDSJQUBOEHFOFSBUFBOE
    SVOCZUFDPEFFBDISFRVFTU
    [email protected]
    POJOJUJBMJ[BUJPO

    View Slide

  37. • Advantages
    • can share objects with each other script each request
    and init phase
    • change script each request
    • Disadvantages
    • slightly low performance because of compiling
    • memory management is very complicated because of
    compiling and freeing bytecode each request while
    sharing mrb_state
    37
    request: independent mrb_state

    View Slide

  38. request: shared mrb_state and bytecode
    38
    XPSLFSQSPDFTT
    XPSLFSQSPDFTT
    3FRVFTU
    XPSLFSQSPDFTT
    3FTQPOTF
    *OJU 3FRVFTU 3FTQPOTF
    [email protected]
    CZUFDPEF
    CZUFDPEF
    CZUFDPEF
    [email protected]
    CZUFDPEF
    CZUFDPEF
    CZUFDPEF
    [email protected]
    CZUFDPEF
    CZUFDPEF
    CZUFDPEF
    3FRVFTU
    BSFOB
    FYD
    BSFOB
    FYD
    BSFOB
    FYD
    DMFBOVQBSFOBBOEFYDPCKFDUT
    FBDISFRVFTU
    GSFFDPEFDPOUFYU
    FBDISFRVFTU
    [email protected]
    QBSTFTDSJQUBOEHFOFSBUF
    CZUFDPEFPOJOJUJBMJ[BUJPO
    SVOCZUFDPEFFBDISFRVFTU

    View Slide

  39. • Advantages
    • high performance
    • can share objects with each other script each request
    and init phase
    • Disadvantages
    • can’t change script each request
    • memory management is a bit complicated
    39
    request: independent mrb_state

    View Slide

  40. Performance for request pattern
    40

    View Slide

  41. multi threading model

    View Slide

  42. multi-threading strategy for mruby
    42
    QSPDFTT
    UISFBE
    [email protected]
    CZUFDPEF
    UISFBE
    [email protected]
    CZUFDPEF
    QSPDFTT
    [email protected]
    UISFBE
    CZUFDPEF
    UISFBE
    CZUFDPEF
    QSPDFTT
    [email protected]
    CZUFDPEF
    UISFBE
    UISFBE

    View Slide

  43. XPSLFSQSPDFTT
    request: independent mrb_state
    43
    XPSLFSQSPDFTT
    XPSLFSQSPDFTT
    [email protected]
    BOESVOCZUFDPEFFBDISFRVFTU
    XPSLFSUISFBE
    XPSLFSUISFBE
    XPSLFSUISFBE
    [email protected]
    CZUFDPEF
    XPSLFSUISFBE
    XPSLFSUISFBE
    [email protected]
    CZUFDPEF
    XPSLFSUISFBE
    3FRVFTU 3FTQPOTF
    [email protected]
    CZUFDPEF 3FRVFTU
    GSFF
    *OJU 3FRVFTU 3FTQPOTF
    [email protected]
    CZUFDPEF
    3FRVFTU

    View Slide

  44. request: share mrb_state
    44
    XPSLFSQSPDFTT
    *OJU 3FRVFTU 3FTQPOTF
    XPSLFSQSPDFTT XPSLFSQSPDFTT
    XPSLFSUISFBE
    [email protected]
    BSFOB
    FYD
    XPSLFSUISFBE
    [email protected]
    BSFOB
    FYD
    XPSLFSUISFBE
    [email protected]
    CZUFDPEF
    BSFOB
    FYD
    XPSLFSUISFBE
    [email protected]
    BSFOB
    FYD
    XPSLFSUISFBE
    [email protected]
    CZUFDPEF
    BSFOB
    FYD
    XPSLFSUISFBE
    [email protected]
    CZUFDPEF
    BSFOB
    FYD
    3FTQPOTF
    3FRVFTU
    3FRVFTU
    DMFBOVQ
    BSFOBBOEFYD
    PCKFDUTFBDI
    SFRVFTU
    GSFF
    QBSTFTDSJQU
    BOEHFOFSBUF
    CZUFDPEFBOE
    SVOCZUFDPEF
    FBDISFRVFTU
    CZUFDPEF
    3FRVFTU
    [email protected][BUJPO

    View Slide

  45. request: share mrb_state and bytecode
    45
    XPSLFSQSPDFTT
    *OJU 3FRVFTU 3FTQPOTF
    XPSLFSQSPDFTT XPSLFSQSPDFTT
    XPSLFSUISFBE
    [email protected]
    CZUFDPEF
    BSFOB
    FYD
    CZUFDPEF
    XPSLFSUISFBE
    [email protected]
    CZUFDPEF
    BSFOB
    FYD
    CZUFDPEF
    XPSLFSUISFBE
    [email protected]
    CZUFDPEF
    BSFOB
    FYD
    CZUFDPEF
    XPSLFSUISFBE
    [email protected]
    CZUFDPEF
    BSFOB
    FYD
    CZUFDPEF
    XPSLFSUISFBE
    [email protected]
    CZUFDPEF
    BSFOB
    FYD
    CZUFDPEF
    XPSLFSUISFBE
    [email protected]
    CZUFDPEF
    BSFOB
    FYD
    CZUFDPEF
    3FTQPOTF
    3FRVFTU
    3FRVFTU
    DMFBOVQ
    BSFOBBOEFYD
    PCKFDUTFBDI
    SFRVFTU
    3FRVFTU
    GSFFDPEFDPOUFYU
    FBDISFRVFTU
    [email protected]
    QBSTFTDSJQUBOEHFOFSBUFCZUFDPEFPOJOJUJBMJ[BUJPO
    SVOCZUFDPEF
    FBDISFRVFTU

    View Slide

  46. • multi process model
    • share mrb_state and bytecode
    • mod_mruby, ngx_mruby, postfix-mruby, dovecot-
    mruby, trusterd HTTP/2 server
    • multi threading model
    • share mrb_state and bytecode
    • H2O, nghttpd
    • independent mrb_state
    • pmilter
    46
    Summary: each request pattern

    View Slide

  47. 3.
    non-blocking

    View Slide

  48. • want to accept as many requests simultaneously as possible
    in single process/thread (C10k)
    • want to use multi cpu core sufficiently
    • process blocking operation in non-blocking mode
    • File I/O, Network I/O, sleep…
    • monitor I/O state and notify status change like epoll()
    • generally implement suitable event loop for middleware
    48
    non-blocking middleware

    View Slide

  49. • mruby blocks middleware processing generally
    • bottleneck of performance when accepting multiple
    requests simultaneously
    • Other responses are delayed in proportion to the time of
    processing of mruby blocking
    49
    non-blocking middleware with mruby

    View Slide

  50. blocking each request with mruby
    50
    SFRVFTUQSPDFTTJOH NSVCZ
    NSVCZ
    SFRVFTUQSPDFTTJOH
    SFRVFTUQSPDFTTJOH NSVCZ DSFBUFSFTQPOTF
    DSFBUFSFTQPOTF
    DSFBUFSFTQPOTF
    TFOESFTQPOTF
    OPOCMPDLJOHNJEEMFXBSFMJLFOHJOYJOTJOHMFQSPDFTT
    SFDWSFRVFTU
    BUUIFTBNFUJNF

    View Slide

  51. blocking each request with mruby
    51
    SFRVFTU NSVCZ
    NSVCZ
    SFTQPOTF
    SFRVFTU
    SFRVFTU SFTQPOTF
    SFTQPOTF
    NSVCZ
    TFOESFTQPOTF
    SFDWSFRVFTU
    BUUIFTBNFUJNF
    Other responses are delayed in proportion to the time of processing of mruby blocking
    OPOCMPDLJOHNJEEMFXBSFMJLFOHJOYJOTJOHMFQSPDFTT

    View Slide

  52. 52

    View Slide

  53. non-blocking each request with mruby
    53
    SFRVFTU SFTQPOTF
    SFRVFTU
    SFRVFTU SFTQPOTF
    SFTQPOTF
    TFOESFTQPOTF
    SFDWSFRVFTU
    BUUIFTBNFUJNF
    CMPDLJOH
    PQFSBJUPO
    NSVCZ
    CMPDLJOH
    PQFSBJUPO
    NSVCZ
    NSVCZ
    CMPDLJOH
    PQFSBJUPO
    OPOCMPDLJOHNJEEMFXBSFMJLFOHJOYJOTJOHMFQSPDFTT

    View Slide

  54. 54

    View Slide

  55. • change a blocking method of mruby to non-blocking
    • suspend mruby processing until the blocking method is
    completed
    • return to event loop of middleware from mruby
    • resume mruby processing by callback func in event loop
    55
    non-blocking middleware with mruby

    View Slide

  56. 3VCZ4DSJQUʢ3VCZXPSMEʣ
    1SPD
    'JCFSSFTVNF
    non-blocking each request with mruby
    56
    NJEEMFXBSF $XPSME

    [email protected]
    'JCFS
    3VCZCZUFDPEF
    JODMVEFECMPDLJOH
    NFUIPE
    DGVODPGCMPDLJOHNFUIPE
    SVOCMPDLJOHPQFSBUJPOXJUIOPOCMPDLJOHNPEF
    [email protected]@ZJFME
    GSPN$BOETFUDBMMCBDL
    DGVODUPFWFOUMPPQPGNJEEMFXBSF
    DGVODPGNJEEMFXBSFPOFWFOUMPPQ
    QSPDFTTPUIFSSFRVFTUPOFWFOUMPPQ
    DBMMCBDLDGVOD
    SVOSFTVNFCZSVOOJOHQSPDPCKFDUGSPN$
    [email protected]
    SVOQSPDPCKFDUGSPN$










    $VSSFOUNSVCZOPOCMPDLJOHNPEFM
    3FRVFTU

    View Slide

  57. My homework of RubyKaigi 2018
    57
    Show me your ideal design of non-blocking
    model using Fiber for middleware
    embedding mruby.

    View Slide

  58. 3VCZ4DSJQUʢ3VCZXPSMEʣ
    non-blocking each request with mruby
    58
    NJEEMFXBSF $XPSME

    [email protected]
    3VCZCZUFDPEFJODMVEFE
    CMPDLJOHNFUIPEBOE'JCFS
    DGVODPGCMPDLJOHNFUIPE
    SVOCMPDLJOHPQFSBUJPOXJUIOPOCMPDLJOHNPEF
    [email protected]@ZJFME
    GSPN$BOETFUDBMMCBDL
    DGVODUPFWFOUMPPQPGNJEEMFXBSF
    DGVODPGNJEEMFXBSFPOFWFOUMPPQ
    QSPDFTTPUIFSSFRVFTUPOFWFOUMPPQ
    DBMMCBDLDGVOD
    [email protected]@SFTVNF
    GSPN$
    SFTFU'JCFSDPOUFYUUP

    [email protected]
    SVOpCFSPCKFDU
    [email protected]@SFTVNF
    GSPN$










    NZ*EFBMNSVCZOPOCMPDLJOHNPEFM
    3FRVFTU
    $VSSFOUNSVCZDBUDIFTTFHGBVMU

    View Slide

  59. non-blocking sleep example
    of ngx_mruby v2

    View Slide

  60. non-blocking sleep sample script
    60

    View Slide

  61. non-blocking sleep sample script
    61

    View Slide

  62. wrapped Ruby script by Fiber
    62

    View Slide

  63. wrapped Ruby script by fiber
    63

    View Slide

  64. run fiber object
    64
    SFUVSOUPFWFOUMPPQXIFOpCFSJTBMJWJOH

    View Slide

  65. blocking method (Nginx::Async.sleep)
    65
    QSPDDFTTPUIFSSFRVFTUT
    VOUJMDBMMCBDLGVODUJPO

    View Slide

  66. callback handler from event loop
    66

    View Slide

  67. now supports non-blocking
    http[s] client of ngx_mruby v2
    in RubyKaigi 2018 !!

    View Slide

  68. 68

    View Slide

  69. Special thanks for v2 developers
    69
    !QZBNB [email protected]

    View Slide

  70. 3. Conclusion

    View Slide

  71. • Why / How embed mruby into middleware
    • connect services dynamically and programmably
    • design pattern for embedding mruby into middleware
    • init /exit
    • each request
    • blocking / non-blocking
    • We will release ngx_mruby v2 in the near future
    • Happy hacking mruby!
    71
    Conclusion

    View Slide