Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
PHPアプリケーションのスケーラビリティと 信頼性を革新する nginx+ngx_mrubyとGoの融合
Search
Kazuhiko Yamashita
March 07, 2024
Programming
2
280
PHPアプリケーションのスケーラビリティと 信頼性を革新する nginx+ngx_mrubyとGoの融合
PHPerKaigi2024でお話しました。
Kazuhiko Yamashita
March 07, 2024
Tweet
Share
More Decks by Kazuhiko Yamashita
See All by Kazuhiko Yamashita
Site Reliability Engineering for GMO
pyama86
8
1.1k
ペパボOpenTelemetry革命
pyama86
0
690
ChatGPTの活用を体現し、 組織に浸透する技術
pyama86
1
880
リリースフラグと プログレッシブデリバリーを活用した 安全なWEBアプリケーションデプロイ
pyama86
2
160
PHPerのためのOpenTelemetry入門
pyama86
1
210
生成AIで仕事を もっとおもしろくする事例と詳解
pyama86
0
140
Goで実装された高速な 仮想待合室サーバの実装と詳解
pyama86
15
6.9k
CNDF2023前夜祭 - 玄界灘のクラウドネイティブなデータ基盤運用の実践
pyama86
1
430
若者とGPTのすべて
pyama86
0
430
Other Decks in Programming
See All in Programming
Git Rebase
bkuhlmann
11
1.6k
What We Can Learn From OSS
inouehi
0
430
初心者のためのRubyKaigi入門/RubyKaigi Introduction
a_matsuda
7
1.2k
SIMD Parallel Programming with the Vector API
josepaumard
0
210
Compose-View Interop in Practice (mDevCamp 2024)
stewemetal
0
150
Ruby Pattern Matching
bkuhlmann
0
930
Git Lint
bkuhlmann
4
750
PHP8.3の機能を振り返る / Review of PHP 8.3 features
seike460
PRO
1
120
禅の心を手に入れよ
eltociear
1
230
見た目から始める生産性向上
ikumatadokoro
8
1.1k
障害対応を起点としたもっといい開発と運用のサイクル作りのためにできること / Hatena Enginner Seminar #29
polamjag
0
300
はてなにおける CSS Modules、及び CSS Modules に足りないもの / CSS Modules in Hatena, and CSS Modules missing parts
mizdra
7
960
Featured
See All Featured
Put a Button on it: Removing Barriers to Going Fast.
kastner
58
3.1k
A Tale of Four Properties
chriscoyier
152
22k
Ruby is Unlike a Banana
tanoku
96
10k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
501
140k
A Modern Web Designer's Workflow
chriscoyier
689
190k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
41
4.4k
How To Stay Up To Date on Web Technology
chriscoyier
782
250k
Statistics for Hackers
jakevdp
790
220k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
117
18k
Art, The Web, and Tiny UX
lynnandtonic
290
19k
What’s in a name? Adding method to the madness
productmarketing
PRO
17
2.7k
Product Roadmaps are Hard
iamctodd
45
9.7k
Transcript
PHPΞϓϦέʔγϣϯͷεέʔϥϏϦςΟͱ ৴པੑΛֵ৽͢Δ nginx+ngx_mrubyͱGoͷ༥߹ ʙϚΠΫϩαʔϏείΞμϯϓڵຯ͋ΔΜͰ͚͢Ͳฤʙ
ࢁԼ!QZBNB (.0ϖύϘٕज़ج൫νʔϜ γχΞɾϓϦϯγύϧ ɹΩϟϯϓɺཱྀߦɺώϧτϯ८ΓɺιϫχΤ८Γ 1SPYZαʔό։ൃɺ0QFO5FMFNFUSZ
ࠓ͢͜ͱ 1. PHPΞϓϦέʔγϣϯͷεέʔϥϏϦςΟ 2. Ծ߹ࣨ 3. νϡʔχϯάͱिץӡ༻࣮
PHPΞϓϦέʔγϣϯͷ εέʔϥϏϦςΟ
PHPΞϓϦέʔγϣϯͷεέʔϥϏϦςΟ LAMPελοΫ(Linux, Apache, MySQL, PHP) LEMPελοΫ(Linux, nginx (Engine-X), MySQL/MariaDB, PHP)
ϚΠΫϩαʔϏεΞʔΩςΫνϟ αʔόʔϨεΞʔΩςΫνϟ ݱͰ࠾༻͞ΕΔΑ͏ͳΞʔΩςΫνϟPHPͰ࣮ݱͰ͖Δ
PHPΞϓϦέʔγϣϯͷεέʔϥϏϦςΟ ࡢࠓͷWEB։ൃͰඞཁͳཁ݅Λຬ͍ͨͯ͠Δ දతWEBϑϨʔϜϫʔΫ ϛυϧΣΞ ίϛϡχςΟ Laravel,CakePHP, Symfony Database,NoSQL,CloudSDK https://www.php.net/conferences/index.php
ΧϯϑΝϨϯεͷۙ ͕Crazy Japanese 16 5
PHPΞϓϦέʔγϣϯͷεέʔϥϏϦςΟ ύϑΥʔϚϯεଟݴޠͱൺֱͯ͠े https://benchmarksgame-team.pages.debian.net/benchmarksgame/fastest/php-python3.html https://benchmarksgame-team.pages.debian.net/benchmarksgame/fastest/php-ruby.html ※1 NମʢN-body problemʣɺཧֶʹ͓͍ͯɺޓ͍ʹॏྗͳͲͷྗͰӨڹ͠߹͏NݸͷମͷӡಈΛ༧ଌ͢ΔͰ͢ɻ ※2 ֤ݴޠͷ࣮݁ՌҾ༻ݩͷThe Computer
Language Benchmarks Gameͷ௨ΓͰɺݴޠͷ༏ྼͰͳ͘૬ରతʹ ੑೳ͕ेͱ͍͏͜ͱΛ͜ͷεϥΠυҙਤ͍ͯ͠·͢
ϘτϧωοΫ Ͳ͜ʹ͋Δͷ͔ʁ
Α͋͘ΔPHPΞϓϦέʔγϣϯͷϘτϧωοΫ • CPUϝϞϦͷϦιʔεෆ • σʔλετΞ(N+1ͳͲͷ࣮՝ؚΉ) • SaaS
Α͋͘ΔPHPΞϓϦέʔγϣϯͷϘτϧωοΫ • CPUϝϞϦͷϦιʔεෆ → εέʔϧΞοϓɾΞτ • σʔλετΞ(N+1ͳͲͷ࣮՝ؚΉ) → ؤுΔ •
SaaS → ࣌ͱ߹ͱɺ࣌ͷӡɺ࣌ʹͲ͏ʹͳΒͳ͍
େਓ͙ͬͯ͢ϨʔτϦϛοτͬͯ ݴ͏͚ͲɺϢʔβʔ͔ΒݟͨΒ མͪͯΔͷͱҰॹͩΑͶʙ
Ծ߹ࣨ
Ծ߹ࣨ ΞΫηεॱͰͪߦྻΛܗͯ͠ɺ ॱ൪ʹϢʔβʔΛαΠτʹҊ
߹ࣨAPIͷ֓ཁ (PͰ࣮͞Εͨ)551αʔό https://github.com/pyama86/waitingroom go on-memory cache redis query query response
response ଟͷߴͳσʔλετΞΛར༻ͯ͠ɺߴʹ࣮ߦ
߹ࣨͷঢ়ଶભҠ ىಈ ىಈத ղআ αΠτͷաΞΫηεΛܖػʹαΠτʹର͢Δ ߹ࣨΛىಈ͢Δ աΞΫηε͕མͪண͍ͨΒɺ ௨ৗ௨ΓΞΫηε͕Ͱ͖Δ ߹͕ࣨىಈதɺΞΫηεՄೳͳॱ൪ʹͳΔ·Ͱɺ ʮ̋ਓͪʯͱ߹ࣨͷը໘͕දࣔ͞ΕΔ
߹ࣨͷجຊػೳ ୯Ґ࣌ؒ͋ͨΓɺͲΕ͘Β͍ͷϢʔβʔΛΞΫηεՄೳʹ͢Δ͔ ΞΫηεՄೳ࣌ؒͲΕ͘Β͍͔ʁ ྫ:1͋ͨΓ50ΫϥΠΞϯτଓΛڐՄ͢Δ ྫ:ڐՄ͞ΕͨΫϥΠΞϯτڐՄޙɺ10ؒΞΫηεՄೳ
ཧػೳॆ࣮ ىಈ࣌ʹSlack௨ɺཧը໘ఏڙ https://github.com/cam-inc/viron
https://youtu.be/oIw4m5cT5YA?si=IAAo4uzhykxBkkgO
ngx_mruby MPDBUJPOIFMMP\ NSVCZ@DPOUFOU@IBOEMFS@DPEF /HJOYFDIP)FMMP8PSME ^ OHJOYͷ͋ΒΏΔΠϕϯτʹϑοΫͯ͠ɺNSVCZͷίʔυΛ࣮ߦ͠ɺ ϓϩάϥϚϒϧʹτϥϑΟοΫίϯτϩʔϧग़དྷΔ https://github.com/matsumotory/ngx_mruby
߹ࣨΞʔΩςΫνϟͷ֓ཁ Waiting Room ngx_mruby Client Origin 1.ϦΫΤετ 2.ىಈ͞Ε͍ͯΔ͔ʁ 3.ະىಈ͔ ڐՄࡁΈΫϥΠΞϯτ
4.ϦΫΤετ 5.Ϩεϙϯε 6.Ϩεϙϯε OHY@NSVCZ͔Β߹ࣨ"1*ʹ )551ϦΫΤετͯ͠ঢ়ଶ֬ೝ
߹ࣨىಈܖػ location / { limit_req zone=example nodelay; limit_req_status 512; error_page
512 =200 @waitingroom; } ϨʔτϦϛοτʹ֘ͨ͠Β εςʔλε512ͰΤϥʔѻ͍ʹ͔ͯ͠Βɺ εςʔλεΛ200ʹॻ͖͑ͯ ϦμΠϨΫτ OHJOYͷSBUFMJNJUNPEVMFΛར༻͠ɺ աΞΫηεΛݕ
߹ࣨىಈܖػ location @waitingroom { mruby_rewrite_handler enable_waitingroom.rb; proxy_pass origin_backend/$request_uri; internal; }
location ~ ^/queues { proxy_pass waitingroom; internal; } ߹ࣨAPImrubyͰ HTTPܦ༝Ͱίʔϧͯ͠ɺ ߹ࣨΛىಈ͢Δ
߹ࣨىಈܖػ 1.ϊϯϒϩοΩϯάʹϦΫΤετ 2.੍ݶதͰॱ൪ͪঢ়ଶͳΒ503 3.੍ݶ͞Εͯͳ͚ΕόοΫΤϯυϓϩΩγ
ngx_http_subrequest location / { subrequest /subrequest } location /subreqest {
puts "hello" } # http://localhost/ => hello ͋ΔϩέʔγϣϯʹདྷͨϦΫΤετΛ ଞͷϩέʔγϣϯʹϊϯϒϩοΩϯάʹ ϦΫΤετͯ͠ར༻͢Δ
ϊϯϒϩοΩϯά
nginxͱϊϯϒϩοΩϯά ϒϩοΩϯάI/Oͷྫ DMJFOU DMJFOU XFCTFSWFS originA originB 1.ϦΫΤετ
nginxͱϊϯϒϩοΩϯά ϒϩοΩϯάI/Oͷྫ DMJFOU DMJFOU XFCTFSWFS originA originB 1.ϦΫΤετ 2.ϦΫΤετ
nginxͱϊϯϒϩοΩϯά ϒϩοΩϯάI/Oͷྫ DMJFOU DMJFOU XFCTFSWFS originA originB 1.ϦΫΤετ 2.ϦΫΤετ 3.ϦΫΤετ
nginxͱϊϯϒϩοΩϯά ϒϩοΩϯάI/Oͷྫ DMJFOU DMJFOU XFCTFSWFS originA originB 1.ϦΫΤετ 2.ϦΫΤετ 3.ϦΫΤετ
4.Ϩεϙϯε
nginxͱϊϯϒϩοΩϯά ϒϩοΩϯάI/Oͷྫ DMJFOU DMJFOU XFCTFSWFS originA originB 1.ϦΫΤετ 2.ϦΫΤετ 3.ϦΫΤετ
4.Ϩεϙϯε 5.Ϩεϙϯε ઌߦͷϦΫΤετྃ·Ͱ ͨ͞ΕΔ
nginxͱϊϯϒϩοΩϯά ϊϯϒϩοΩϯάI/Oͷྫ DMJFOU DMJFOU OHJOY originA originB 1.ϦΫΤετ
nginxͱϊϯϒϩοΩϯά ϊϯϒϩοΩϯάI/Oͷྫ DMJFOU DMJFOU OHJOY originA originB 1.ϦΫΤετ 2.ϦΫΤετ
nginxͱϊϯϒϩοΩϯά ϊϯϒϩοΩϯάI/Oͷྫ DMJFOU DMJFOU OHJOY originA originB 1.ϦΫΤετ 2.ϦΫΤετ 3.ϦΫΤετ
nginxͱϊϯϒϩοΩϯά ϊϯϒϩοΩϯάI/Oͷྫ DMJFOU DMJFOU OHJOY originA originB 1.ϦΫΤετ 2.ϦΫΤετ 3.ϦΫΤετ
4.ϦΫΤετ ઌߦͷϦΫΤετྃΛ ͨͣʹଞͷॲཧ͕Ͱ͖Δ
nginxͱϊϯϒϩοΩϯά mrubyϦΫΤετϨεϙϯεͷॲཧͷҰ෦ͱ࣮ͯ͠ߦ DMJFOU DMJFOU OHJOY originA originB 1.ϦΫΤετ ϦΫΤετΛड͚͚ͨͱ͖ ͳͲͷॲཧͷҰ෦ͱͯ͠
mruby͕࣮ߦ͞Ε͍ͯΔ
mrubyϒϩοΩϯάͯ͠͠·͏ nginxϊϯϒϩοΩϯάI/O͕ͩmrubyͰߟྀ͞Ε͍ͯͳ͍ SFRVFTU SFRVFTU SFRVFTU NSVCZ NSVCZ NSVCZ SFTQPOTF SFTQPOTF
SFTQPOTF XPSLFS ngx_mrubyʹ͓͚Δmruby࣮ߦ͕ϒϩοΫ͞ΕΔͱ͍͏ҙຯͰ͢
Nginx::Async::HTTP.sub_request )551ϦΫΤετͱಉ࣌ʹϒϩοΫΛ։์͠ɺ Ϩεϙϯε࣌ʹίʔϧόοΫΛड͚औΓ࠶։ SFRVFTU SFRVFTU NSVCZ SFTQPOTF SFTQPOTF NSVCZ TVCSFRFTU
3FRVFTU 3FTQPOTF
sub_requestΛ༻͍Δ͜ͱͰ ߴͳAPI࣮ߦΛ࣮ݱ Waiting Room ngx_mruby Client Origin sub_requestͰ ඇಉظϦΫΤετͳͷͰ ύϑΥʔϚϯεͷӨڹ͕গͳ͍
νϡʔχϯάͱ िץӡ༻࣮
νϡʔχϯάͱिץӡ༻࣮ 1.ຒ·Διέοτ 2.ͦͦ
ຒ·Διέοτ
߹ࣨͷϦΫΤετ͕ࣦഊ͢ΔΑ͏ʹͳͬͨ Waiting Room ngx_mruby Client Origin ϐʔΫλΠϜʹ ߹ࣨͷAPI͕ Connection Refused
DBUQSPDTZTOFUJQWJQ@MPDBM@QPSU@SBOHF TIME WAITͷେྔൃੜ ιέοτͷঢ়ଶ͕։์͕ؒʹ߹Θͣɺ৽ن௨৴͕ෆՄೳ OFUTUBUBOcHSFQ5*.&@8"*5cXDM Ұൠతͳ-JOVYαʔόσϑΥϧτͩͱ*1͋ͨΓ ϙʔτ͔͠ར༻Ͱ͖ͳ͍
߹ࣨʹେྔͷϦΫΤετ͕ߦΘΕΔ Waiting Room ngx_mruby Client Origin ߹ࣨͷىಈ֬ೝ͕ શϦΫΤετߦΘΕΔͷͰ ຖճ৽نଓ͞ΕΔ LFFQBMJWFޮ͍ͯͳ͍ͷͰʁ
nginxͷupstream keepaliveσϑΥϧτແޮ LFFQBMJWFσΟϨΫςΟϒͷઃఆͱ $POOFDUJPOϔομʔɺ )551όʔδϣϯͷࢦఆ͕ඞཁ VQTUSFBNIUUQ@CBDLFOE\ TFSWFS LFFQBMJWF ^ TFSWFS\
MPDBUJPOIUUQ\ QSPYZ@QBTTIUUQIUUQ@CBDLFOE QSPYZ@IUUQ@WFSTJPO QSPYZ@TFU@IFBEFS$POOFDUJPO ^ ^
ͦͦ
߹͕ࣨදࣔ͞ΕͨϢʔβʔ ΞΫηεͪʓʓਓͱ͔ ग़ͯΔ͚Ͳɺ མͪͯΜ͡ΌΜʂ
ͦͦ ͬͨ݁Ռɺ͕ߪೖͰ͖ͨͳͲͷ·͍݁͠Ռ͕ಘΒΕͨ߹ɺ ϙδςΟϒ ͬͨ݁Ռɺ·͍݁͠Ռ͕ಘΒΕͳ͍ɺͯ͘͠ͳ͍߹ɺ αʔό͕μϯ͍ͯ͠ΔͷͱମݧมΘΒͳ͍
ࣃΛ͍͂͘ɾɾɾ
ࠓͨ͜͠ͱ • PHPݴޠͱͯ͠WEB։ൃͰࠔΔ͜ͱ΄ͱΜͲͳ͍ • nginxͷϨʔτϦϛοτsub_requestΛ্खʹ͏ͱ ߴʹಈ࡞͢Δ͓͠Ζ࣮͕Ͱ͖Δ • ϘτϧωοΫͷ͏ͪɺղফͰ͖ͳ͍ͷ͋Γɺͦͷ߹ʹ߹ࣨ ༗ޮͳଧͪखͱͳΔ͕ɺΘͳ͍͍ͯ͘ʹӽͨ͜͠ͱͳ͍
1)1ΊͬͪΌ͋Γ·͢ɺ͋Γ͗ͯ͢ ᷓΕͯ·͢ ࠷৽ͷ࠾༻ใΛνΣοΫˠ !QC@SFDSVJU