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
インフラエンジニアのWEBアプリ入門
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Shuhei Ozawa
May 26, 2017
Programming
8.1k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
インフラエンジニアのWEBアプリ入門
y8c 2017の発表資料です。
Shuhei Ozawa
May 26, 2017
More Decks by Shuhei Ozawa
See All by Shuhei Ozawa
Amebaアフィリエイト基盤の GKEアーキテクチャと マイクロサービス
ozashu
0
260
production_ready_envoy
ozashu
2
1.2k
ログ・係数集約と可視化・分析
ozashu
0
160
Python for web architectures
ozashu
0
1k
PyQではじめるPython
ozashu
0
480
Other Decks in Programming
See All in Programming
Inside Stream API
skrb
1
770
並列実装の現場、2ヶ月間実務でAIを使い倒したAIもPCも私も限界が近い
ming_ayami
0
130
Spring Security 実践 ─ GraphQL APIで実務に役立つ 認証・認可 を学ぶ
wagyu
0
260
AIで効率化できた業務・日常
ochtum
0
140
The ROI of Quarkus for Spring Boot Applications
hollycummins
0
140
TSKaigi Night Talks 2026_TypeScriptでサプライチェーンの整合性を型に閉じ込める
geekplus_tech
0
400
Datadog × OpenTelemetry 入門と実践のあいだ
kn_to_maxpno
1
180
技術的負債解消で開発者の未来を開く- AIの力でコード刷新
kmd2kmd
0
120
不変条件と整合性境界—ビジネスが決める設計判断と実現パターン / Invariants and Consistency Boundaries
nrslib
14
5.8k
軽量Java基盤の設計 DIコンテナに頼らない、長期保守と1秒起動の実現 JJUG CCC 2026 Spring
macha64
0
570
LLM本来の能力を解き放つサンドボックス技術とAI民主化への適用
yukukotani
3
4.5k
TAKTでAI駆動開発の品質を設計する
j5ik2o
7
1.5k
Featured
See All Featured
Speed Design
sergeychernyshev
33
1.9k
Embracing the Ebb and Flow
colly
88
5.1k
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
Raft: Consensus for Rubyists
vanstee
141
7.6k
Documentation Writing (for coders)
carmenintech
77
5.4k
RailsConf 2023
tenderlove
30
1.5k
Deep Space Network (abreviated)
tonyrice
0
210
What does AI have to do with Human Rights?
axbom
PRO
1
2.2k
How STYLIGHT went responsive
nonsquared
100
6.2k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
390
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
Transcript
ΠϯϑϥΤϯδχΞͷ WEBΞϓϦೖ 1 Y8 2017 2017/05/27 - Ozawa Shuhei (
@oza_shu )
ࣗݾհ • খपฏ • @oza_shu • Sler→WEBۀք 2 Y8 2017
2017/05/27 - Ozawa Shuhei ( @oza_shu )
͢͜ͱ • ࡞͍ͯ͠ΔΞϓϦ(Ԍ্த) • ΞϓϦ࡞Λ࢝ΊͯΑ͔ͬͨ͜ͱ • ΞϓϦ։ൃ͕ϓϩάϥϛϯάೖʹ͓͢͢Ίͳཧ༝ ͞ͳ͍͜ͱ • ϓϩάϥϛϯάݴޠ
• ϑϨʔϜϫʔΫ 3 Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )
ฉ͍ͯ΄͍͠ਓ • ͜Ε͔Βϓϩάϥϛϯάษڧ͍ͨ͠ਓ • ษڧͯ͠Δ͚ͲԿΛ࡞ͬͨΒ͍͍͔Θ͔Βͳ͍ਓ • ίʔυॻ͚ΔΑ͏ʹͳΓ͍ͨΠϯϑϥΤϯδχΞ • ϓϩάϥϛϯάॻ͚ΔΑ͏ʹͳΓ͍ͨͱ૬ஊ͞ΕΔਓ 4
Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )
ϓϩάϥϛϯά͕Ͱ͖Δͱ Ҿ༻: 20ࡀΛա͔͗ͯΒϓϩάϥϛϯάΛֶ΅͏ͱܾΊͨਓͨͪ 5 Y8 2017 2017/05/27 - Ozawa Shuhei
( @oza_shu )
WEBΞϓϦ͕͓͢͢Ίͷཧ༝ • ೲظ͕ٛͳ͍ • ඞཁͳٕज़͕ଟذʹΔ • αʔό্Ͱಈ͍͍ͯΔΞϓϦͷಈ͖͕Θ͔Δ • োରԠͰΞϓϦͷιʔείʔυΛ͑ΔΑ͏ʹͳΔ •
ॻ͘ͱಈ͘ʂ͢͝ʔ͍ʂͨͷ͠ʔ͍ʂ 6 Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )
࡞͍ͬͯΔͷ Collect-Qiita ཁ݅ • Qiitaͷ࠷৽هࣄऔಘͱݕࡧ • ϩάΠϯػೳ • ηογϣϯอ࣋ •
͓ؾʹೖΓػೳ(Ԍ্த) 7 Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )
DEMO ؒʹ߹Θͳ͔ͬͨ! ΞΧϯτ࡞ʙهࣄͷݕࡧ·Ͱ ͏͍ͯ͝! 8 Y8 2017 2017/05/27 - Ozawa
Shuhei ( @oza_shu )
Collect-QiitaͰඞཁͱͳΔٕज़ • Qiitaͷ࠷৽هࣄऔಘͱݕࡧ • GET,POST,ϧʔςΟϯά,ςϯϓϨʔτ,FORMॲཧ • ϩάΠϯػೳ • DB࿈ܞ, ηΩϡϦςΟ
• ηογϣϯอ࣋ • Ωϟογϡ, HTTPϓϩτίϧ • ͓ؾʹೖΓػೳ • DB࿈ܞ, Ajax?? 9 Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )
ΞϓϦΛ࡞Γ࢝ΊΔͱ ػೳΛՃͨ͘͠ͳΔ • APIΛୟ͍ͯهࣄΛͱͬͯ͜Εͨʂ • هࣄΛ͓ؾʹೖΓొ͍ͨ͠ʂ • ϩάΠϯೝূ͠ͳ͍ͱͩʂ • ηογϣϯཧඞཁͳΜͩɻRedisͰอଘ͍ͨ͠ͳ!
• DockerͰίϯςφʹͯ͠Έ͍ͨʂ • ྲྀߦΓͩ͠k8sͰϚΠΫϩαʔϏεʹ͢Δ?? 10 Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )
࣍ͷҰา͕Θ͔Δ! Ҿ༻: 20ࡀΛա͔͗ͯΒϓϩάϥϛϯάΛֶ΅͏ͱܾΊͨਓͨͪ 11 Y8 2017 2017/05/27 - Ozawa Shuhei
( @oza_shu )
WEBΞϓϦ͕͓͢͢Ίͷཧ༝ • ೲظ͕ٛͳ͍ • ػೳՃͯ͠Ԍ্͍͍ͯ͠ • ඞཁͳٕज़͕ଟذʹΔ • ৭Μͳٕज़ֶָ͕͍ͯ͠ʂ •
αʔό্Ͱಈ͍͍ͯΔ͕ͳΜͳͷ͔ΕΔ • ͲΜͳٕज़͕ΘΕ͍ͯΔͷ͔Δͷָ͍͠ʂ • ॻ͘ͱಈ͘ʂ͢͝ʔ͍ʂͨͷ͠ʔ͍ʂ ɹ- ! 12 Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )
ࣗͷ࡞ͬͨΞϓϦͲ͏ͬͯ ಈ͍͍ͯΔΜͩΖ͏? - ΞϓϦΛಈ͔͍ͯ͠Δϓϩηεʹ͍ͭͯͬͱΓ͍ͨ - Ͳ͏ͬͯΞϓϦʹΞΫηε͍ͯ͠Δͷ͔Γ͍ͨ 13 Y8 2017 2017/05/27
- Ozawa Shuhei ( @oza_shu )
ΞϓϦΛಈ͔͍ͯ͠Δϓϩηεʹ͍ͭ ͯͬͱΓ͍ͨ • ΧʔωϧϓϩηεΛׂΓৼΒΕͨPIDΛΈͯͱͯ͠ѻ͏ • ࣮ߦதͷϓϩηε͕ϦιʔεΛ։͘ͱϑΝΠϧσΟεΫϦϓλ ׂ͕ΓͯΒΕΔ 14 Y8 2017
2017/05/27 - Ozawa Shuhei ( @oza_shu )
ίʔυྫ(1) PIDΛΈͯΈΑ͏ # ݱࡏͷϓϩηεΛฦ͢ import os print ("My pid:", os.getpid())
$ python3 3_processes_have_pid.py My pid: 10592 15 Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )
ίʔυྫ(2) ϑΝΠϧσΟεΫϦϓλ # ϑΝΠϧσΟεΫϦϓλׂ͕ΓͯΒΕ͍ͯΔ͔ΈͯΈΑ͏ if __name__ == "__main__": with open("/etc/passwd")
as passwd: print(passwd.fileno()) passwd.closed try: print(passwd.fileno()) except ValueError: print("The file already has closed") # ϑΝΠϧΛด͡Δͱফ͑Δ $ python3 5_processes_have_file_descriptors_closed_file.2.py 3 The file already has closed 16 Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )
ϑΝΠϧσΟεΫϦϓλʹ੍ݶ͕͋ Δ ϑΝΠϧ͕։͚ͳͯ͘োରԠΛͨ͜͠ͱ͕͋ͬͨͳ ιϑτϦϛοτΛ্͛ͨ͜ͱΛࢥ͍ग़ͨ͠ PythonͰopenͰϑΝΠϧΛ։͍ͨΒด͡Α͏ͱॻ͍ͯ͋ͬͨʂ withจΛ͏ͷΛ͓͢͢Ί͞Εͨཧ༝͕Θ͔ͬͨʂ 17 Y8 2017 2017/05/27
- Ozawa Shuhei ( @oza_shu )
fork()ؾʹͳͬͯ͘Δ ϓϩηε͕Fork͞ΕΔͬͯͲ͏͍͏͜ͱ͚ͩͬ? ࢠϓϩηεϓϩηεͰΘΕ͍ͯΔશͯͷϝϞϦͷίϐʔΛҾ͖ܧ͙ ϑΝΠϧσΟεΫϦϓλ(ιέοτ) • prefork • ίϐʔɾΦϯɾϥΠτʢCoWɺCopy on Writeʣ
• ԿͰκϯϏϓϩηεͬͯͳΔΜ͚ͩͬ • ϓϩηεؒ௨৴ • ύΠϓॲཧ,ετϦʔϜ,ϝοηʔδ • γάφϧॲཧ • ϓϩηεάϧʔϓ,ηογϣϯάϧʔϓ 18 Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )
Ͳ͏ͬͯΞϓϦʹ ΞΫηε͍ͯ͠Δͷ͔Γ͍ͨ • HTTPΞϓϦέʔγϣϯϓϩτίϧ • HTTPTCP(UDP)্Ͱ༻͞Εɺ ΫϥΠΞϯτͱαʔόͰΓͱΓ͞ΕΔ 19 Y8 2017
2017/05/27 - Ozawa Shuhei ( @oza_shu )
HTTPϓϩτίϧ • HTTPͲ͏͍͏ϓϩτίϧʁ • ͲΜͳϔομ͕͋Δʁ • KeepAliveΊͪΌͪ͘ΌศརͰ • HTTPͱHTTP2ͷҧ͍? •
requestsϞδϡʔϧ͕ศར 20 Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )
WEBαʔόͷಈ͖ • αʔόWEBϖʔδʹΞΫηε͠ʹ͘ΔΫϥΠΞϯτͷTCPϙʔ τΛLISTEN͢Δ • ΫϥΠΞϯταʔόʹଓͯ͠ϦΫΤετΛ͛Δ • αʔόWEBϖʔδΛϦΫΤετͯ͠ฦ͢ 21 Y8
2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )
TCPαʔόͷ࣮ • echoαʔόͷ࣮؆୯ • socketϞδϡʔϧ͕ศར • ෳͷΫϥΠΞϯτ͔ΒͷଓʹରԠͤͯ͘͞ • ϚϧνϓϩηεϚϧνεϨουɺΠϕϯτۦಈ •
I/O(C10K) • thread,queue,select(),epoll() • GunicornͷίʔϧυϦʔσΟϯά 22 Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )
ֶशͷґଘ॥ • ಈ͘ͱָ͍͠ • αϯϓϧίʔυιʔείʔυΛಡΜ Ͱಈ͔ͯ͠ΈΔ • RFCಡΜͰ༷ಡΉΑ͏ʹͳΔ • πʔϧʹৼΓճ͞Εͣීวతͳٕज़Λ
͑Δ • Կॻ͍͍͍͔ͯͳΜͯ·ͳ͘ͳΔ 23 Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )
ෳͷϨΠϠɺʹߦ͚Δ Ҿ༻: 20ࡀΛա͔͗ͯΒϓϩάϥϛϯάΛֶ΅͏ͱܾΊͨਓͨͪ 24 Y8 2017 2017/05/27 - Ozawa Shuhei
( @oza_shu )
·ͱΊ • ϓϩάϥϛϯάͷ࣍ͷҰา͕Θ͔Δ • োରԠͰιʔείʔυϨϕϧͰಈ࡞Λ͑Δ • ϓϩτίϧϨΠϠͳීวతͳٕज़ֶ͕Δ • ٕज़Λ͏॥ •
ٕज़Λ͏͜ͱͨͷ͍͠ʂ • ٕज़ͷͰϑϨϯζͰ͖Δʂ • ٕज़ͷΛ͠ͳ͕Βɺ͓ञΛҿΉͷͨͷ͍͠ʂ 25 Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )