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
290
PHPアプリケーションのスケーラビリティと 信頼性を革新する nginx+ngx_mrubyとGoの融合
PHPerKaigi2024でお話しました。
Kazuhiko Yamashita
March 07, 2024
Tweet
Share
More Decks by Kazuhiko Yamashita
See All by Kazuhiko Yamashita
ペパボOpenTelemetry革命
pyama86
2
1.1k
Site Reliability Engineering for GMO
pyama86
9
1.1k
ペパボOpenTelemetry革命
pyama86
0
720
ChatGPTの活用を体現し、 組織に浸透する技術
pyama86
1
920
リリースフラグと プログレッシブデリバリーを活用した 安全なWEBアプリケーションデプロイ
pyama86
2
170
PHPerのためのOpenTelemetry入門
pyama86
1
230
生成AIで仕事を もっとおもしろくする事例と詳解
pyama86
0
150
Goで実装された高速な 仮想待合室サーバの実装と詳解
pyama86
15
7.1k
CNDF2023前夜祭 - 玄界灘のクラウドネイティブなデータ基盤運用の実践
pyama86
1
440
Other Decks in Programming
See All in Programming
Slackワークフローで感謝を伝える機能/WiFi 自動接続/Figma to React Component/障害レポート君 Team3@NOT A HOTEL
nakaohiroshi
0
100
仕様と実装で学ぶOpenTelemetry
drumato
2
1.1k
The Final Frontier of Web Development: React Server Components vs Jakarta EE
ivargrimstad
0
100
Jetpack Composeとデザインシステム
rmakiyama
0
230
Good first issues of TypeProf
mame
4
580
The Design of Everyday APIs - PyCon 2024
roguelynn
0
190
スタックトレース始めてみた
kuro_kurorrr
4
1.1k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
1
130
RaaP
ksss
0
160
教えて!スクラムコーチ品質とスピードのバランスはどうすりゃいいの?
pinboro
0
110
TypeScriptコードの漸進的改善 / Progressive Improvement of TypeScript Code
medley
1
440
戦略的DDDは重いのか? / Is strategic DDD heavy?
pictiny
3
2.1k
Featured
See All Featured
Imperfection Machines: The Place of Print at Facebook
scottboms
261
12k
How To Stay Up To Date on Web Technology
chriscoyier
782
250k
Teambox: Starting and Learning
jrom
128
8.4k
Debugging Ruby Performance
tmm1
70
11k
Reflections from 52 weeks, 52 projects
jeffersonlam
345
19k
Statistics for Hackers
jakevdp
790
220k
Keith and Marios Guide to Fast Websites
keithpitt
408
22k
Thoughts on Productivity
jonyablonski
60
3.9k
The Pragmatic Product Professional
lauravandoore
26
5.9k
GraphQLの誤解/rethinking-graphql
sonatard
56
9.3k
YesSQL, Process and Tooling at Scale
rocio
165
13k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
123
39k
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