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
避けられないI/O待ちに対処する: Rails アプリにおけるSSEとasync gemの活用...
Search
moznion
September 26, 2025
Technology
0
130
避けられないI/O待ちに対処する: Rails アプリにおけるSSEとasync gemの活用 / Tackling Inevitable I/O Latency in Rails Apps with SSE and the async gem
Kaigi on Rails 2025の発表資料です #kaigionrails
moznion
September 26, 2025
Tweet
Share
More Decks by moznion
See All by moznion
RubyKaigi Hack Space in Tokyo & 函館最速 "予習" 会 / RubyKaigi Hack Space in Tokyo & The Fastest Briefing of RubyKaigi 2026 in Hakodate
moznion
1
180
地に足の付いた現実的な技術選定から魔力のある体験を得る『AIレシート読み取り機能』のケーススタディ / From Grounded Tech Choices to Magical UX: A Case Study of AI Receipt Scanning
moznion
6
4.5k
Chrome Extension Techniques from Hell
moznion
1
230
Simple組み合わせ村から大都会Railsにやってきた俺は / Coming to Rails from the Simple
moznion
4
8.2k
AIレシート読み取り機能をRuby on Rails on AWSで実現するLLMにまつわるアレコレ / AI-based receipt reading function powered by LLM on Ruby on Rails on AWS
moznion
3
970
Develop to Survive - YAPC::Hakodate 2024 Keynote
moznion
11
19k
これはPerl? それともRuby? クイズ〜〜〜〜〜!!!- Perl or Ruby Quiz
moznion
3
2.9k
Perl 5 OOP機構30年史 - Perl 5's OOP Mechanism over the past 30 years
moznion
1
1.1k
RuboCopのカスタムCopを書いてContributionしてみる - Contributing a Custom Cop to RuboCop: A Hands-on Experience
moznion
0
100
Other Decks in Technology
See All in Technology
みん強のこれまでとこれから
genshun9
1
120
【iOSDC Japan 2025】ノーコードアプリプラットフォームを支える Server-Driven UI 〜Block UIアーキテクチャの設計と実装〜
eiji127
1
120
高セキュリティ要件を満たすためのiOSアプリ開発:MASVS v2.0.0対応から学ぶ実践知見
antony_kambara
0
350
開発用LLMインフラをVSCode内で完結させる
ueponx
1
200
5000万ダウンロードを超える漫画サービスを支えるログ基盤の設計開発の全て
ldf_tech
0
410
AIフレンドリーなコードベースを目指して/登壇資料(高橋 悟生)
hacobu
PRO
3
590
「完璧を目指さない」サーバーレス進化論 〜CDKで育てる変化に強いアーキテクチャ〜
yusukeshimizu
4
1.2k
Создание мультиагентной системы на базе AI Studio
shwars
0
140
Create Ruby native extension gem with Go
sue445
0
250
Bedrock AgentCoreで解き放て! Strands Agentsで構築するマルチエージェントの実装Tips
minorun365
PRO
12
1.9k
CTFのためのKubernetes入門
kyohmizu
2
660
How AI agents are changing the way we should build APIs
fabpot
1
340
Featured
See All Featured
Java REST API Framework Comparison - PWX 2021
mraible
33
8.8k
Raft: Consensus for Rubyists
vanstee
140
7.1k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.5k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.1k
Keith and Marios Guide to Fast Websites
keithpitt
411
22k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
5.6k
Embracing the Ebb and Flow
colly
87
4.8k
Automating Front-end Workflow
addyosmani
1371
200k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
248
1.3M
Code Reviewing Like a Champion
maltzj
525
40k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
18
1.1k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
16k
Transcript
ආ͚ΒΕͳ͍I/Oͪʹରॲ͢Δ: Rails ΞϓϦʹ͓͚ΔSSEͱasync gemͷ׆༻ Tackling Inevitable I/O Latency in Rails
Apps with SSE and the async gem
!NP[OJPO !NP[OJPO 4NBSU#BOL *OD 4PGUXBSF&OHJOFFS 5BJLJ,BXBLBNJ !NP[OJPO
X
44&TFSWFSTFOUFWFOUT
44&ͱ ҰΫϥΠΞϯταʔόʔؒͰ )551ͷ44&ίωΫγϣϯΛுΔͱɺ αʔόʔ͔ΒΫϥΠΞϯτʹରͯ͠ ܧଓతʹσʔλΛૹग़Ͱ͖ΔΈ ͬ͘͟Γݴ͏ͱ ౷తʹɺΣϒϖʔδ͕৽ͨͳσʔλΛड͚औΔͨΊʹɺ αʔόʔʹϦΫΤετΛૹ৴͠ͳ͚ΕͳΓ·ͤΜɻ͢ͳΘͪɺ ϖʔδ͕αʔόʔ͔ΒσʔλΛཁٻ͠·͢ɻαʔόʔૹ৴Πϕϯ
τʹΑͬͯɺαʔόʔ͕ΣϒϖʔδʹϝοηʔδΛϓογϡૹ ৴͢Δ͜ͱʹΑΓɺαʔόʔ͔ΒΣϒϖʔδ৽ͨͳσʔλΛ ͍ͭͰૹ৴͢Δ͜ͱ͕Ͱ͖·͢ɻ IUUQTEFWFMPQFSNP[JMMBPSHKBEPDT8FC"1*4FSWFS TFOU@FWFOUT z ௨ৗͷ)551 44&
ͲͷΑ͏ͳঢ়گͰ44&༗ޮ͔ ‣χϡʔεͷΞοϓσʔτ ใ ‣ϩάͷετϦʔϛϯάදࣔ ‣ϝοηʔδϯάɾνϟοτ ‣,P3ͷαϒεΫϦʔϯ̈ ‣͔͔࣌ؒΔॲཧͷʜ
‣ਐḿදࣔ ‣ྃ௨ ྫ ˢ$IBU(1544&Ͱಈ࡞͍ͯ͠Δͱ͍͏ྫ ̈IUUQTHJUIVCDPNLBJHJPOSBJMTTIJSBUBLJ
ͲͷΑ͏ͳঢ়گͰ44&༗ޮ͔ ྫ ˢ$IBU(1544&Ͱಈ࡞͍ͯ͠Δͱ͍͏ྫ ‣χϡʔεͷΞοϓσʔτ ใ ‣ϩάͷετϦʔϛϯάදࣔ ‣ϝοηʔδϯάɾνϟοτ ‣,P3ͷαϒεΫϦʔϯ̈
‣͔͔࣌ؒΔॲཧͷʜ ‣ਐḿදࣔ ‣ྃ௨ ̈IUUQTHJUIVCDPNLBJHJPOSBJMTTIJSBUBLJ
44&˰Ϣʔβʔମݧ্ࢪࡦͷҰछ
Ϣʔβʔମݧ্ࢪࡦͷҰछ ࡢࠓͷΞϓϦͩͱΑ͋͘Δ ‣"1*31$ݺͼग़͠ ‣"* --. ਪ ӈਤϫϯόϯΫΞϓϦͷʮ"*εΫγϣಡΈऔΓػೳʯ ྫ͍ͪ࣌ؒ FH
*0XBJU ͕ൃੜ͢Δॲཧͷਐḿ εΫγϣը૾Λ0$3ͯ͠--.͕ใநग़͢Δػೳ
Ϣʔβʔମݧ্ࢪࡦͷҰछ ࡢࠓͷΞϓϦͩͱΑ͋͘Δ ‣"1*31$ݺͼग़͠ ‣"* --. ਪ ӈਤϫϯόϯΫΞϓϦͷʮ"*εΫγϣಡΈऔΓػೳʯ ྫ͍ͪ࣌ؒ FH
*0XBJU ͕ൃੜ͢Δॲཧͷਐḿ εΫγϣը૾Λ0$3ͯ͠--.͕ใநग़͢Δػೳ ͜͜ʹ͕͔͔࣌ؒΔ
Ϣʔβʔମݧ্ࢪࡦͷҰछ ࡢࠓͷΞϓϦͩͱΑ͋͘Δ ‣"1*31$ݺͼग़͠ ‣"* --. ਪ ӈਤϫϯόϯΫΞϓϦͷʮ"*εΫγϣಡΈऔΓػೳʯ ྫ͍ͪ࣌ؒ FH
*0XBJU ͕ൃੜ͢Δॲཧͷਐḿ εΫγϣը૾Λ0$3ͯ͠--.͕ใநग़͢Δػೳ ͜ͷҰ࿈ͷॲཧΛ44&ʹͯ͠ਐḿΛදࣔ͢Δ
Ϣʔβʔମݧ্ࢪࡦͷҰछ ‣͜ͷΑ͏ͳʮͪʯʹؔ͢Δ࠷దԽͷ༨ݶఆ͞Ε͍ͯΔ ‣ʮݺग़ઌʯͷੑೳΛྑ͘͢Δ͜ͱࠔͳ߹͕ଟ͍ ‣͔͠͠Ϣʔβʔମݧྑ͍ͨ͘͠ ‣44&ͦͷͨΊͷબࢶͷͻͱͭʹͳΓ͑Δ ྫ͍ͪ࣌ؒ FH *0XBJU ͕ൃੜ͢Δॲཧͷਐḿ
3BJMTͰ44&3FTQPOTFΛฦ٫͢Δʹʁ
3BJMTͰ44&3FTQPOTFΛฦ٫͢Δํ๏ ग़లIUUQTBQJSVCZPOSBJMTPSHDMBTTFT"DUJPO$POUSPMMFS-JWF44&IUNM &YBNQMF
؆୯Ͱ͢Ͷ
None
എޙͰͲͷΑ͏ͳ͜ͱ͕ى͍ͬͯ͜Δͷ͔
44&༷͜ͱ͡Ί ҎԼ͕ඪ४༷👇 IUUQTIUNMTQFDXIBUXHPSHNVMUJQBHFTFSWFSTFOUFWFOUTIUNM
44&༷͜ͱ͡Ί ‣جຊతʹ)551Λϕʔεͱͨ͠zϝοηʔδϯάϑΥʔϚοτz ‣8FC4PDLFUͱൺֱͯ͠γϯϓϧͳΈʹͳ͍ͬͯΔ ‣8FC4PDLFUʹΑΔΖΖͷ՝͕)551Λϕʔεʹ͢Δ͜ͱͰ ղܾ͞Ε͍ͯΔ ‣Ұํ44&αʔόʔ͔Βσʔλ͕Ұํతʹϓογϡ͞Εͯ͘ΔΈ 8FC4PDLFUͷΑ͏ͳίωΫγϣϯͰͷํੑແ͍
44&ϓϩτίϧ͜ͱ͡Ί
44&ଓཱ֬ϑΣΠζ
44&ଓཱ֬ϑΣΠζ ‣$MJFOU44&ͷΤϯυϙΠϯτ)551 ϦΫΤετ͢Δ ‣$MJFOUϥΠϒϥϦ෦తʹ44&ଓ ͷεςʔτཧΛߦ͏ ‣4FSWFS௨ৗͷϨεϙϯεͱͯ͠ AUFYUFWFOUTUSFBNAΛฦ٫ͯ͠ 44&ଓΛཱ֬ <
HTTP/1.1 200 OK < cache-control : no-store < content-type : text/event- stream < x-accel-buffering : no < Transfer-Encoding : chunked
ΠϕϯτετϦʔϜॲཧ
ΠϕϯτετϦʔϜॲཧ ‣ετϦʔϜͷจࣈྻ65' ‣ߦࢦͷϝοηʔδϑΥʔϚοτ ‣ۭߦ۠Γ AaOAPSAaSaOA data : first event
id : 1 data : second event id data : third event &YBNQMF
ΠϕϯτετϦʔϜॲཧ ߦͷछผҎԼͷ௨Γ ߦ͕ۭന ۭനߦ ‣σϦϛλͱͯ͠ѻ͍ɺΠϕϯτΛॲཧ͢Δ ߦ͕ίϩϯ͔Β࢝·͍ͬͯΔ ‣ແࢹ͞ΕΔ ϋʔτϏʔτʹศར
ߦʹίϩϯؚ͕·Ε͍ͯΔ߹ ‣ίϩϯʹΑΔ,FZ 'JFME ͱ7BMVFͱͯ͠ ѻ͏ ޙड़ ͦΕҎ֎ ‣ߦશମΛ'JFMEͱۭͯ͠จࣈΛ7BMVFͱ͠ ͯѻ͏
ΠϕϯτετϦʔϜॲཧ ‣ڐՄ͞ΕΔ'JFMEҎԼ ଞແࢹ͞ΕΔ ‣FWFOUҙͷΠϕϯτλΠϓ ‣EBUBҙͷσʔλ ‣JEҰҙͳ*% ‣A-BTU&WFOU*%AͰ࠶ଓ࣌ͷ ࠶։ϙΠϯτͱͯ͠ΘΕΔ
‣SFUSZ࠶ଓ࣌ؒ ϛϦඵ ͦͷଞͷࡉ͔ͳϧʔϧ༷Λࢀর͞Ε͍ͨ
ΠϕϯτετϦʔϜॲཧ ྫ : test stream data : first event
id : 1 data : second event id data : third event ίϩϯ͔Β͡·Δϝοηʔδແࢹ͞ΕΔ ͜ͷϒϩοΫͰԿൃੜ͠ͳ͍
ΠϕϯτετϦʔϜॲཧ ྫ : test stream data : first event
id : 1 data : second event id data : third event EBUB͕ fi STUFWFOU JE͕ ͱͯ͠ϒϩοΫ͕ॲཧ͞ΕΔ
ΠϕϯτετϦʔϜॲཧ ྫ : test stream data : first event
id : 1 data : second event id data : third event EBUB͕TFDPOEFWFOU JE͕ۭจࣈྻ VOTFU ͱͯ͠ϒϩοΫ͕ॲཧ͞ΕΔ
ΠϕϯτετϦʔϜॲཧ ྫ : test stream data : first event
id : 1 data : second event id data : third event EBUB͕UIJSEFWFOU ͱͯ͠ΠϕϯτϒϩοΫ͕ॲཧ͞ΕΔ ۭߦͰऴ͞Ε͍ͯͳ͍ͱΠϕϯτ͕ൃՐ͠ͳ͍
ΠϕϯτετϦʔϜॲཧ ‣ΫϥΠΞϯτۭߦΛσϦϛλͱͨ͠ ΠϕϯτϒϩοΫΛͭͷ୯Ґͱͯ͠ ॲཧ͢Δ ‣EBUB͕ෳ͋Δ߹վߦAaOAͰ ࿈݁͞Εͯ͞ΕΔ data : uno
data : dos data : tres
ΠϕϯτετϦʔϜॲཧ ‣ΫϥΠΞϯτۭߦΛσϦϛλͱͨ͠ ΠϕϯτϒϩοΫΛͭͷ୯Ґͱͯ͠ ॲཧ͢Δ ‣EBUB͕ෳ͋Δ߹վߦAaOAͰ ࿈݁͞Εͯ͞ΕΔ data : uno
data : dos data : tres ͜͜ʹϒϩοΫͷσʔλ͕AVOPaOEPTaOUSFTAͱͯ͠དྷΔ
ΠϕϯτετϦʔϜॲཧ ‣ΫϥΠΞϯτஞ࣍དྷΔFWFOU EBUB JE Λॲཧͯ͠ॴͷػೳΛ࣮ݱ͢Δ ‣࣮༻ྫEBUBʹ+40/͕ೖͬͯ͘ΔͷͰ ΫϥΠΞϯτͦΕΛϨϯμϦϯά ͢Δ ‣SFUSZجຊతʹΫϥΠΞϯτϥΠϒϥ
Ϧ͕έΞ͢Δ
ଓऴྃॲཧ
ଓऴྃॲཧ ‣ΫϥΠΞϯτ͔Β໌ࣔతʹ44&ଓΛ DMPTF͢Δ ‣ྫAFWFOU4PVSDFDMPTF A ‣αʔόʔ͔Β44&ଓΛDMPTF͢Δ ‣ྫATTFDMPTFA ‣ద֬ʹDMPTF͞Εͳ͔ͬͨ߹ ΫϥΠΞϯτ͔Β࠶ଓ͕ߦͳΘΕΔ
جຊతʹΫϥΠΞϯτϥΠϒϥϦ͜ͷΜΛΑ͠ͳʹͬͯ͘ΕΔ ‣ϒϥβʹ͏࣮͕ଘࡏ͍ͯ͠Δ ‣A&WFOU4PVSDFAΠϯλʔϑΣΠε ‣/BUJWF"QQ༻ͷΫϥΠΞϯτෳ͋Δ ग़లIUUQTEFWFMPQFSNP[JMMBPSHFO64EPDT8FC"1*&WFOU4PVSDF
44&ͱඇಉظॲཧ૬ੑ͕ྑͦ͞͏ʹࢥ͍·ͤΜ͔
44&ͱඇಉظॲཧͷ૬ੑ αϯϓϧγφϦΦ αʔόʔଆͰඇಉظͰॏ͍ॲཧΛฒྻԽ͠ɺͦͷਐḿΛΫϥΠΞϯτʹΒͤΔ ϦΫΤετ 44&ଓཱ֬ ฒྻॲཧ ྫ--.ਪ ... ਐḿใࠂ
ྃ௨XDMPTF $MJFOU 4FSWFS --.
44&ͱඇಉظॲཧͷ૬ੑ αϯϓϧγφϦΦ αʔόʔଆͰඇಉظͰॏ͍ॲཧΛฒྻԽ͠ɺͦͷਐḿΛΫϥΠΞϯτʹΒͤΔ 👉*0ͪͷΑ͏ͳ࣌ؒͷ͔͔ΔॲཧʹҰൠʹඇಉظॲཧ͕༗ޮ 44&ʹΑΔද໘తͳମݧͷվળʹՃ͑ ඇಉظॲཧʹΑΔຊ࣭తͳύϑΥʔϚϯεͷվળ͕ݟࠐΊΔ ϦΫΤετ 44&ଓཱ֬ ฒྻॲཧ
ྫ--.ਪ ... ਐḿใࠂ ྃ௨XDMPTF $MJFOU 4FSWFS --.
BTZODHFN
BTZODHFN TPDLFUSZBTZOD "TZODJTBDPNQPTBCMFBTZODISPOPVT*0 GSBNFXPSLGPS3VCZCBTFEPO JPFWFOU 'JCFSΛϕʔεͱͨ͠ΠϕϯτυϦϒϯ*0Λఏڙ ݸਓతʹ७ਮʹॻ͖ຯ͕ྑ͘ɺΈ
z
BTZODHFN 5ISFBE ‣(7-ͷӨڹΛड͚Δ͕ɺ*0ͪͳͲฒྻԽͰ͖Δ ‣ϝϞϦϦιʔεΛ৯͏େྔʹTQBXOͰ͖ͳ͍ 'JCFS ‣ڠௐత ΠϕϯτϧʔϓͱϊϯϒϩοΩϯά*0 ‣ϝϞϦϦιʔεʹର͢Δ༏Ґੑ͕͋Δ
‣$16όϯυͳॲཧฒྻԽͰ͖ͳ͍ ‣ϒϩοΩϯάॲཧ͕ೖΔͱશମΛϒϩοΫ͢Δ ‣ؔ࿈͢Δίϯϙʔωϯτ͕ඇಉظ*0ɾ'JCFS BXBSFͰ͋Δඞཁ͕͋Δ
BTZODHFN 5ISFBE ‣(7-ͷӨڹΛड͚Δ͕ɺ*0ͪͳͲฒྻԽͰ͖Δ ‣ϝϞϦϦιʔεΛ৯͏େྔʹTQBXOͰ͖ͳ͍ 'JCFS ‣ڠௐత ΠϕϯτϧʔϓͱϊϯϒϩοΩϯά*0 ‣ϝϞϦϦιʔεʹର͢Δ༏Ґੑ͕͋Δ
‣$16όϯυͳॲཧฒྻԽͰ͖ͳ͍ ‣ϒϩοΩϯάॲཧ͕ೖΔͱશମΛϒϩοΫ͢Δ ‣ؔ࿈͢Δίϯϙʔωϯτ͕ඇಉظ*0ɾ'JCFS BXBSFͰ͋Δඞཁ͕͋Δ *0ͪաଟͳ λΠϓͷΞϓϦ Ͱ5ISFBEΑΓ εέʔϧ͢Δ Մೳੑ͕ߴ͍
44&ͱΈ߹Θ࣮ͤͨύλʔϯ
44&ͱΈ߹Θ࣮ͤͨύλʔϯ "TZOD2VFVFͱͷ૬ੑ͕ྑͦ͞͏ ‣ATUBSUAͰλεΫΛฒྻॲཧ ‣ྃͨ͠Β44&ͷϝοηʔδΛ "TZOD2VFVFʹFORVFVF ‣AOFYUAͰ44&ϝοηʔδΛ RVFVF͔Βऔಘ
44&ͱΈ߹Θ࣮ͤͨύλʔϯ ͜Μͳײ͡ͰΠςϨʔλతʹ ѻ͏ͱ͍͏ύλʔϯ
"TZODλεΫͷಉ࣮࣌ߦ੍ݶ #BSSJFSͱ4FNBQIPSFΛ Έ߹ΘͤΔͱྑ͍ ‣4FNBQIPSFʹ࠷େฒྻ࣮ߦͱ #BSSJFSΛ༩͑Δ ‣A4FNBQIPSFBTZODAͷதͰ ॲཧ͢Δͱ࣮ߦΛ੍ݶͰ͖Δ ‣A#BSSJFSXBJUAͰྃͪ
XFMMEPDVNFOUFEͰ࠷ߴ ‣ IUUQTTPDLFUSZHJUIVCJPBTZODHVJEFTUBTLTJOEFYIUNMDPNCJOJOHBCBSSJFSXJUIBTFNBQIPSF ‣ IUUQTTPDLFUSZHJUIVCJPBTZODHVJEFTCFTUQSBDUJDFTJOEFYIUNMVTFBUPQMFWFMTZODUPEFOPUFUIFSPPUPGZPVSQSPHSBN
"TZODλεΫͷλΠϜΞτઃఆ A5BTLXJUI@UJNFPVUAΛ͏ͱྑ͍ ‣λΠϜΞτ͠͏ΔॲཧΛ ίʔυϒϩοΫͰ༩͑Δ ‣λΠϜΞτͨ͠Β A"TZOD5JNFPVU&SSPSA্͕͕Δ XFMMEPDVNFOUFEͰ࠷ߴ ‣
IUUQTTPDLFUSZHJUIVCJPBTZODHVJEFTUBTLTJOEFYIUNMUJNFPVUT ‣ IUUQTTPDLFUSZHJUIVCJPBTZODHVJEFTCFTUQSBDUJDFTJOEFYIUNMVTFBUPQMFWFMTZODUPEFOPUFUIFSPPUPGZPVSQSPHSBN
44&ͱΈ߹Θ࣮ͤͨύλʔϯ ΠϨΪϡϥʔ BTZODUBTL͔Β"DUJWF3FDPSE NZTRM ͷίωΫγϣϯΛCPSSPX͢Δͱɺ ಈ࡞தͷ5ISFBEͷίωΫγϣϯΛआ༻͢Δ͜ͱʹͳΔɻ आΓ͖ͯͨ ୯Ұ5ISFBEʹׂΓͯΒΕͨ ίωΫγϣϯΛ'JCFSԣஅͰ
͍ճ͢ͱϦιʔεڝ߹͕ൃੜͯ͠Ϋϥογϡͯ͠͠·͏ɻ ্هͷΑ͏ʹεϨουϓʔϧͱίωΫγϣϯϓʔϧΛซ༻͠ɺ TQBXO͞Εͨ5ISFBE͕%#ίωΫγϣϯΛదʹऔಘ͢ΔXSBQQFSΛ͏͜ͱͰɺ BTZODUBTL͔Β%#Λฒߦʹ৮ΕΔΑ͏ͳղܾΛࢼΈͨɻ ଞʹԿ͔ྑ͍ΞΠσΞ͕͋ΕΓ͍ͨʜʜ 5ISFBEΛ࡞Δͱ'JCFSͷྑ͕͞ݮΔͷͰ
BTZODʹ44&ͱΈ߹Θͤͯ͏ͨΊͷ ػೳ͕શ෦ἧ͍ͬͯͯ͢Β͍͠
͕ͯ͢ղܾ ΊͰͨ͠ΊͰͨ͠
ͱࢥ͍͖࣮ಈ·Ͱ༷ʑͳϒϩοΧʔ͕͋Δ ͋ͬͨ
ϒϩοΧʔ৭ʑϨεϙϯεϔομͷௐ ‣ඪ४༷ͰA$BDIF$POUSPMOPTUPSFAΛ͚Αɺͱ͍͏;͏ʹॻ͍ͯ͋Δ ‣.%/ͷυΩϡϝϯτͰA$BDIF$POUSPMOPDBDIFAΛ͚͍ͯΔ ‣ͲͬͪͶΜ OPDBDIFͰྑͦ͞͏͕ͩʜʜ ‣3FBDUͷϓϩΩγΛ௨͢ͱ44& 4FSWFSTFOUFWFOUT ͷϨεϙϯεΛड͚औΕͳ͍
3FBDU2JJUBΛࢀߟʹ͢ΔͱAOPUSBOTGPSNAΛ͚ͨ΄͏͕ྑͦ͞͏ʹݟ͑Δ ‣ͳͷͰA$BDIF$POUSPMOPDBDIF OPUSBOTGPSNAΛ༩͢Δ͜ͱͰಈ͔͍ͯ͠Δ
ϒϩοΧʔ৭ʑϨεϙϯεϔομͷௐ ‣ϦόʔεϓϩΩγͷόοϑΝϦϯάΛ੍͢ΔͨΊʹA9"DDFM#V ff FSJOHOPA ઃఆ͓ͯ͘͠ ‣͜ͷ͋ͨΓͷௐϦόʔεϓϩΩγͷઃఆͱಉظΛऔΔඞཁ͋Γ ‣࣮ྫ )5510, DBDIFDPOUSPMOPDBDIF
OPUSBOTGPSN DPOUFOUUZQFUFYUFWFOUTUSFBN YBDDFMCV ff FSJOHOP 5SBOTGFS&ODPEJOHDIVOLFE
ϒϩοΧʔ৭ʑϦόʔεϓϩΩγͷઃఆ ྫOHJOYDPOG ‣MPDBUJPOʹӈͷΑ͏ͳઃఆΛ༩͢Δ ‣લܝͷϨεϙϯεϔομͱॏෳ͢ΔՕॴ͋Δ͕ʜʜ ‣ϓϩτίϧతͳಛੑ͔Β44&ʹ͍ͭͯ)551ͷόʔδϣϯΛʹݻఆͯ͠ ͓͘΄͏͕҆શ ‣ϦόʔεϓϩΩγ͕ଟஈͰ͋ͬͨ߹ܦ࿏ͯ͢ͷઃఆΛ͢Δඞཁ͕͋Δ ‣Ұ෦ͷϦόʔεϓϩΩγͰઃఆ͕࿙Ε͍ͯͯಈ͔ͳ͔ͬͨܦݧ͋Γ ഊ
༨ஊϦόʔεϓϩΩεͷઃఆʹΑΓແ௨৴ঢ়ଶ͕ଓ͘ͱίωΫγϣϯ͕ΒΕΔ͜ͱ͕͋ΔͷͰ44&্ͰϋʔτϏʔτΛૹΔඞཁ͕͋Δ߹͕͋Δ
ϒϩοΧʔ৭ʑศརͳ"DUJPO$POUSPMMFS-JWF͕ͩʜʜ AJODMVEF"DUJPO$POUSPMMFS-JWFAͨ͠ίϯτϩʔϥʔͰABQQMJDBUJPOKTPOA ͷΑ͏ͳDPOUFOUUZQF͕ʮී௨ͳʯϨεϙϯεΛฦ٫͠Α͏ͱ͢Δͱ͞Δ ‣"DUJPOͰʮ44&ͷΑ͏ͳTUSFBNJOHʯΛฦ٫͢Δ࣌ίʔυͰ໌ࣔతʹ ADMPTFAͯ͠ϦιʔεΛฦ٫͢Δνϟϯε͕͋Δ ‣Ұํɺී௨ͷϦιʔεΛී௨ʹฦ٫͢Δ FHASFOEFSKTPOA ͱ ADMPTFA͕ݺΕΔػձ͕ແ͍ͨΊϦιʔε͕औΒΕͬͺͳ͠ʹ
👉QVNBUISFBE͕CVTZʹͳͬͯΞϓϦέʔγϣϯશମ͕ετʔϧ͢Δ ˰ैͬͯ44&ͱͦΕҎ֎ͱͰ$POUSPMMFS$MBTTΛ͚Δඞཁ͕͋Δ 3BJMTతʹͪΐͬͱඍົͳݟͨʹʜʜʁ
DPNNJUUFFHFNͷ3FTQPOTF#PEZ7BMJEBUJPO.JEEMFXBSFΛ͏ͱ͞Δ ‣ਖ਼͘͠ݴ͏ͱϨεϙϯεϘσΟΛશ෦ฦ͠ऴ͑Δ·ͰϛυϧΣΞͰόοϑΝͯ͠ ͠·͏ͷͰετϦʔϛϯάॲཧʹͳΒͳ͍ ‣QVNBUISFBE͕CVTZʹͳͬͯΞϓϦέʔγϣϯશମ͕ετʔϧ͢Δ ࠶ొ ‣ৄࡉաڈͷࢿྉ$PNNJUUFF.JEEMFXBSF3FTQPOTF7BMJEBUJPOͰ4USFBNJOH 3FTQPOTF#PEZΛॲཧ͢Δͱ͞Γ·͢ ϒϩοΧʔ৭ʑDPNNJUUFFHFN
Ξο IUUQTHJUIVCDPNJOUFSBHFOUDPNNJUUFFCMPCDGDGFDDBDBDDEGDBCMJCDPNNJUUFFTDIFNB@WBMJEBUPSPQFO@BQJ@SC աڈεϥΠυ͔ΒҾ༻
‣DPNNJUUFFʹݶΒͣϨεϙϯεϘσΟશମΛόοϑΝ͢ΔΑ͏ͳϛυϧΣΞͰ ಉ༷ͷ͕ൃੜ͢ΔՄೳੑ͕͋Δ ‣αʔόʔଆ͚ͩͰͳ͘ΫϥΠΞϯτଆͰى͜ΔՄೳੑ͕͋ΔͷͰҙ ‣ྫ"OESPJEͷ)UUQ-PHHJOH*OUFSDFQUPS ϒϩοΧʔ৭ʑDPNNJUUFFHFN
0QFO"1*ͱ44&ͷ૬ੑ͕͋·Γྑ͘ͳ͍ ‣0QFO"1*͕3&45GVMͳ"1*ఆٛΛهड़͢Δ͜ͱΛओ؟ͱ͍ͯ͠ΔͨΊ 4USFBNJOHͳ44&ͱͷ૬ੑ͕͋·Γྑ͘ͳ͍ ‣ΫϥΠΞϯτͷࣗಈੜࠓ͋ΔҰൠతͳπʔϧͰࠔ ϒϩοΧʔ৭ʑ0QFO"1*
44&ͰϋϚͬͨ࣌ͷτϥϒϧγϡʔςΟϯά
44&ͰϋϚͬͨ࣌ͷτϥϒϧγϡʔςΟϯά ϦΫΤετϔομͱϨεϙϯεϔομΛਅͬઌʹݟΔ ‣ϔομ͕ҧ͍ͬͯΔͱجຊతʹਖ਼ৗʹಈ͔ͳ͍ ‣ ͨ·ʹ࣮ґଘͰ͏͔ͬΓಈ͍ͨΓͯ͠͠·͏͜ͱ͕͋Δ͕ʜʜ
44&ͰϋϚͬͨ࣌ͷτϥϒϧγϡʔςΟϯά ‣ϦΫΤετͱϨεϙϯε͕௨Δܦ࿏ͯ͢ΛνΣοΫ͢Δ ‣ྫ͑ϦόʔεϓϩΩγ͕͋ΔͷʹΞϓϦαʔόʔͱ͚ͩૄ௨ࢼݧͯ͠ҙຯ͕ແ͍
44&ͰϋϚͬͨ࣌ͷτϥϒϧγϡʔςΟϯά ‣ϦΫΤετͱϨεϙϯε͕௨Δܦ࿏ͯ͢ΛνΣοΫ͢Δ ‣ྫ͑ϦόʔεϓϩΩγ͕͋ΔͷʹΞϓϦαʔόʔͱ͚ͩૄ௨ࢼݧͯ͠ҙຯ͕ແ͍ ‣ ܦݧ্ "84ͷ"-#ݪҼʹͳΒͳ͍
44&ͰϋϚͬͨ࣌ͷτϥϒϧγϡʔςΟϯά ‣ϦΫΤετͱϨεϙϯε͕௨Δܦ࿏ͯ͢ΛνΣοΫ͢Δ ‣ྫ͑ϦόʔεϓϩΩγ͕͋ΔͷʹΞϓϦαʔόʔͱ͚ͩૄ௨ࢼݧͯ͠ҙຯ͕ແ͍ ‣ ܦݧ্ "84ͷ"-#ݪҼʹͳΒͳ͍ ͝ΊΜΑʜʜ
44&ͰϋϚͬͨ࣌ͷτϥϒϧγϡʔςΟϯά ‣νϟϯΫαΠζͰΒΕͯ44&ͷίϯςϯπૹΒΕͯ͘Δ͜ͱʹཹҙ͢Δ ‣44&ͷΠϕϯτϒϩοΫ୯ҐͰૹΒΕͯ͘ΔΘ͚Ͱͳ͘ɺ QVNBOHJOYͰઃఆ͞ΕΔνϟϯΫαΠζʹैͬͯૹΒΕͯ͘Δ ‣ΫϥΠΞϯτϨεϙϯεϘσΟΛετϦʔϛϯάͰड͚औΓɺ ͦΕΛόοϑΝ͍͖ͯ͠ͳ͕ΒσϦϛλ͕དྷͨ࣌ʹ 44&ͷΠϕϯτϒϩοΫͱͯ͠QBSTF͢Δඞཁ͕͋Δ
44&ͰϋϚͬͨ࣌ͷτϥϒϧγϡʔςΟϯά ‣UDQEVNQ ύέοτΩϟϓνϟ ΛݟΒΕΔͷ͕Ұ൪ྑ͍ ‣͍Ζ͍Ζͱ໘Ͱ͋Δͷͦ͏ ‣"NB[PO&$4ͷΑ͏ͳίϯςφڥʹࠩ͠ࠐΉํ๏ ‣5-4ʹ્·ΕΔ
ϒϩοΧʔΛऔΓআ͍͍ͯ͘औΓΈ
ϒϩοΧʔ৭ʑศརͳ"DUJPO$POUSPMMFS-JWF͕ͩʜʜ AJODMVEF"DUJPO$POUSPMMFS-JWFAͨ͠ίϯτϩʔϥʔͰABQQMJDBUJPOKTPOA ͷΑ͏ͳDPOUFOUUZQF͕ʮී௨ͳʯϨεϙϯεΛฦ٫͠Α͏ͱ͢Δͱ͞Δ ‣QVNBUISFBE͕CVTZʹͳͬͯΞϓϦέʔγϣϯશମ͕ετʔϧ͢Δ
ϒϩοΧʔ৭ʑศརͳ"DUJPO$POUSPMMFS-JWF͕ͩʜʜ AJODMVEF"DUJPO$POUSPMMFS-JWFAͨ͠ίϯτϩʔϥʔͰABQQMJDBUJPOKTPOA ͷΑ͏ͳDPOUFOUUZQF͕ʮී௨ͳʯϨεϙϯεΛฦ٫͠Α͏ͱ͢Δͱ͞Δ ‣QVNBUISFBE͕CVTZʹͳͬͯΞϓϦέʔγϣϯશମ͕ετʔϧ͢Δ IUUQTHJUIVCDPNSBJMTSBJMTQVMM
DPNNJUUFFHFNͷ3FTQPOTF#PEZ7BMJEBUJPO.JEEMFXBSFΛ͏ͱ͞Δ ‣ਖ਼͘͠ݴ͏ͱϨεϙϯεϘσΟΛશ෦ฦ͠ऴ͑Δ·ͰϛυϧΣΞͰόοϑΝͯ͠ ͠·͏ͷͰετϦʔϛϯάॲཧʹͳΒͳ͍ ‣QVNBUISFBE͕CVTZʹͳͬͯΞϓϦέʔγϣϯશମ͕ετʔϧ͢Δ ࠶ొ ϒϩοΧʔ৭ʑDPNNJUUFFHFN
DPNNJUUFFHFNͷ3FTQPOTF#PEZ7BMJEBUJPO.JEEMFXBSFΛ͏ͱ͞Δ ‣ਖ਼͘͠ݴ͏ͱϨεϙϯεϘσΟΛશ෦ฦ͠ऴ͑Δ·ͰϛυϧΣΞͰόοϑΝͯ͠ ͠·͏ͷͰετϦʔϛϯάॲཧʹͳΒͳ͍ ‣QVNBUISFBE͕CVTZʹͳͬͯΞϓϦέʔγϣϯશମ͕ετʔϧ͢Δ ࠶ొ IUUQTHJUIVCDPNJOUFSBHFOUDPNNJUUFFQVMM ϒϩοΧʔ৭ʑDPNNJUUFFHFN
ϒϩοΧʔ৭ʑDPNNJUUFFHFN 6TBHF&YBNQMF ෦࣮ ؆ུ if strea mi ng_response?(headers)
response = Rack : : BodyProxy.ne w (response) do begin validate(request, status, headers, response) rescue = > e handle_exception(e, request.env) raise e if @raise end end else ෦తʹ3BDL#PEZ1SPYZΛ༻ ৄ͘͠1VMM3FRVFTUΛࢀরͷ͜ͱ
ϒϩοΧʔ৭ʑ0QFO"1* ‣0QFO"1*ͱ44&ͷ૬ੑ͕͋·Γྑ͘ͳ͍ ‣0QFO"1*͕3&45GVMͳ"1*ఆٛΛهड़͢Δ͜ͱΛओ؟ͱ͍ͯ͠ΔͨΊ 4USFBNJOHͳ44&ͱͷ૬ੑ͕͋·Γྑ͘ͳ͍ ‣ΫϥΠΞϯτͷࣗಈੜࠓ͋ΔҰൠతͳπʔϧͰࠔ
ϒϩοΧʔ৭ʑ0QFO"1* ‣0QFO"1*ͱ44&ͷ૬ੑ͕͋·Γྑ͘ͳ͍ ‣0QFO"1*͕3&45GVMͳ"1*ఆٛΛهड़͢Δ͜ͱΛओ؟ͱ͍ͯ͠ΔͨΊ 4USFBNJOHͳ44&ͱͷ૬ੑ͕͋·Γྑ͘ͳ͍ ‣ΫϥΠΞϯτͷࣗಈੜࠓ͋ΔҰൠతͳπʔϧͰࠔ IUUQTHJUIVCDPN0"*0QFO"1*4QFDJ fi DBUJPOEJTDVTTJPOT
ϒϩοΧʔ৭ʑ0QFO"1* ‣0QFO"1*ͱ44&ͷ૬ੑ͕͋·Γྑ͘ͳ͍ ‣0QFO"1*͕3&45GVMͳ"1*ఆٛΛهड़͢Δ͜ͱΛओ؟ͱ͍ͯ͠ΔͨΊ 4USFBNJOHͳ44&ͱͷ૬ੑ͕͋·Γྑ͘ͳ͍ ‣ΫϥΠΞϯτͷࣗಈੜࠓ͋ΔҰൠతͳπʔϧͰࠔ IUUQTHJUIVCDPN0"*0QFO"1*4QFDJ fi DBUJPOEJTDVTTJPOT
ϒϩοΧʔ৭ʑ0QFO"1* ‣0QFO"1*ͱ44&ͷ૬ੑ͕͋·Γྑ͘ͳ͍ ‣0QFO"1*͕3&45GVMͳ"1*ఆٛΛهड़͢Δ͜ͱΛओ؟ͱ͍ͯ͠ΔͨΊ 4USFBNJOHͳ44&ͱͷ૬ੑ͕͋·Γྑ͘ͳ͍ ‣ΫϥΠΞϯτͷࣗಈੜࠓ͋ΔҰൠతͳπʔϧͰࠔ IUUQTHJUIVCDPN0"*0QFO"1*4QFDJ fi DBUJPOEJTDVTTJPOT
ϒϩοΧʔ৭ʑ0QFO"1* ‣0QFO"1*͔ΒA4FRVFOUJBM.FEJB5ZQFTA ͕ಋೖ͞ΕΔ ‣FH ABQQMJDBUJPOKTPOMA AUFYUFWFOUTUSFBNA ‣4FRVFOUJBM.FEJB5ZQFTͷ֤ΞΠςϜͷεΩʔϚΛ AJUFN4DIFNBAͰఆٛͰ͖ΔΑ͏ʹͳΔ ࢀরIUUQTTQFDPQFOBQJTPSHPBTWIUNM
ϒϩοΧʔͰͳ͍͕ศརʹ͍ͯ͘͠औΓΈ
BTZODHFNͷϑοΫVOIBOEMFEͳྫ֎Λϋϯυϧ͢Δ IUUQTHJUIVCDPNTPDLFUSZBTZODQVMM
STQFDTTFNBUDIFST 44&ؔ࿈ͷςετΛॻ͖͘͢͢ΔͨΊͷSTQFDNBUDIFS
STQFDTTFNBUDIFST &YBNQMF
44&पΓࠓͰेʹαϙʔτ͞Ε͍ͯΔ ͋Γ͕͍ͨ ҰํͰͬͯΈΔͱͬͱศརʹͰ͖ΔՕॴ͕͋Δ͜ͱʹؾ͘
44&ʹݶΒͣ ͦͷΑ͏ͳࣄฑʹग़͘Θͨ࣌͠ʹ ίϛϡχςΟʹؐݩͰ͖Δͱྑ͍Ͱ͢Ͷ
ίϛϡχςΟΛҭͯΔͷར༻ऀ
·ͱΊ
·ͱΊ ‣44&ʹ͍ͭͯઆ໌͠·ͨ͠ ‣44&ͷ༗ޮͳ༻్ʹ͍ͭͯઆ໌͠·ͨ͠ ‣44&ͱBTZODΛΈ߹ΘͤͨඇಉظॲཧʹΑΔԸܙɾ࣮ύλʔϯΛઆ໌͠·ͨ͠ ‣ΤίγεςϜΛศརʹͰ͖ΔνϟϯεΛݟ͚ͨΒͲ͠Ͳ͠ߩݙ͍͖ͯ͠·͠ΐ͏
None
ࢀߟใ
ࢀߟใ ‣)5.-4UBOEBSE4FSWFSTFOUFWFOUT IUUQTIUNMTQFDXIBUXHPSHNVMUJQBHFTFSWFSTFOUFWFOUTIUNM ‣4FSWFSTFOUFWFOUT8FC"1*Tc.%/ IUUQTEFWFMPQFSNP[JMMBPSHFO64EPDT8FC"1*4FSWFSTFOU@FWFOUT