Share
Embed
Lessons by WebAssembly app in production on CDN Edge Computing Service
Web Developer Conference 2024(Sept. 7th, 2024)https://web-study.connpass.com/event/321711/ にて発表のスライド。当日発表したものに加筆修正したもの。
Tetsuharu Ohzeki
September 10, 2024
Transcript
49 slides
-
Tetsuharu Ohzeki (github: tetsuharuohzeki) Lessons by WebAssembly app in production
on CDN Edge Computing Service 1 Presented at September 7th, 2024 slide ver. 2024.09.10.00 -
About Me Tetsuharu OHZEKI • GitHub: tetsuharuohzeki • Software EngineerʢϑϦʔϥϯεɾcontractorʣʢࣄઌެʹώϛπʣ
• ΦʔϓϯιʔεతͳΞΫςΟϏςΟ • WebKit contributor (2020~) • Firefox/Gecko committer Lv.3ʢ͍͔ͭΒ͔Εͨʣ • Servo reviewer (େੲ) • ߩݙ͚ͩͳΒͦͷଞ৭ʑ (RxJS, Node.js, TypeScript, and etc.) 2 -
Introduction Please raise your hand if you…. 🙋 • WASMͬͯΔ
• WASMΛϗετ͢Δʢ࣮ߦ͢ΔʣڥΛ࡞͍ͬͯΔ • WASMʹίϯύΠϧͯ͠ಈ͔͢ΞϓϦέʔγϣϯΛσϓϩΠͨ͜͠ͱ͕͋Δ • I am the member of Bytecode Alliance…… 3 -
Tetsuharu Ohzeki (github: tetsuharuohzeki) Lessons by WebAssembly app in production
on CDN Edge Computing Service 4 -
Goal of This session • WebAssembly 埋 込 動 厄介
共有 • 厄介 減 必要 思 共有 • Wasm採 用 便利 5 -
⚠ Disclaimers • ࢲFastlyࣾͱޏ༻ۚમͳͲΛؚΉརؔ͋Γ·ͤΜ • ؔ࿈͢Δ༗Ձূ݊ͷอ༗͍ͯ͠·ͤΜ • ຊηογϣϯ20248݄ݱࡏͷެ։ใʹج͍ͮͨௐࠪ݁ՌʹࢲݟΛަ͑ͨͷ • Fastly
ComputeͷՁ֨ੑೳʹؔ͢Δ͠·ͤΜʢηʔϧεʹฉ͍ͯͶʂʣ • ෳɾڝ߹αʔϏεΛൺֱ͢Δͷ͕తͰͳ͍ • WebAssemblyͷṶ͚Γ·ͤΜ 6 Fastly, Inc.ͱແؔ -
Outlines 1. Wasm͓ΑͼWASIͷجຊతͳࣝ 2. CDN Edge Computing Serviceͷ֓ཁɺ Fastly Computeͷ࣮ߦϞσϧͱ੍ͷެ։ใʹجͮ͘આ໌
3. RustΛબͨ͠߹ͷWasmλʔήοτͳΞϓϦέʔγϣϯ։ൃͷհ͞ 4. WasmຊʹʮۀքͷະདྷʯͰศརͳͷ͔ʁ ΞϓϦ։ൃऀ؍Ͱͷॴײͱఏݴ 7 -
Outlines 1. Wasm͓ΑͼWASIͷجຊతͳࣝ 2. CDN Edge Computing Serviceͷ֓ཁɺ Fastly Computeͷ࣮ߦϞσϧͱ੍ͷެ։ใʹجͮ͘આ໌
3. RustΛબͨ͠߹ͷWasmλʔήοτͳΞϓϦέʔγϣϯ։ൃͷհ͞ 4. WasmຊʹʮۀքͷະདྷʯͰศརͳͷ͔ʁ ΞϓϦ։ൃऀ؍Ͱͷॴײͱఏݴ 8 -
WebAssembly (WASM/Wasm) The new “sandboxed” execution format • ίϯύΠϧλʔήοτͰ͋ΔʢجຊతʹखͰॻ͘ͷͰͳ͍ʣ •
asm.jsNaCLͷޙܧ by W3C • Sandbox by default by design • ۩ମతͳhostcallɾڥͱΓͱΓ͢ΔAPI༷ະఆٛ • ಠཱͨ͠ϑΥʔϚοτͳͷͰɺϓϥάΠϯϛυϧΣΞΛ࡞Δͷʹศར • e.g. Microsoft Flight Simulator, Proxy-Wasm 9 -
WASI (WebAssembly System Interface) Wasm͚hostcallͷڞ௨ఆٛͷࢼΈ • hostcallఆٛͷڞ௨ԽΛࢦ͢ϕʔεϥΠϯͷҰͭ • By Bytecode
Alliance • ڝ߹ʹWASIX by wasmer.ioͳΜͯͷ͋Δ͕লུ • Preview 1 • File descriptorͷ֓೦ཚੜɾऔಘͳͲɺPOSIXͬΆ͍ͷ͕ఆٛ͞Ε͍ͯΔ • Preview 2 • ίϯϙʔωϯτ֓೦ͷಋೖɾҟछݴޠؒίϯϙʔωϯτݺͼग़͠نɾIDLͷఆٛͳͲ 10 -
WebAssembly Overview ͬ͘͟Γͨ͠ཧղ 11 WebAssembly hostcall ⚙ ⚙ ⚙ 🔊
Embedder (host environment) ⏰ Host Features -
WebAssembly Overview ͬ͘͟Γͨ͠ཧղ 12 WebAssembly hostcall ⚙ ⚙ ⚙ 🔊
Embedder (host environment) ⏰ Host Features WASI p1 -
WebAssembly Overview ͬ͘͟Γͨ͠ཧղ 13 WebAssembly hostcall ⚙ ⚙ ⚙ 🔊
Embedder (host environment) ⏰ Host Features WASI p1 WASI p2 ⚙ -
Key Points of This Section ͓͞Β͍ • WebAssembly = ໋ྩηοτɾίϯύΠϧλʔήοτ
• C/C++ͳͲͰॻ͔Εͨطଘࢿ࢈ΛҠ২͢Δͷʹ͑Δ • αϯυϘοΫεੑ͕ߴ͍ • ϗετଆׂͱࣗ༝ʹఆٛͰ͖Δ • ͨͩ͠WASIͳͲ֎෦༷Ͱڞ௨Խ͕ࢼΈΒΕ͍ͯΔ • ϙʔλϏϦςΟαϯυϘοΫεΛҙࣝͨ͠Ԡ༻͕૿Ճ 14 -
Outlines 1. Wasm͓ΑͼWASIͷجຊతͳࣝ 2. CDN Edge Computing Serviceͷ֓ཁɺ Fastly Computeͷ࣮ߦϞσϧͱ੍ͷެ։ใʹجͮ͘આ໌
3. RustΛબͨ͠߹ͷWasmλʔήοτͳΞϓϦέʔγϣϯ։ൃͷհ͞ 4. WasmຊʹʮۀքͷະདྷʯͰศརͳͷ͔ʁ ΞϓϦ։ൃऀ؍Ͱͷॴײ 15 -
CDN Edge Computing Service ͬͯԿͩΑ • CDNͷEdgeʢ㲈Point of PresenceʣͰಈ࡞͢ΔҙͷϓϩάϥϜΛσϓϩΠͰ͖ΔαʔϏεͷ͜ͱΛ ຊηογϣϯͰࢦ͢
• ωοτϫʔΫϦΫΤετͷதʹԠͨ݅͡ذΛϓϩάϥϜͰॻ͚Δͱࢥ͓͚ͬͯOK • ϦόʔεϓϩΩγHTTPϩʔυόϥϯαͷͰऔΕΔใ͕͑Δ • ֓ͶHTTPϦΫΤετͱ1:1ͰΞϓϦέʔγϣϯΠϯελϯε্ཱ͕͕ͪΔαʔόʔϨεܕʹͳΔ • CDNࣄۀऀʹεέʔϥϏϦςΟؙ͛Ͱ͖Δ • ࣮ͨͩ͠ߦڥʹαʔϏεݻ༗ͷ੍͕ଟ͍ • e.g. Fastly Compute, Cloud fl are Worker, Vercel Function 16 -
Fastly Compute ͬͯԿͩΑ • Fastlyࣾͷఏڙ͢ΔCDN Edge Computing Service • Previously,
called as fastly Compute@Edge • WebAssemblyʹίϯύΠϧ͞ΕͨΞϓϦέʔγϣϯΛද͖ʹʹ࣮ߦ͢Δ • FastlyͷCDN Cacheͱ౷߹͞Ε͍ͯΔ • ͋Μ·ΓେྔͷܭࢉΛΔͱޙड़ͷ੍ݶʹҾ͔͔ͬΔͷͰBFF༻్͕ओ • ಉࣾͷطଘͷઃఆํ๏ʢFastly VCLʣͱൺͯɺ ͏ͪΐ͍ݱతɾ൚༻తͳϓϩάϥϛϯά͕ग़དྷΔͱ͍͏ҙຯͷ”Compute”ʁ 17 -
F Fastly Compute: Execution Model • 1ͭͷHTTPϦΫΤετʹ͖ͭผʑͷΞϓϦέʔγϣϯΠϯελϯε͕ ཱͬͯফ͑Δ • ຖճΠϯελϯεΛ࡞Γ͢ͷͰɺॳظԽίετΛ͍͔ʹ͑Δ͔͕ॏཁ
• εϨουϓϩηε֓೦ͳ͍ • ϦιʔεநϋϯυϧΛܦ༝ͯ͠ѻ͏ 18 📱 💻 💻 📱 📱 📱 📱 💻 Wasm app Wasm app Wasm app Wasm app Wasm app Wasm app Wasm app Wasm app http http http http http http http Fastly ⚙ ⚙ ⚙ Origin Servers network req -
Fastly Compute: Default Limitations ΞϓϦέʔγϣϯ࣮ߦڥͱͯ͠ͷ੍ • ΞϓϦέʔγϣϯόΠφϦ1ͭ͋ͨΓ100MB • 1ϦΫΤετ͋ͨΓ •
CPU࣌ؒ߹ܭ50ms • ࠷େ࣮ߦ࣌ؒ2min • ελοΫ1MBɾώʔϓ128MB • ؾ͕ͭ͘ͱ੍ͷઆ໌͕ࡉ͔͘ͳͬͯΔ 19 https://docs.fastly.com/products/compute-resource-limits -
Fastly Compute: SDK ։ൃ͢Δʹ • Rust/JavaScript/GoFaslyͷSDK͋Γ • Apache 2.0 LicenseʢLLVMྫ֎߲͖ʣͰϦϙδτϦ͕ެ։͞Ε͍ͯΔ
• RustίʔυͷΈcrates.ioͰެ։ • RubySwift͚ͷSDK࣮ଘࡏ͢Δ • “community support” • ظతʹͲ͏ͳΔ͔Α͘Θ͔ΒΜ • ͔ͳΓੲAssemblyScriptͱ͔͚͋ͬͨͲdeprecated 20 -
Fastly Compute: SDK Ϗϧυུ֓ • ݴޠͷίϯύΠϧλʔήοτΛWebAssemblyʹ͢ΔʢRustGoSwiftʣ • ݴޠඪ४ͷϥϯλΠϜϥΠϒϥϦؙ͝ͱWebAssemblyʹͯ͠ݻΊΔ • ॲཧܥͦͷͷΛWebAssmeblyԽͯ͠ɺͦͷ্ͰϓϩάϥϜΛ࣮ߦ͢ΔʢJSRubyʣ
• ͱ͍࣮͑ߦϞσϧతʹॳظԽίετͳͲ͕όΧʹͳΒͳ͍ • ݁ՌɺϏϧυޙʹॳظԽΛߦ͍ݻΊ͢πʔϧ͕ڬ·͍ͬͯΔ • https://github.com/fastly/js-compute-runtime • https://github.com/bytecodealliance/wizer 21 -
Fastly Compute: Viceroy • ϩʔΧϧΤϛϡϨʔλʢViceroyʣ͕fastly͔Βఏڙ͞Ε͍ͯΔ • ΩϟογϡपΓΛআ͍ͯ؆қతͳಈ࡞ςετͰ͖ΔͷͰɺࣗಈςετ͕࡞Ε Δ • ίʔυҰԠOpen
SourceʢLLVMྫ֎߲͖Apache 2.0 Licenseʣʹ ͳ͍ͬͯΔ͕ɺ࣮ڥͷίʔυͷҰ෦ΛΓग़ͨ͠ͷͰͳ͍Β͍͠ • Wasm࣮ߦ෦wasmtime͕ڞ௨͍ͯ͠ΔͱࢥΘΕΔ͕ɺͦΕҎ֎ʁ • ޓ࣮ͰɺڍಈΛ֬ೝ͢Δ্ͰhostcallΑΓ্͕ಡΊΔͷศར 22 -
Fastly Compute: Wasm Binary Design • WASI + Fastlyઐ༻hostcall •
RustͷSDKͱΤϛϡϨʔλಡΉͷ͕Ұ൪Θ͔Γ͍͢ • 20249݄3ݱࡏͰɺද͖WASI preview 1ϕʔε • ͨͩɺޙड़ͷΤϛϡϨʔλʹWASI preview 2ͷίϯϙʔωϯτϞσϧʹ ม͢͠ίʔυ͕͋Δ • কདྷతʹσϓϩΠ࣌ظʹԠͯ͡ม͢ΔʁΑ͘Θ͔ΒΜ 23 -
Key Points of This Section • CDNͰϑϧϚωʔδυͳHTTPΞϓϦέʔγϣϯΛಈ͔͢FaaSΛ CDN Edge Computing
Serviceͱศٓతʹݺশ • Fastly ComputeWasmʹίϯύΠϧͨ͠ΞϓϦέʔγϣϯΛ ಈ͔ͤΔ • hostcallWASI + ಠ֦ࣗு • εέʔϥϏϦςΟͷͨΊ͔৭ʑ੍͕ଟ͍ 24 -
Outlines 1. Wasm͓ΑͼWASIͷجຊతͳࣝ 2. CDN Edge Computing Serviceͷ֓ཁɺ Fastly Computeͷ࣮ߦϞσϧͱ੍
3. RustΛબͨ͠߹ͷWasmλʔήοτͳΞϓϦέʔγϣϯ։ൃͷհ͞ 4. WasmຊʹʮۀքͷະདྷʯͰศརͳͷ͔ʁ ΞϓϦ։ൃऀ؍Ͱͷॴײ 25 -
Motivation & Background ͜Ε͔Βઆ໌͢Δܦݧஊͷલఏ • ։ൃରB2B͚ͷfastly VCLαʔϏε͔ΒͷҠߦ • ͔ͳΓσΧ͍VCLαʔϏε͕͍ͯɺͦΕ͔ΒͷҠߦ࣮ݧΛ݉ͶΔ •
γεςϜ࠷લஈͰೝূपΓΛ֬ೝͭͭ͠ෳͷόοΫΤϯυΛதܧ͢Δ • ରͷ։ൃӡ༻νʔϜͷୈ1ڞ௨ݴޠJavaScript/TypeScript • ͳΜͰRustʁ 26 -
Why Rust? (1) ศརͰָ͍͠ʂ͚ͩ͡Όͳ͍ • બఆ࣌ɺSDK͔Βར༻Ͱ͖ΔػೳRust͕Ұ൪ଟ͔ͬͨ • Battery Included Toolchain
• Compiler, Type Checker, Formatter, Lint, Unit TestingͳͲશ෦͍ͭͯ͘Δ • Deno͕͍͍ͱ͔Bun͕͍͍ͱ͔Rome͕͍͍ͱ͔ͦ͏͍͏ΛճආͰ͖Δ • Rich Language Features • ໌ࣔతͳΤϥʔϋϯυϦϯάʹΑΔݎ࿚͞ • ύλʔϯϚονͱURLϧʔςΟϯάͷ૬ੑͷྑ͞ • ͚ͬ͜͏ڧྗͳ੩తܕ͚ 27 -
Why Rust? (2) ඇػೳతͳظ • ࣮ߦڥ੍Λߟ͑ΔͱϦιʔεফඅͷΦʔόʔϔουΛճආ͓͖͍ͯͨ͠ • GCͷແ͍ബ͍ϥϯλΠϜϥΠϒϥϦ • ͨͩjs-computeͱ͔ݟͯΔͱᐜ༕ͩͬͨՄೳੑ͋Δ
• WasmʹίϯύΠϧͰ͖ΔϏϧυͷ୯७͞ • γϯάϧεϨου͔ͭྺ࢙తͳ༨ܭͳͷ͕গͳ͍࣮ߦڥͳͷͰɺ RustͷΊΜͲ͍͘͞ͱ͜ΖΛʢ֓ͶʣճආͰ͖Δ • Mutexͷॱংͱ͔ؾʹ͠ͳ͍͍ͯ͘ʂ 28 -
But This Rust is different from your Rust উख͕ҧ͏ •
͑Δcrate͕Α͘Θ͔ΒΜ • Կ͕͑Δ͔exampleूΛோΊͯௐΔ • ఆ൪frameworkʢࠓͦͷ··ʣ͑ͳ͍ • ग़ྗ͞ΕΔόΠφϦαΠζΛؾʹ͠ͳͯ͘ͳΒͳ͍ • ॳظԽίετΛݮΒͨ͢ΊʹίϯύΠϧ࣌ܭࢉΛ݁ߏҙࣝ͢Δ • ίετͷ͔͔Δڞ௨ॳظԽॲཧΛࡁ·͔ͤͯΒσϓϩΠ͢Δ͜ͱ͕Ͱ͖ͳ͍ͷͰ • Ͱݱঢ়ͷRustͷconst fnC++ 23ͷconstexprΑΓ੍͕ݫ͍͠ • Ͱݱঢ়ͷRust GenericsC++ templateΈ͍ͨʹมͳ͜ͱ͕Γʹ͍͘ 29 -
Build is little hard όΠφϦαΠζʹણࡉͳWebαʔόʔΞϓϦϓϩάϥϛϯά • ੜ͞Εͨwasm binaryͷαΠζখ͓͖͍ͯͨ͘͞͠ • ࠓ100MBͷน͚ͩͲɺগ͠લ·Ͱ50MBͷนͩͬͨ
• খ͚͞Εখ͍͞΄Ͳྑ͍ • ͨͩ͠ൃੜ࣌ʹ͢ΔͨΊʹσόοάγϯϘϧ͚͍ͨ 30 -
Build is little hard όΠφϦαΠζʹણࡉͳWebαʔόʔΞϓϦϓϩάϥϛϯά • ෆཁίʔυΛʢϏϧυ࣌ʹʣΕʂ • σόοάϏϧυ֎ʢϦϦʔεϏϧυͩͱ20MBͳͷʹσόοάϏϧυͩ ͱ50MBͱ͔ʣ
• વɺͬͯΔϥΠϒϥϦͷόʔδϣϯΛἧ͑Δͷॏཁ • όʔδϣϯҧ͍ͷಉ໊ϥΠϒϥϦ͕ґଘؔʹ͍ΔͱόΠφϦαΠζ͕૿͑ ΔͷͰΕʂ 31 -
Build is little hard όΠφϦαΠζʹણࡉͳWebαʔόʔΞϓϦϓϩάϥϛϯά • LTOʢLink Time OptimizationʣΛ༗ޮʹͯ͠ແޮίʔυΛߋʹΔ ʢܦݧଇʹجͮ͘όουϊϋʣ
• ϦϦʔεϏϧυͰRustͷσϑΥϧτઃఆͩͱίʔυαΠζΕͳ͍͜ͱ͕͋Δ • ࣮༻্ɺThinLTOͰेͳޮՌ͕ಘΒΕΔ • ͜Ε͚ͩͰग़ྗαΠζ͕20MB -> 10MBͱ͔ͷ͍ͰΕΔ • Rust 1.81ͰWasmు͘߹ɺLTOͳ͠ͷϏϧυ݁ՌΛ-OzΦϓγϣϯ͖ͷwasm- opt (github:WebAssembly/binaryen)ʹ͢ΑΓɺLTOΛ༗ޮʹ͢Δํ͕ΕΔ 32 -
Compile-time feature flag is complex Fastly CLIͷศརͳίϚϯυʹཔΕͳ͍ • RustʹίϯύΠϧ࣌ϑΟʔνϟʔϑϥάͷΈ͕͋ΔͷͰ͍͍ͨ •
production/developmentͷڥͷҧ͍Λ͚Δ • ະίʔυམͱ͍ͨ͠ • ΠϯΫϦϝϯλϧʹίʔυΛมߋ͍ͨ͠ • ……ͦͷͨΊʹfastly CLIͷ”Easy”͔ͭall-in-oneʹϏϧυΛӅṭͯ͘͠ΕΔίϚϯ υແࢹ͢Δ • σϞ༻్ͩͱศར͚ͩͲɺCI༻్ʹඍົʹ͍ʹ͍͘ 33 -
Compile-time feature flag is complex Fastly CLIͷศརͳίϚϯυʹཔΕͳ͍ • fastly CLIʹͬͱ୯ػೳͳίϚϯυ͋ΔͷͰɺ
ͦΕΒΛͬͯࣗͰϏϧυγεςϜΛΈཱͯΔ • όΠφϦͷόϦσʔγϣϯͳͲ୯ػೳαϒίϚϯυʹ͔Ε͍ͯΔͷΛ͏ • ͨͩυΩϡϝϯτͷղઆബ͍ͷͰɺ࣌ʑCLIͷιʔείʔυͱ ᛀΊ͕͍ͬ͜Δ 34 -
Debugging is hard σόοΨͷΞλονʁͦ͜ʹͳ͚Εͳ͍Ͱ͢Ͷ • Wasmtimegdb/lldbΛΞλονͰ͖ΔΑ͏ʹͳ͍ͬͯΔ • ͔͠͠ΤϛϡϨʔλʢViceroyʣͰແޮʹ͞Ε͍ͯΔ • ༗ޮʹͯ͠Ξλον͢ΔͱΤϛϡϨʔλશମ͕ͳ͔ͥࢭ·Δ
• ݪҼࠜਂͦ͏ͳͷͰͯ͠ͳ͍Ͱ͢ • ҰॠChrome Developer Tools ProtocolରԠೖΓͦ͏ʹͳ͚ͬͨͲɺ݁ہೖΒͳ͔ͬͨ • ΄΅printσόοάʹͳΔ • ελοΫτϨʔεͱࣗಈςετͰΛߜΓࠐΊʂ 35 -
Unit Testing is hard ࢥͬͯͨ௨Γʹಈ͔ͳ͍ • RustͷϢχοτςετػߏΛͬͯؔ୯ҐͷςετΛॻ͖͍ͨ߹ɺ fastly SDKϑϦʔͳcrateΛ༻ҙ͢Δඞཁ͕͋Δ •
wasmϑΝΠϧʢී௨ʣͦͷ··࣮ߦͰ͖ͳ͍ • cargo-wasi-testͳΒwasmͷ··RustͷϢχοτςετΛ࣮ߦͰ͖Δ͕ɺ Fastlyݻ༗ͷhostcall͕ग़͖ͯͨॠؒɺunknown import errorͰࣦഊ͢Δ • ͜Ε͕݁ߏײʹ͢Δಈ͖Λ͢Δ • ํͳ͍ͷͰRustͷϢχοτςετػߏϓϥοτϑΥʔϜඇґଘͰ͋Δ͜ͱ͕ ࣗ໌ͳՕॴ͚ͩ༻͍Δ͜ͱʹ…… 36 -
Unit Testing is hard ࢥͬͯͨ௨Γʹಈ͔ͳ͍ • ݁Ռɺ౷߹ςετʹςετઓུΛγϑτ • δΣωϦΫεDIύλʔϯۦͯ͠fastly SDKͷ্ʹಠࣗϑϨʔϜϫʔΫΛ
࡞Δͷ͋Γ͔ • ࠓճͷέʔεͦΕΛΔΑΓ౷߹ςετͷํ͕ظతʹ༗༻ͱஅ 37 -
Integration Testing is a little hard ݁ہ͜Ε͕Ұ൪ݎ࿚ • ౷߹ςετͷ࣮ߦʹςετϥϯφʔɾΤϛϡϨʔλɾ্ྲྀΞϓϦέʔγϣϯα ʔόʔͷڧௐಈ࡞͕ඞཁ
• ࠓճͷέʔεͰνʔϜڥքΛލ͙ɾґଘ͢Δ্ྲྀΞϓϦέʔγϣϯ͕ଟ͘ ςετ্ཱ͕ͪ͛μϧ͍ • ۪ʹΔͱCI͕ॏްେʹͳͬͯ͠·͏ • ϩʔΧϧ࣮ߦ͖͍ͭ • ΞϓϦέʔγϣϯίϯςφҾͬு͖ͬͯͯdocker-compose͢Δෆ࠾༻ 38 -
Integration Testing is a little hard ݁ہ͜Ε͕Ұ൪ݎ࿚ • αʔϏεڥք͕ڥքͰ͋Δ͖ͳͷͰɺ্ྲྀHTTPΞϓϦέʔγϣϯ શ෦ϞοΫͰͳ͍ͱஅ
• ඞཁͳཁૉΛڠௐతʹ্ཱͪ͛ΔͨΊͷεʔύʔόΠβNode.jsͰࣗ࡞ • νʔϜഎܠతʹςετϥϯφʔϞοΫαʔόʔNode.js • CI্ཱͪ͛ͷղܾɻϩʔΧϧͰ࣮ߦ͕؆୯ʹɻ • ౷߹ςετΏ͑ɺཏੑΛ୲อ͢Δʹςετઃܭ͕ॏཁ • ૯ͨΓͷ݁ՌΛεφοϓγϣοτͯࠩ͠ൺֱ͢Δςετέʔε༗༻ 39 -
Performance Optimization is a little hard ωοτϫʔΫI/O͕ࢧతʹͳΓ͕ͪͳͷͰग़൪͕গͳ͍ͷ͕ශऑ͞ͷݪҼʁ • σϓϩΠޙαʔϏεμογϡϘʔυͰ৭ʑϝτϦΫεݟΕΔ͕۩ମੑʹ͚ܽΔ •
CPUϓϩϑΝΠϧΤϛϡϨʔλܦ༝ͰͰ͖Δ • https://pro fi ler. fi refox.com/ ʹ৯Θͤͯؾ߹͍ͰಡΉ • ϝϞϦϓϩϑΝΠϥΤϛϡϨʔλʹͳ͍ • ΤϛϡϨʔλ͕ϦΫΤετ͝ͱʹར༻ώʔϓใΛग़ͯ͘͠ΔͷͰצͰ୳Δ • CPUίετΑΓωοτϫʔΫίετͷ΄͏͕ଟ͍ΞϓϦͩͱͷग़൪গͳ͍͔ • ۩ମతʹࠔΔ·Ͱϩάͷॆ࣮ͱॲཧ۠ؒͷτϨʔγϯάͳͲΛؤுΔํ͕ྑͦ͞͏ 40 -
Observability Instrumentation is hard (probably) ࠓճࠐΈೖͬͨͰ͖ͳ͍ • Server-Timing HTTP headerΛग़ྗ͢Δ͚ͩͳΒ؆୯
• ࣮͢Ε͙͢Ͱ͖·͢ • OpenTelemetryͷinstrumentation͍ͨ͠߹େม͔͠Εͳ͍ • ࠓճͷέʔεͰͦ͜ະνϟϨϯδͳͷͰΑ͘Θ͔ΒΜ • tokio/hyperͷΤίγεςϜଟͦͷ··͑ͳ͍ • JS SDKͩͱ݁ߏ؆୯ʹಋೖͰ͖ΔΒ͍͠ʁ • https://www.fastly.com/jp/blog/opentelemetry-part-3-using-opentelemetry-in-compute-edge/ 41 -
Key Points of This Section • RustWasmΛग़ྗ͢ΔͨΊͷDSLͱͯ͠ศར • ඇಉظI/Oͷͳ͍γϯάϧεϨουRust࠷ߴʢͦΕRust……ʁʣ •
࣮ͨͩ͠ߦڥͷ੍Ͱී௨ͷRustͱҟͳΔՕॴଟ͍ • ಛघͳ࣮ߦڥͰͷ։ൃʹΤϛϡϨʔλ͕ඞਢ • CIߏஙʹඞਢ • ͍ͭͰʹSDKͱΤϛϡϨʔλͷίʔυखݩͷτϥγϡʔʹศརͳͷͰ Open Sourceʹͳ͍ͬͯͯ΄͍͠ 42 -
Outlines 1. Wasm͓ΑͼWASIͷجຊతͳࣝ 2. CDN Edge Computing Serviceͷ֓ཁɺ Fastly Computeͷ࣮ߦϞσϧͱ੍ͷެ։ใʹجͮ͘આ໌
3. RustΛબͨ͠߹ͷWasmλʔήοτͳΞϓϦέʔγϣϯ։ൃͷհ͞ 4. WasmຊʹʮۀքͷະདྷʯͰศརͳͷ͔ʁ ΞϓϦ։ൃऀ؍Ͱͷॴײͱఏݴ 43 -
WebAssembly is Great ຒΊࠐ·ΕΔΞϓϦ։ൃऀઢ • ੩తʹίϯύΠϧ͞ΕͨόΠφϦΛσϓϩΠ͢ΔϞσϧ୯७͔ͭಁաతͰ͖ͩ • όΠτίʔυͷ࠷దԽҎ্ͷม͕͔͔Βͳ͍ɺ͏ଆͷ҆৺ײ • hostcall͕ىɾڥքͱͳΔͷͰΛ͚͍͍ͯ͢
• υΩϡϝϯτΖ͘ʹͳ͍ṖͷಠࣗDSLΑΓɺ ੍͕ಛघ͚ͩͲ͘ීٴͨ͠ߴਫ४ݴޠͰϓϩάϥϜΛॻ͚Δͷศར • όΠφϦϑΥʔϚοτͱͯ͠ͷ؆୯͞ • ྺ࢙తܦҢͷ༨ܭͳͷ͕ࠓͷॴͳ͍ 44 -
WASI is useful? • ϙʔλϏϦςΟ༗Δͱݴ͑༗Δ • ແ͍ͱݴ͑ແ͍ • ݁ہαʔϏεࣄۀऀͷڧྗͳػೳઐ༻hostcallʹͳΓ͕ͪʁ •
ࠩผԽ • ඪ४ԽͱͷλΠϜϥά • ઌߦ࣮͚ͨ͠Ͳඪ४Խͷ݁Ռɺผʹ 45 -
But WebAssembly is nice (again) ຒΊࠐΉଆͷઢ • ৽نʹ੍ݶ͖ͷҙίʔυ࣮ߦͷΈΛ࡞Δଆ͔Β͢Ε͍ͩͿ؆୯ • V8ͰwasmtimeͰwasmerͰࣗ࡞Ͱ͖ͳͷΛͲ͏ͧ
• θϩ͔ΒશͯΛ࡞Δඞཁ͕ͳ͍ • ࠔͬͨ࣌ʹϓϥάΠϯγεςϜΛ࡞Δ࣌ͷग़ൃ • ཚੜͱ͔࣌ࠁऔಘͳͲͷ࠶ൃ໌ͨ͘͠ͳ͍ػೳWASIΛࢀরͰ͖Δ • ΤίγεςϜͷؒआΓ͕ग़དྷΔ 47 -
WebAssemblyΞϓϦ։ൃͷಛ • ༑ਓʮWebAssemblyΈࠐΈ։ൃʹࣅ͍ͯΔʯ • QEMUධՁϘʔυγϦΞϧϙʔτཁΒͳ͍ߴϨΠϠʔͷΈࠐΈ • ΤϛϡϨʔλ͍ͭͩͬͯཉ͍͠͠ඞਢ • ΤϛϡϨʔλ͕͋ΕࣗಈςετCI͕࡞ΕΔ •
CI࡞Γ͍͢ΤϛϡϨʔλͳΒঘخ͍͠ • ίʔυެ։͞ΕͯΔͱخ͍͠ • σόοΨαϙʔτཉ͍͠ • ΞϓϦέʔγϣϯίʔυઃܭɺςετڥ੍ͷద߹ʹڧؔ͘ΘΔ • ςετઃܭॏཁ • ΤϛϡϨʔλΛར༻ͨ͠౷߹ςετͷཏͳͲ 48