Slide 1

Slide 1 text

)551ͱ"4(*8FCαʔόͷؔ܎ )ZQFSDPSOΛྫʹ Junya Fukuda PyCon mini Hiroshima 2020

Slide 2

Slide 2 text

썡쎕썟썷쎣쎟 •෱ా ൏໵ʢJunya Fukudaʣʢ@JunyaFffʣ •גࣜձࣾ೔ຊγεςϜٕݚʢJSLʣॴଐ ௕໺ݝͷձࣾ •ੜ·Ε͸޿ౡݝͷ͓ྡɺࢁޱݝ •GEEKLAB.NAGANO •࠷ۙϚΠϯΫϥϑτͰখֶੜ޲͚Youtube഑৴࢝ΊΔ ΪʔΫϥϘ௕໺ϚΠΫϥ

Slide 3

Slide 3 text

ຊ쏅쏍쏁쏱쏽쎅ྲྀ쎣 •ASGIͬͯͳʹʁ •HTTP/2ͬͯͳʹʁ •Hypercorn×FastAPIͰετϦʔϜ •Hypercorn×FastAPIΛ࢖ͬͨHTTP/1.1 HTTP/2ੑೳଌఆ

Slide 4

Slide 4 text

1ZUIPO8FCͰ )551Λҙࣝͨ͜͠ͱ ͋Γ·͔͢ʁ

Slide 5

Slide 5 text

쏬쏋쏣썗쏁쏱쏽썿쎾썗쏵 •HTTP/2Λҙࣝͨ͜͠ͱ͸͋·Γͳ͍ •σϓϩΠ؀ڥʹ͸ϦόʔεϓϩΩγ͍Δ͠ɺHTTP/2ؾʹ͢Δͷ͸ͦ͘͜Β͍

Slide 6

Slide 6 text

쏬쏋쏣썗쏁쏱쏽썿쎾썗쏵 •HTTP/2Λҙࣝͨ͜͠ͱ͸͋·Γͳ͍ •σϓϩΠ؀ڥʹ͸ϦόʔεϓϩΩγ͍Δ͠ɺHTTP/2ؾʹ͢Δͷ͸ͦ͘͜Β͍ •ϩʔυόϥϯαʔ ͷ಺ଆ͸HTTP/1.1Ͱे෼

Slide 7

Slide 7 text

쏬쏋쏣썗쏁쏱쏽썿쎾썗쏵 •HTTP/2Λҙࣝͨ͜͠ͱ͸͋·Γͳ͍ •σϓϩΠ؀ڥʹ͸ϦόʔεϓϩΩγ͍Δ͠ɺHTTP/2ؾʹ͢Δͷ͸ͦ͘͜Β͍ •ϩʔυόϥϯαʔ ͷ಺ଆ͸HTTP/1.1Ͱे෼ •ʢPure Python ͷWebαʔόͳΜͯʣ

Slide 8

Slide 8 text

쏬쏋쏣썗쏁쏱쏽썿쎾썗쏵 •HTTP/2Λҙࣝͨ͜͠ͱ͸͋·Γͳ͍ •σϓϩΠ؀ڥʹ͸ϦόʔεϓϩΩγ͍Δ͠ɺHTTP/2ؾʹ͢Δͷ͸ͦ͘͜Β͍ •ϩʔυόϥϯαʔ ͷ಺ଆ͸HTTP/1.1Ͱे෼ •ͦΜͳͳ͔ɺASGIͱHypercornͱग़ձͬͨ •Python WebͰHTTP/2ʹ͢Δͱͳʹ͕͓͍͍͠ͷʁ •ʢPure Python ͷWebαʔόͳΜͯʣ

Slide 9

Slide 9 text

쏬쏋쏣썗쏁쏱쏽썿쎾썗쏵 •HTTP/2Λҙࣝͨ͜͠ͱ͸͋·Γͳ͍ •σϓϩΠ؀ڥʹ͸ϦόʔεϓϩΩγ͍Δ͠ɺHTTP/2ؾʹ͢Δͷ͸ͦ͘͜Β͍ •ϩʔυόϥϯαʔ ͷ಺ଆ͸HTTP/1.1Ͱे෼ •ͦΜͳͳ͔ɺASGIͱHypercornͱग़ձͬͨ •Python WebͰHTTP/2ʹ͢Δͱͳʹ͕͓͍͍͠ͷʁ •ʢPure Python ͷWebαʔόͳΜͯʣ •HTTP/3 RFC໨લɻ࠷ޙʂʁͷHTTP/2ωλ

Slide 10

Slide 10 text

"4(*ͬͯͳʹʁ

Slide 11

Slide 11 text

"4(*썺썽쎁쎂 •Asynchronous Server Gateway Interface ͷུ •WSGIͷޙܧ •WebαʔόͱΞϓϦέʔγϣϯͷΠϯλʔϑΣʔεͷ࢓༷

Slide 12

Slide 12 text

"4(*썺썽쎁쎂 •Asynchronous Server Gateway Interface ͷུ •Webαʔό͕ΞϓϦέʔγϣϯͷ async/await ʹରԠ •WSGIͷޙܧ •WebαʔόͱΞϓϦέʔγϣϯͷΠϯλʔϑΣʔεͷ࢓༷

Slide 13

Slide 13 text

"4(*썺썽쎁쎂 •Asynchronous Server Gateway Interface ͷུ •Webαʔό͕ΞϓϦέʔγϣϯͷ async/await ʹରԠ •WSGIͷޙܧ •WebαʔόͱΞϓϦέʔγϣϯͷΠϯλʔϑΣʔεͷ࢓༷ https://www.youtube.com/watch?v=EwG5EWKu8nw ASGIʢඇಉظαʔόήʔτ΢ΣΠΠϯλʔϑΣʔεʣͷ֓ཁ (Junya Fukuda) [PyCon JP 2020]

Slide 14

Slide 14 text

"4(*썺썽쎁쎂 •Asynchronous Server Gateway Interface ͷུ •Webαʔό͕ΞϓϦέʔγϣϯͷ async/await ʹରԠ •WSGIͷޙܧ •WebαʔόͱΞϓϦέʔγϣϯͷΠϯλʔϑΣʔεͷ࢓༷ https://www.youtube.com/watch?v=EwG5EWKu8nw ASGIʢඇಉظαʔόήʔτ΢ΣΠΠϯλʔϑΣʔεʣͷ֓ཁ (Junya Fukuda) [PyCon JP 2020] •ෳ਺ͷҰൠతͳϓϩτίϧΛॲཧՄೳʮHTTP/1.1ʯʮHTTP/2ʯʮWebsocketʯ

Slide 15

Slide 15 text

"4(*썺썽쎁쎂 •୅දతͳASGIؔ࿈ͷαʔόͱϑϨʔϜϫʔΫ

Slide 16

Slide 16 text

)551ͬͯͳʹʁ

Slide 17

Slide 17 text

)551썺썽쎁쎂 •HTTP/̍.1͔Β16೥ͷࡀ݄Λܦͯɺ2015೥ʹRFC •଎౓վળΛ໨తͱͨ͠࢓༷

Slide 18

Slide 18 text

)551썺썽쎁쎂 •HTTP/̍.1͔Β16೥ͷࡀ݄Λܦͯɺ2015೥ʹRFC •αʔόαΠυϓογϡ •ϔομʔͷѹॖ •ετϦʔϜʢϦΫΤετͷଟॏԽʣ •଎౓վળΛ໨తͱͨ͠࢓༷

Slide 19

Slide 19 text

)551썺썽쎁쎂 •HTTP/̍.1͔Β16೥ͷࡀ݄Λܦͯɺ2015೥ʹRFC •αʔόαΠυϓογϡ •ϔομʔͷѹॖ •ετϦʔϜʢϦΫΤετͷଟॏԽʣ •଎౓վળΛ໨తͱͨ͠࢓༷

Slide 20

Slide 20 text

)551썺썽쎁쎂 •ετϦʔϜ

Slide 21

Slide 21 text

)551썺썽쎁쎂 •ετϦʔϜ ‣ HTTP/̍.1ͷ໰୊఺Λղܾ͢ΔͨΊͷ࢓༷ •1ͭͷϦΫΤετ͕׬ྃ͢Δ·Ͱݪଇɺ࣍ͷϦΫΤετΛૹΕͳ͍໰୊

Slide 22

Slide 22 text

)551썺썽쎁쎂 ‣ HTTP/̍.1ͷ໰୊఺Λղܾ͢ΔͨΊͷ࢓༷ •1ͭͷϦΫΤετ͕׬ྃ͢Δ·Ͱݪଇɺ࣍ͷϦΫΤετΛૹΕͳ͍໰୊ ‣ ΫϥΠΞϯτ ‣ αʔόʔ

Slide 23

Slide 23 text

)551썺썽쎁쎂 ‣ HTTP/̍.1ͷ໰୊఺Λղܾ͢ΔͨΊͷ࢓༷ •1ͭͷϦΫΤετ͕׬ྃ͢Δ·Ͱݪଇɺ࣍ͷϦΫΤετΛૹΕͳ͍໰୊ ‣ ΫϥΠΞϯτ ‣ αʔόʔ

Slide 24

Slide 24 text

)551썺썽쎁쎂 ‣ HTTP/̍.1ͷ໰୊఺Λղܾ͢ΔͨΊͷ࢓༷ •1ͭͷϦΫΤετ͕׬ྃ͢Δ·Ͱݪଇɺ࣍ͷϦΫΤετΛૹΕͳ͍໰୊ ‣ ΫϥΠΞϯτ ‣ αʔόʔ

Slide 25

Slide 25 text

)551썺썽쎁쎂 ‣ HTTP/̍.1ͷ໰୊఺Λղܾ͢ΔͨΊͷ࢓༷ •1ͭͷϦΫΤετ͕׬ྃ͢Δ·Ͱݪଇɺ࣍ͷϦΫΤετΛૹΕͳ͍໰୊ ‣ ΫϥΠΞϯτ ‣ αʔόʔ

Slide 26

Slide 26 text

)551썺썽쎁쎂 ‣ HTTP/̍.1ͷ໰୊఺Λղܾ͢ΔͨΊͷ࢓༷ •1ͭͷϦΫΤετ͕׬ྃ͢Δ·Ͱݪଇɺ࣍ͷϦΫΤετΛૹΕͳ͍໰୊ ‣ ΫϥΠΞϯτ ‣ αʔόʔ

Slide 27

Slide 27 text

)551썺썽쎁쎂 ‣ HTTP/̍.1ͷ໰୊఺Λղܾ͢ΔͨΊͷ࢓༷ •1ͭͷϦΫΤετ͕׬ྃ͢Δ·Ͱݪଇɺ࣍ͷϦΫΤετΛૹΕͳ͍໰୊ ‣ ΫϥΠΞϯτ ‣ αʔόʔ HTTP/̍.1ͷϦΫΤετ-Ϩεϙ ϯε͸ɺৗʹॱ൪Λอͪಉظత ʹߦΘΕΔඞཁ͕͋Δ

Slide 28

Slide 28 text

)551썺썽쎁쎂 ‣ HTTP/̍.1ͷ໰୊఺Λղܾ͢ΔͨΊͷ࢓༷ •1ͭͷϦΫΤετ͕׬ྃ͢Δ·Ͱݪଇɺ࣍ͷϦΫΤετΛૹΕͳ͍໰୊ ‣ ΫϥΠΞϯτ ‣ αʔόʔ HTTP/̍.1ͷϦΫΤετ-Ϩεϙ ϯε͸ɺৗʹॱ൪Λอͪಉظత ʹߦΘΕΔඞཁ͕͋Δ WebγεςϜͰ͸ ը໘දࣔ࣌ʹ80ϦΫΤετ

Slide 29

Slide 29 text

)551썺썽쎁쎂 ‣ ྫ͑͹օ͞Μ͕࢖͍ͬͯΔGmail

Slide 30

Slide 30 text

)551썺썽쎁쎂 ‣ HTTP/̍.1ͷ໰୊఺Λղܾ͢ΔͨΊͷ࢓༷ •1ͭͷϦΫΤετ͕׬ྃ͢Δ·Ͱݪଇɺ࣍ͷϦΫΤετΛૹΕͳ͍໰୊ ‣ ΫϥΠΞϯτ ‣ αʔόʔ ‣ TCP × 6ຊ

Slide 31

Slide 31 text

)551썺썽쎁쎂 ‣ HTTP/̍.1ͷ໰୊఺Λղܾ͢ΔͨΊͷ࢓༷ •1ͭͷϦΫΤετ͕׬ྃ͢Δ·Ͱݪଇɺ࣍ͷϦΫΤετΛૹΕͳ͍໰୊ ‣ ΫϥΠΞϯτ ‣ αʔόʔ

Slide 32

Slide 32 text

)551썺썽쎁쎂 •ετϦʔϜ ‣ ΫϥΠΞϯτ ‣ αʔόʔ ‣ ΫϥΠΞϯτ ‣ αʔόʔ HTTP/1.1 HTTP/2

Slide 33

Slide 33 text

)551썺썽쎁쎂 •ετϦʔϜ ‣ ΫϥΠΞϯτ ‣ αʔόʔ ‣ ΫϥΠΞϯτ ‣ αʔόʔ HTTP/1.1 HTTP/2

Slide 34

Slide 34 text

)551썺썽쎁쎂 •ετϦʔϜ ‣ ΫϥΠΞϯτ ‣ αʔόʔ ‣ ΫϥΠΞϯτ ‣ αʔόʔ ‣ 1ͭͷTCPͷίωΫγϣϯͷதͰॱ൪଴ͪΛ͢Δ͜ͱͳ͘ɺฒྻʹॲཧ HTTP/1.1 HTTP/2 ฒྻʹॲཧ

Slide 35

Slide 35 text

)551썺썽쎁쎂 •ετϦʔϜ ‣ ΫϥΠΞϯτ ‣ αʔόʔ ‣ ΫϥΠΞϯτ ‣ αʔόʔ HTTP/1.1 HTTP/2 ฒྻʹॲཧ ‣ 1ͭͷTCPͷίωΫγϣϯͷதͰॱ൪଴ͪΛ͢Δ͜ͱͳ͘ɺฒྻʹॲཧ

Slide 36

Slide 36 text

)551쎂ରԠ썮썶"4(*8FC4FSWFS •ASGI Web ServerͷҰཡ Daphne Mangum IUUQTHJUIVCDPNqPSJNPOENBODBBXFTPNFBTHJ

Slide 37

Slide 37 text

)551쎂ରԠ썮썶"4(*8FC4FSWFS •ASGI WebServer ͱ͍͑͹ Uvicorn •·ͩHTTP/2ະରԠ ʢରԠ༧ఆ͋Γʣ Uvicorn currently supports HTTP/1.1 and WebSockets. Support for HTTP/2 is planned. Uvicorn͸ݱࡏɺHTTP/1.1ͱWebSocketsΛαϙʔτ͍ͯ͠·͢ɻ HTTP/2ͷαϙʔτ͕༧ఆ͞Ε͍ͯ·͢ɻ

Slide 38

Slide 38 text

)551쎂ରԠ썮썶"4(*8FC4FSWFS •ASGI࢓༷ͷରԠঢ়گ Framework HTTP WebSockets Server Push WebSocket HTTP Hypercorn 1 ○ 2 ○ 1 ○ 2 ○ ○ ○ Uvicorn 1 ○ 2 × 1 ○ 2 × × × Daphne 1 ○ 2 ○ 1 ○ 2 × × × Mangum 1 ○ 2 × 1 ○ 2 × × ×

Slide 39

Slide 39 text

)551쎂ରԠ썮썶"4(*8FC4FSWFS •ASGI࢓༷ͷରԠঢ়گ Framework HTTP WebSockets Server Push WebSocket HTTP Hypercorn 1 ○ 2 ○ 1 ○ 2 ○ ○ ○ Uvicorn 1 ○ 2 × 1 ○ 2 × × × Daphne 1 ○ 2 ○ 1 ○ 2 × × × Mangum 1 ○ 2 × 1 ○ 2 × × ×

Slide 40

Slide 40 text

)551쎂ରԠ썮썶"4(*8FC4FSWFS •ϋΠύʔίʔϯͱಡΈ·͢ •WSGI Web αʔόͷGunicornʹΠϯεύΠΞ͞Ε͍ͯΔ •HTTP / 1ɺHTTP / 2ɺWebSocketʢHTTP / 1͓ΑͼHTTP / 2ܦ༝ʣαϙʔτ •worker ͷλΠϓʹ asyncio,uvloop,trio ΛࢦఆՄೳ •worker ਺ΛࢦఆՄೳ

Slide 41

Slide 41 text

ຊ쏅쏍쏁쏱쏽썾쎅)551쎅࢖썛ಓ •HTTP/2αʔόͱΞϓϦέʔγϣϯͷϦΫΤετɾϨεϙϯεʹண໨ •੩తϑΝΠϧͷ഑৴͸ผͰɻΦϒδΣΫτετϨʔδ΍CDNͰ

Slide 42

Slide 42 text

ຊ쏅쏍쏁쏱쏽썾쎅)551쎅࢖썛ಓ ೥୅ͷίϯςφ࣌୅ͷ1ZUIPOΞʔΩςΫνϟσϓϩΠ TIJCVLBXB <1Z$PO+1> IUUQTXXXZPVUVCFDPNXBUDI W0Y3O%-6OP*TUBSU •HTTP/2αʔόͱΞϓϦέʔγϣϯͷϦΫΤετɾϨεϙϯεʹண໨ •੩తϑΝΠϧͷ഑৴͸ผͰɻΦϒδΣΫτετϨʔδ΍CDNͰ

Slide 43

Slide 43 text

)ZQFSDPSOΛྫʹ ετϦʔϜʢଟॏԽʣΛ

Slide 44

Slide 44 text

)ZQFSDPSO썾쏃쏒쏴썗쏪 •؆୯ͳWebΞϓϦέʔγϣϯΛHypercornͰಈ͔͢ •ϒϥ΢β͔ΒJavascriptͰΞΫηε •WebΞϓϦέʔγϣϯͷίʔυ͸ಉ͡ •HTTP/1.1ͱHTTP/2ͷҧ͍ΛɺΈͯΈ·͠ΐ͏

Slide 45

Slide 45 text

؀ڥ •Hypercorn •fastapi 0.61.1 0.11.0 Webαʔό Web Framework ⁶ ⁶ ʢASGIʣ ʢHTTP/2ʣ ʢHTTP/1.1ʣ )ZQFSDPSO썾쏃쏒쏴썗쏪

Slide 46

Slide 46 text

؀ڥ •Hypercorn •fastapi 0.61.1 0.11.0 Webαʔό Web Framework ⁶ ⁶ ʢASGIʣ ʢHTTP/2ʣ ʢHTTP/1.1ʣ )ZQFSDPSO썾쏃쏒쏴썗쏪

Slide 47

Slide 47 text

쎿썗쏚쎿쎮쏓쎅ॲཧ @app.get("/message/{id}") async def get_message(id:str): await asyncio.sleep(3) return {"text": f"spam, egg, spam and spam!, {id}!"}

Slide 48

Slide 48 text

쎹쏳쎮쎬쏽쏒쎅ॲཧ requestButton.onclick = async function() { result = []; for (let i = 0; i < 24; i++) { result.push(fetch(`/message/${i}/`)); } await Promise.all(result); }

Slide 49

Slide 49 text

)551쎅৔߹

Slide 50

Slide 50 text

)551쎅৔߹

Slide 51

Slide 51 text

)551쎅৔߹

Slide 52

Slide 52 text

)551쎅৔߹ TFDˎຊ

Slide 53

Slide 53 text

)551쎅৔߹ TFDˎຊ TFDˎຊ

Slide 54

Slide 54 text

)551쎅৔߹ TFDˎຊ TFDˎຊ TFDˎຊ

Slide 55

Slide 55 text

)551쎅৔߹ TFDˎຊ TFDˎຊ TFDˎຊ TFDˎຊ

Slide 56

Slide 56 text

)551쎅৔߹ TFDˎຊ TFDˎຊ TFDˎຊ TFDˎຊ τʔλϧTFD

Slide 57

Slide 57 text

)551쎅৔߹

Slide 58

Slide 58 text

)551쎅৔߹

Slide 59

Slide 59 text

)551쎅৔߹ TFDˎຊ

Slide 60

Slide 60 text

)551쎅৔߹ TFDˎຊ τʔλϧTFD

Slide 61

Slide 61 text

)551ͱ)551̍ ੑೳΛൺֱ

Slide 62

Slide 62 text

)551)551쏛쏟쎳썗쏨쏽쏃ൺֱ •࣮ߦ؀ڥ͸ϩʔΧϧϚγϯ •ࢦඪ͸ɺॲཧͷऴྃ·Ͱʹ͔͔ͬͨ࣌ؒʗ1ඵ͋ͨΓʹࡹ͚ΔϦΫΤετ਺ •ੑೳଌఆπʔϧͱͯ͠ɺh2load ίϚϯυΛ࢖༻͢Δ •؆୯ͳWebΞϓϦέʔγϣϯΛHypercornͰಈ͔͢

Slide 63

Slide 63 text

)551)551쏛쏟쎳썗쏨쏽쏃ൺֱ αʔό HTTP/1.1 HTTP/2 •Hypercorn •fastapi 0.61.1 0.11.0 Webαʔό Web Framework ⁶ ⁶ ʢASGIʣ ʢHTTP/2ʣ ʢHTTP/1.1ʣ

Slide 64

Slide 64 text

)551)551쏛쏟쎳썗쏨쏽쏃ൺֱ αʔό HTTP/1.1 HTTP/2 •Hypercorn •fastapi 0.61.1 0.11.0 Webαʔό Web Framework ⁶ ⁶ ʢASGIʣ ʢHTTP/2ʣ ʢHTTP/1.1ʣ

Slide 65

Slide 65 text

ϋʔυ΢ΣΞ؀ڥ •Macbook Pro •2.6 GHz 6ίΞ Intel Core i7 •ϝϞϦ 16GB )551)551쏛쏟쎳썗쏨쏽쏃ൺֱ

Slide 66

Slide 66 text

)551)551쏛쏟쎳썗쏨쏽쏃ൺֱ •h2load ίϚϯυ Φϓγϣϯ ҙຯ -n ૯ϦΫΤετ਺ -c ΫϥΠΞϯτ਺ɻಉ࣌ΞΫηε਺ -p ϓϩτίϧʢࣗಈ൑ผʣ •h2load -c 100 -n 10000 https://127.0.0.1:8000/query

Slide 67

Slide 67 text

)551)551쏛쏟쎳썗쏨쏽쏃ൺֱ ҎԼ3ͭ৚݅ •ΫϥΠΞϯτಉ࣌઀ଓ 10, ϦΫΤετ਺ 100 •ΫϥΠΞϯτಉ࣌઀ଓ 50, ϦΫΤετ਺ 5000 •ΫϥΠΞϯτಉ࣌઀ଓ 100, ϦΫΤετ਺ 10000

Slide 68

Slide 68 text

)551)551쏛쏟쎳썗쏨쏽쏃ൺֱ ҎԼ3ͭ৚݅ •ΫϥΠΞϯτಉ࣌઀ଓ 10, ϦΫΤετ਺ 100 •ΫϥΠΞϯτಉ࣌઀ଓ 50, ϦΫΤετ਺ 5000 •ΫϥΠΞϯτಉ࣌઀ଓ 100, ϦΫΤετ਺ 10000 ࢦඪ •ॲཧͷऴྃ·Ͱʹ͔͔ͬͨ࣌ؒ •1ඵ͋ͨΓͷॲཧͨ͠ϦΫΤετ਺

Slide 69

Slide 69 text

)551)551쏛쏟쎳썗쏨쏽쏃ൺֱ ҎԼ3ͭ৚݅ •ΫϥΠΞϯτಉ࣌઀ଓ 10, ϦΫΤετ਺ 100 •ΫϥΠΞϯτಉ࣌઀ଓ 50, ϦΫΤετ਺ 5000 •ΫϥΠΞϯτಉ࣌઀ଓ 100, ϦΫΤετ਺ 10000 ࢦඪ •ॲཧͷऴྃ·Ͱʹ͔͔ͬͨ࣌ؒ •1ඵ͋ͨΓͷॲཧͨ͠ϦΫΤετ਺ → ૣ͍ͱྑ͍ → ଟ͍ͱྑ͍

Slide 70

Slide 70 text

)551)551쏛쏟쎳썗쏨쏽쏃ൺֱ •ΫϥΠΞϯτಉ࣌઀ଓ 10, ϦΫΤετ਺ 100

Slide 71

Slide 71 text

)551)551쏛쏟쎳썗쏨쏽쏃ൺֱ ऴྃ࣌ؒ [s] •ΫϥΠΞϯτಉ࣌઀ଓ 10, ϦΫΤετ਺ 100

Slide 72

Slide 72 text

)551)551쏛쏟쎳썗쏨쏽쏃ൺֱ ऴྃ࣌ؒ [s] •ΫϥΠΞϯτಉ࣌઀ଓ 10, ϦΫΤετ਺ 100 ϦΫΤετ [s]

Slide 73

Slide 73 text

)551)551쏛쏟쎳썗쏨쏽쏃ൺֱ ऴྃ࣌ؒ [s] •ΫϥΠΞϯτಉ࣌઀ଓ 10, ϦΫΤετ਺ 100 ϦΫΤετ [s] HTTP/1.1 HTTP/2 HTTP/1.1 HTTP/2

Slide 74

Slide 74 text

No content

Slide 75

Slide 75 text

)551)551쏛쏟쎳썗쏨쏽쏃ൺֱ ऴྃ࣌ؒ [s] •ΫϥΠΞϯτಉ࣌઀ଓ 10, ϦΫΤετ਺ 100 ϦΫΤετ [s] HTTP/1.1 HTTP/2 HTTP/1.1 HTTP/2

Slide 76

Slide 76 text

)551)551쏛쏟쎳썗쏨쏽쏃ൺֱ •ΫϥΠΞϯτಉ࣌઀ଓ 50, ϦΫΤετ਺ 5000 ऴྃ࣌ؒ [s] ϦΫΤετ [s] HTTP/1.1 HTTP/2 HTTP/1.1 HTTP/2

Slide 77

Slide 77 text

)551)551쏛쏟쎳썗쏨쏽쏃ൺֱ •ΫϥΠΞϯτಉ࣌઀ଓ 100, ϦΫΤετ਺ 10000 ऴྃ࣌ؒ [s] ϦΫΤετ [s] HTTP/1.1 HTTP/2 HTTP/1.1 HTTP/2

Slide 78

Slide 78 text

No content

Slide 79

Slide 79 text

)551썺썽쎁쎂 •HTTP/̍.1͔Β16೥ͷࡀ݄Λܦͯɺ2015೥ʹRFC •αʔόαΠυϓογϡ •ϔομʔͷѹॖ •ετϦʔϜʢϦΫΤετͷଟॏԽʣ •଎౓վળΛ໨తʹͨ͠࢓༷

Slide 80

Slide 80 text

)551썺썽쎁쎂 •HTTP/̍.1͔Β16೥ͷࡀ݄Λܦͯɺ2015೥ʹRFC •αʔόαΠυϓογϡ •ϔομʔͷѹॖ •ετϦʔϜʢϦΫΤετͷଟॏԽʣ •଎౓վળΛ໨తʹͨ͠࢓༷

Slide 81

Slide 81 text

)551)551쏛쏟쎳썗쏨쏽쏃ൺֱ •h2load — help Max concurrent streams to issue per session. When http/1.1 is used, this specifies the number of HTTP pipelining requests in-flight. ηογϣϯ͝ͱʹൃߦ͢Δ࠷େಉ࣌ετϦʔϜ਺ɻ http/1.1 Λ࢖༻͢Δ৔߹ɺ HTTP ύΠϓϥΠϯϦΫΤετ ͷ਺Λࢦఆ͠·͢ɻ -m, --max-concurrent-streams=

Slide 82

Slide 82 text

)551)551쏛쏟쎳썗쏨쏽쏃ൺֱ •ΫϥΠΞϯτಉ࣌઀ଓ 10, ϦΫΤετ਺ 100, ετϦʔϜ 5

Slide 83

Slide 83 text

)551)551쏛쏟쎳썗쏨쏽쏃ൺֱ ऴྃ࣌ؒ [s] •ΫϥΠΞϯτಉ࣌઀ଓ 10, ϦΫΤετ਺ 100, ετϦʔϜ 5

Slide 84

Slide 84 text

)551)551쏛쏟쎳썗쏨쏽쏃ൺֱ ऴྃ࣌ؒ [s] •ΫϥΠΞϯτಉ࣌઀ଓ 10, ϦΫΤετ਺ 100, ετϦʔϜ 5 ϦΫΤετ [s]

Slide 85

Slide 85 text

)551)551쏛쏟쎳썗쏨쏽쏃ൺֱ ऴྃ࣌ؒ [s] •ΫϥΠΞϯτಉ࣌઀ଓ 10, ϦΫΤετ਺ 100, ετϦʔϜ 5 ϦΫΤετ [s] HTTP/1.1 HTTP/2 HTTP/1.1 HTTP/2

Slide 86

Slide 86 text

)551)551쏛쏟쎳썗쏨쏽쏃ൺֱ •ΫϥΠΞϯτಉ࣌઀ଓ 50, ϦΫΤετ਺ 5000, ετϦʔϜ 5 ऴྃ࣌ؒ [s] ϦΫΤετ [s] HTTP/1.1 HTTP/2 HTTP/1.1 HTTP/2

Slide 87

Slide 87 text

)551)551쏛쏟쎳썗쏨쏽쏃ൺֱ •ΫϥΠΞϯτಉ࣌઀ଓ 100, ϦΫΤετ਺ 10000, ετϦʔϜ 5 ऴྃ࣌ؒ [s] ϦΫΤετ [s] HTTP/1.1 HTTP/2 HTTP/1.1 HTTP/2

Slide 88

Slide 88 text

)551)551쏛쏟쎳썗쏨쏽쏃ൺֱ ετϦʔϜͳ͠ ετϦʔϜ͋Γ •ΫϥΠΞϯτಉ࣌઀ଓ 100, ϦΫΤετ਺ 10000, ετϦʔϜ 5 ετϦʔϜͳ͠ ετϦʔϜ͋Γ ऴྃ࣌ؒ [s] ϦΫΤετ [s] HTTP/1.1 HTTP/2 HTTP/1.1 HTTP/2

Slide 89

Slide 89 text

쎕썿쎘 •ϦΫΤετͷଟॏԽ͕͞Ε͍ͯΔͱ͜ΖͰ͋Ε͹HTTP/2͸ɺ͸΍͍

Slide 90

Slide 90 text

쎕썿쎘 •WebαΠτ΁ͷ1ճͷΞΫηεͰɺෳ਺ճαʔό΁ϦΫΤετΛ৔߹ •ϦΫΤετͷଟॏԽ͕͞Ε͍ͯΔͱ͜ΖͰ͋Ε͹HTTP/2͸ɺ͸΍͍

Slide 91

Slide 91 text

쎕썿쎘 → γεςϜ؂ࢹμογϡϘʔυ •WebαΠτ΁ͷ1ճͷΞΫηεͰɺෳ਺ճαʔό΁ϦΫΤετΛ৔߹ → ϦΞϧλΠϜσʔλ → νϟοτΞϓϦ •ϦΫΤετͷଟॏԽ͕͞Ε͍ͯΔͱ͜ΖͰ͋Ε͹HTTP/2͸ɺ͸΍͍

Slide 92

Slide 92 text

쎕썿쎘 → γεςϜ؂ࢹμογϡϘʔυ •WebαΠτ΁ͷ1ճͷΞΫηεͰɺෳ਺ճαʔό΁ϦΫΤετΛ৔߹ → ϦΞϧλΠϜσʔλ → νϟοτΞϓϦ •طଘͷαΠτͰܧ͗଍͠ܧ͗଍͠ʹͳͬͯ͠·͍ͬͯΔ৔߹ʢ΍Ήͳ͘ʣ •ϦΫΤετͷଟॏԽ͕͞Ε͍ͯΔͱ͜ΖͰ͋Ε͹HTTP/2͸ɺ͸΍͍

Slide 93

Slide 93 text

쎕썿쎘 •HTTP/2Կ͕͓͍͍͠ͷʁ

Slide 94

Slide 94 text

쎕썿쎘 •HTTP/2Կ͕͓͍͍͠ͷʁ → ଎౓͕վળͷՄೳੑ

Slide 95

Slide 95 text

쎕썿쎘 •HTTP/2Կ͕͓͍͍͠ͷʁ •ࣗ͝਎ͷPython Web Application Λ͝ཡʹͳͬͯΈ͍ͯͩ͘͞ɻ •ϒϥ΢βͷσόοΨΛ։͍ͯϦϩʔυ → ଎౓͕վળͷՄೳੑ

Slide 96

Slide 96 text

쎕썿쎘 •HTTP/2Կ͕͓͍͍͠ͷʁ •ࣗ͝਎ͷPython Web Application Λ͝ཡʹͳͬͯΈ͍ͯͩ͘͞ɻ •ϒϥ΢βͷσόοΨΛ։͍ͯϦϩʔυ •Protocol=HTTP/1.1ʹͳ͍ͬͯΔʢLBͷ಺ଆ͕HTTP/1.1ͷՄೳੑ΋ʣ → ଎౓͕վળͷՄೳੑ

Slide 97

Slide 97 text

쎕썿쎘 •HTTP/2Կ͕͓͍͍͠ͷʁ •Typeʹ fetch ΍ xhr ͕ଟ͍ •ࣗ͝਎ͷPython Web Application Λ͝ཡʹͳͬͯΈ͍ͯͩ͘͞ɻ •ϒϥ΢βͷσόοΨΛ։͍ͯϦϩʔυ •Protocol=HTTP/1.1ʹͳ͍ͬͯΔʢLBͷ಺ଆ͕HTTP/1.1ͷՄೳੑ΋ʣ → ଎౓͕վળͷՄೳੑ

Slide 98

Slide 98 text

쎕썿쎘 •HTTP/2Կ͕͓͍͍͠ͷʁ •Typeʹ fetch ΍ xhr ͕ଟ͍ •ࣗ͝਎ͷPython Web Application Λ͝ཡʹͳͬͯΈ͍ͯͩ͘͞ɻ •ϒϥ΢βͷσόοΨΛ։͍ͯϦϩʔυ •Protocol=HTTP/1.1ʹͳ͍ͬͯΔʢLBͷ಺ଆ͕HTTP/1.1ͷՄೳੑ΋ʣ

Slide 99

Slide 99 text

쎕썿쎘 •HTTP/2Կ͕͓͍͍͠ͷʁ •HTTP/2ͷWebserver Hypercorn ʹ͢Δ͜ͱͰ଎౓վળ͕ΈΒΕΔ •Typeʹ fetch ΍ xhr ͕ଟ͍ •ࣗ͝਎ͷPython Web Application Λ͝ཡʹͳͬͯΈ͍ͯͩ͘͞ɻ •ϒϥ΢βͷσόοΨΛ։͍ͯϦϩʔυ •Protocol=HTTP/1.1ʹͳ͍ͬͯΔʢLBͷ಺ଆ͕HTTP/1.1ͷՄೳੑ΋ʣ → ଎౓͕վળͷՄೳੑ

Slide 100

Slide 100 text

쎕썿쎘 •HTTP/2Կ͕͓͍͍͠ͷʁ •Typeʹ fetch ΍ xhr ͕ଟ͍ •ࣗ͝਎ͷPython Web Application Λ͝ཡʹͳͬͯΈ͍ͯͩ͘͞ɻ •ϒϥ΢βͷσόοΨΛ։͍ͯϦϩʔυ •Protocol=HTTP/1.1ʹͳ͍ͬͯΔʢLBͷ಺ଆ͕HTTP/1.1ͷՄೳੑ΋ʣ ͔΋͠Ε·ͤΜ •HTTP/2ͷWebserver Hypercorn ʹ͢Δ͜ͱͰ଎౓վળ͕ΈΒΕΔ → ଎౓͕վળͷՄೳੑ

Slide 101

Slide 101 text

썡쎕써 •AWSͰσϓϩΠ͍ͯ͠Δ৔߹ •ALB ʹ ಺ଆ͸HTTP/2 ະରԠͷͨΊɺHTTP/̍.1 ϒϥ΢β ALB Web Server Web FW )551 )551 84(*"4(*

Slide 102

Slide 102 text

썡쎕써 •AWSͰσϓϩΠ͍ͯ͠Δ৔߹ •ALB ʹ ಺ଆ͸HTTP/2 ະରԠͷͨΊɺHTTP/̍.1 •NLB ʹ 2020೥6݄ʹ಺ଆHTTP/2ରԠ͍ͯ͠Δ ϒϥ΢β Ϧόʔε ϓϩΩγ Hyper corn Web FW )551 )551 "4(* IUUQTBXTBNB[PODPNKQBCPVUBXTXIBUTOFXOFUXPSLMPBECBMBODFSOPXTVQQPSUTUMTBMQOQPMJDJFT

Slide 103

Slide 103 text

썡쎕써̎ •WSGIΞϓϦέʔγϣϯͷ৔߹ •HypercornʢASGI Webαʔό͸WSGIରԠ͍ͯ͠·͢ʣͰσϓϩΠՄೳ •ࢼͯ͠ΈΔՁ஋͕͋Δ͔΋ʂʁ •Django 2ܥ - wsgi.pyΛϥοϓ͢Δ͚ͩ from hypercorn.middleware import AsyncioWSGIMiddleware import sampleproject.wsgi as wsgi_app asyncio_app = AsyncioWSGIMiddleware(wsgi_app.application) https://github.com/jrfk/django2-hypercorn

Slide 104

Slide 104 text

쏑쏡쏷쎮쎅બ୒ࢶ썿썮썽 •GunicornˎWSGIϑϨʔϜϫʔΫ •GunicornˎWSGIϑϨʔϜϫʔΫˎmeinheld •seroryˎGunicornˎWSGIϑϨʔϜϫʔΫ •UvicornˎASGIϑϨʔϜϫʔΫ

Slide 105

Slide 105 text

쏑쏡쏷쎮쎅બ୒ࢶ썿썮썽 •GunicornˎWSGIϑϨʔϜϫʔΫ •GunicornˎWSGIϑϨʔϜϫʔΫˎmeinheld •seroryˎGunicornˎWSGIϑϨʔϜϫʔΫ •UvicornˎASGIϑϨʔϜϫʔΫ •HypercornˎASGIϑϨʔϜϫʔΫ/WSGIϑϨʔϜϫʔΫ

Slide 106

Slide 106 text

쏑쏡쏷쎮쎅બ୒ࢶ썿썮썽 •GunicornˎWSGIϑϨʔϜϫʔΫ •GunicornˎWSGIϑϨʔϜϫʔΫˎmeinheld •seroryˎGunicornˎWSGIϑϨʔϜϫʔΫ •UvicornˎASGIϑϨʔϜϫʔΫ •HypercornˎASGIϑϨʔϜϫʔΫ/WSGIϑϨʔϜϫʔΫ

Slide 107

Slide 107 text

ࢀߟࢿྉ •How to serve HTTP/2 using Python IUUQTNFEJVNDPNQZUIPOQBOEFNPOJVNIPXUPTFSWFIUUQVTJOHQZUIPOFCCEF⒎ •HTTP/1 should die IUUQTNFEJVNDPN!QHKPOFTIUUQTIPVMEEJFCEF •Hypercorn IUUQTQHKPOFTHJUMBCJPIZQFSDPSOJOEFYIUNM •jrfk / fastapi-hypercorn_Performance-measurement IUUQTHJUIVCDPNKSGLGBTUBQJIZQFSDPSO@1FSGPSNBODFNFBTVSFNFOU