Share
Embed
OPENREC.tv におけるライブ動画およびメッセージ配信基盤の全貌 / 20170601_aws_devday_tokyo_openrec
2017/6/1 14:20 ~ 15:00 プリンスホール
[CyberZ] OPENREC.tvにおけるライブ動画およびメッセージ配信基盤のリプレース全貌
http://www.awssummit.tokyo/devday/?id=type#D3T8-3
Taro Hirose
June 01, 2017
Transcript
90 slides
-
Today’s Contents ຊηογϣϯΛ௨ͯ͡ʮϥΠϒʯʹٻΊΒΕΔΞʔΩςΫςΟϯά Λ͝հ͠·͢ ▸ OPENREC.tv ͱ ▸ ಈը৴ͷجຊ ▸
ಈը৴ج൫ͷΞʔΩςΫνϟͱมભ ▸ νϟοτͷجຊ ▸ ϦΞϧλΠϜϝοηʔδ৴ج൫ͷΞʔΩςΫνϟͱมભ ▸ αʔϏεͷΛՃͤ͞ΔͨΊʹ -
whoami ኍ ଠ / Taro Hirose ▸ OPENREC.tv / CyberZ,
Inc. ▸ Backend Engineer ▸ id: @uorat ▸ http://uorat.hatenablog.com -
Today’s Contents ຊηογϣϯΛ௨ͯ͡ʮϥΠϒʯʹٻΊΒΕΔΞʔΩςΫςΟϯά Λ͝հ͠·͢ ▸ OPENREC.tv ͱ ▸ ಈը৴ͷجຊ ▸
ಈը৴ج൫ͷΞʔΩςΫνϟͱมભ ▸ νϟοτͷجຊ ▸ ϦΞϧλΠϜϝοηʔδ৴ج൫ͷΞʔΩςΫνϟͱมભ ▸ αʔϏεͷΛՃͤ͞ΔͨΊʹ -
Today’s Contents ຊηογϣϯΛ௨ͯ͡ʮϥΠϒʯʹٻΊΒΕΔΞʔΩςΫςΟϯά Λ͝հ͠·͢ ▸ OPENREC.tv ͱ ▸ ಈը৴ͷجຊ ▸
ಈը৴ج൫ͷΞʔΩςΫνϟͱมભ ▸ νϟοτͷجຊ ▸ ϦΞϧλΠϜϝοηʔδ৴ج൫ͷΞʔΩςΫνϟͱมભ ▸ αʔϏεͷΛՃͤ͞ΔͨΊʹ -
Today’s Contents ຊηογϣϯΛ௨ͯ͡ʮϥΠϒʯʹٻΊΒΕΔΞʔΩςΫςΟϯά Λ͝հ͠·͢ ▸ OPENREC.tv ͱ ▸ ಈը৴ͷجຊ ▸
ಈը৴ج൫ͷΞʔΩςΫνϟͱมભ ▸ νϟοτͷجຊ ▸ ϦΞϧλΠϜϝοηʔδ৴ج൫ͷΞʔΩςΫνϟͱมભ ▸ αʔϏεͷΛՃͤ͞ΔͨΊʹ Live Streaming Real-Time Messaging -
ಈը৴ େ͖͘ 2 छͷ༻్͕͋Δ ▸ ΦϯσϚϯυ৴ ▸ ࢹௌऀ͕ ݟ͍ͨ࣌ ʹಈըΛࢹௌ͢Δ͜ͱ͕Ͱ͖Δ৴ํ๏
( abbr. VOD ) ▸ On-Demand = ʮཁٻʹԠͯ͡ʯ ▸ ૣૹΓר͖͠ͳͲͷ࠶ੜ੍ޚ͕Մೳ ▸ e.g. ߘಈըɺΞʔΧΠϒಈը / λΠϜγϑτ ▸ ϥΠϒ৴ ▸ ϦΞϧλΠϜ ʹ৴͞Ε͍ͯΔಈըΛࢹௌ͢Δ͜ͱ͕Ͱ͖Δ৴ํ๏ ▸ ϦΞϧλΠϜࢹௌͳͷͰɺجຊతʹө૾ͷ࠶ੜ੍ޚߦ͑ͳ͍͜ͱ͕ଟ͍ -
ಈը৴ ৴ํࣜେ͖͘ 2 छ͋Δ ▸ Progressive Download ▸ Ұͭͷ·ͱ·ͬͨϝσΟΞσʔλΛμϯϩʔυͤ͞Δํࣜ ▸
ϓϨΠϠʔμϯϩʔυͰ͖ͨͱ͜Ζ͔Β࠶ੜ͢Δ ▸ γϯϓϧ͕ͩ՝͋Γ ▸ ϥΠϒ৴ඇରԠ ▸ ϝσΟΞϑΝΠϧͦͷͷΛμϯϩʔυͤ͞ΔͨΊίϯςϯπอޢͷ؍Ͱ͋Γ ▸ Streaming ▸ ϝσΟΞσʔλΛࡉׂ͔ͯ͘͠ɺॱ࣍సૹ / μϯϩʔυͤ͞Δํࣜ ▸ Progressive Download ͱࣅͨΑ͏ʹɺμϯϩʔυͱฒߦͯ͠࠶ੜ͢Δ ▸ ࢹௌதʹσʔλ͕ੜ͞Εଓ͚ΔϥΠϒ৴ʹରԠՄೳ ▸ ΦϯσϚϯυ৴Մೳ -
ಈը৴ ৴ํࣜେ͖͘ 2 छ͋Δ ▸ Progressive Download ▸ Ұͭͷ·ͱ·ͬͨϝσΟΞσʔλΛμϯϩʔυͤ͞Δํࣜ ▸
ϓϨΠϠʔμϯϩʔυͰ͖ͨͱ͜Ζ͔Β࠶ੜ͢Δ ▸ γϯϓϧ͕ͩ՝͋Γ ▸ ϥΠϒ৴ඇରԠ ▸ ϝσΟΞϑΝΠϧͦͷͷΛμϯϩʔυͤ͞ΔͨΊίϯςϯπอޢͷ؍Ͱ͋Γ ▸ Streaming ▸ ϝσΟΞσʔλΛࡉׂ͔ͯ͘͠ɺॱ࣍సૹ / μϯϩʔυͤ͞Δํࣜ ▸ Progressive Download ͱࣅͨΑ͏ʹɺμϯϩʔυͱฒߦͯ͠࠶ੜ͢Δ ▸ ࢹௌதʹσʔλ͕ੜ͞Εଓ͚ΔϥΠϒ৴ʹରԠՄೳ ▸ ΦϯσϚϯυ৴Մೳ VOD / LIVE ͍ͣΕ Streaming ৴͕τϨϯυ -
Live Streaming: Broadcaster Side RTMP w/ H.264/AAC ͷΈ߹Θ͕ͤओྲྀ ▸ RTMP
= Real-Time Messaging Protocol ▸ ࣋ଓଓܕϓϩτίϧ ▸ ಈըɾԻσʔλΛׂͯ͠సૹ ▸ Τϯίʔυ ▸ ΫϥΠΞϯτଆͰө૾ & ԻσʔλΛѹॖ ▸ ө૾ & Իσʔλͷѹॖํ༷ࣜʑ͋Δ ▸ ಈըίʔσοΫ: H.264/MPEG-4 AVC, H.265/HEVC, … ▸ ԻίʔσοΫ: MP3, AAC, WMA, … -
Live Streaming: Broadcaster Side Α͘ΘΕΔ৴ιϑτΣΞ ▸ RTMP = Real-Time Messaging
Protocol ▸ ࣋ଓଓܕϓϩτίϧ ▸ ಈըɾԻσʔλΛׂͯ͠సૹ ▸ Τϯίʔυ ▸ ΫϥΠΞϯτଆͰө૾ & ԻσʔλΛѹॖ ▸ ө૾ & Իσʔλͷѹॖํ༷ࣜʑ͋Δ ▸ ಈըίʔσοΫ: H.264/MPEG-4 AVC, H.265/HEVC, … ▸ ԻίʔσοΫ: MP3, AAC, WMA, … OBS Wirecast -
Live Streaming: Viewer Side HTTP ετϦʔϛϯάܕ͕ओྲྀ ▸ ετϦʔϛϯάܕ ▸ ઐ༻ϓϨΠϠʔϓϥάΠϯ͕ඞཁͱͳΔ
▸ RTMP w/ Adobe Flash ▸ RTSP/RTP w/ Windows Media, ReadMedia, QuickTime …etc ▸ MMS w/ Windows Media ▸ େྔϢʔβʔͷ৴ʹେྔͷ Edge Server ͕ඞཁͱͳΔ ▸ HTTP ετϦʔϛϯάܕ ▸ ׂ͞ΕͨܰྔͳϝσΟΞϑΝΠϧΛ HTTP Ͱ৴ ▸ ϒϥβ / σόΠεඪ४Ͱ࠶ੜՄೳʢͳ͜ͱ͕ଟ͍ʣ ▸ HLS ▸ MPEG-DASH ▸ HDS ▸ Smooth Streaming ▸ Ұൠతͳ Caching ٕज़ΛԠ༻Մೳ ▸ ݴ͍͑Εͨͩͷ HTTP ϑΝΠϧμϯϩʔυ -
Live Streaming: Viewer Side HTTP ετϦʔϛϯάܕ͕ओྲྀ ▸ ετϦʔϛϯάܕ ▸ ઐ༻ϓϨΠϠʔϓϥάΠϯ͕ඞཁͱͳΔ
▸ RTMP w/ Adobe Flash ▸ RTSP/RTP w/ Windows Media, ReadMedia, QuickTime …etc ▸ MMS w/ Windows Media ▸ େྔϢʔβʔͷ৴ʹେྔͷ Edge Server ͕ඞཁͱͳΔ ▸ HTTP ετϦʔϛϯάܕ ▸ ׂ͞ΕͨܰྔͳϝσΟΞϑΝΠϧΛ HTTP Ͱ৴ ▸ ϒϥβ / σόΠεඪ४Ͱ࠶ੜՄೳʢͳ͜ͱ͕ଟ͍ʣ ▸ HLS ▸ MPEG-DASH ▸ HDS ▸ Smooth Streaming ▸ Ұൠతͳ Caching ٕज़ΛԠ༻Մೳ ▸ ݴ͍͑Εͨͩͷ HTTP ϑΝΠϧμϯϩʔυ Amazon CloudFront -
Live Streaming: Viewer Side Adaptive Bitrate Streaming ▸ Ϣʔβʔͷճઢঢ়گʹΑͬͯը࣭Λࣗಈ ௐ͢Δٕज़
▸ ଳҬ෯͕ણࡉͳ Mobile Ͱඞਢ -
Media Server Transcoding Live Streaming: Transcoding ड৴ͨ͠ϝσΟΞσʔλΛ৴༻σʔλʹม 1080p 720p 360p
1080p 720p 360p 1080p 720p 360p HLS MPEG-DASH Smooth Streaming -
Media Server Transcoding Live Streaming: Transcoding Middleware for Live Transcoding
1080p 720p 360p 1080p 720p 360p 1080p 720p 360p HLS MPEG-DASH Adobe Media Server LIVE Smooth Streaming -
Time-Shifting ࢹௌऀ͕ ݟ͍ͨ࣌ ʹಈըΛࢹௌ͢Δ͜ͱ͕Ͱ͖ΔΑ͏ʹ͢Δ͜ͱ Broadcaster Media Server (Ingest / Transcode)
Viewer CDN rtmp http http(s) -
Time-Shifting Live Streaming >> Stop Broadcaster Media Server (Ingest /
Transcode) Viewer CDN media file (e.g. mp4) -
Time-Shifting Live Streaming >> Stop >> Archiving Broadcaster Media Server
(Ingest / Transcode) Viewer CDN media file (e.g. mp4) transcode -
Time-Shifting Live Streaming >> Stop >> Archived = VOD Broadcaster
Media Server (Ingest / Transcode) Viewer CDN media file (e.g. mp4) http(s) http -
ಈը৴ͷجຊݪଇ ʮ͓͕͔͔ۚΔʯ ▸ Processing ▸ τϥϯείʔσΟϯάʹཁ͢Δύϫϑϧͳ Processing Resource ▸ Memory
▸ τϥϯείʔσΟϯά࣌ͷ Buffer ▸ ৴ Caching ▸ Network ▸ ςΩετσʔλͱൺͯαΠζͷେ͖͍ϝσΟΞσʔλ ▸ ෆಛఆଟͷࢹௌऀ ▸ Storage ▸ ςΩετσʔλͱൺͯαΠζͷେ͖͍ϝσΟΞσʔλͷӬଓԽ -
Case: OPENREC.tv OPENREC.tv ͷϥΠϒ৴ͷཁ݅ ▸ ߴը࣭ɾԆ ▸ ϢʔβʔυϦϒϯͷ৴ ▸ ಉ࣌৴৴࣌ؒ৴ऀ࣍ୈ
▸ ू٬ྗ৴ऀ࣍ୈ ▸ ∴ ෛՙ͕ಡΈͮΒ͍ ▸ ಉ࣌ࢹௌऀ ແ੍ݶ ▸ ͍ΘΏΔ “” ແ͍ ▸ શϢʔβʔ͘͠ϥΠϒࢹௌͰ͖Δ͜ͱ ▸ શϥΠϒ৴ ΞʔΧΠϒ ▸ ͍ΘΏΔ “Time Shifting”, VODԽ ▸ ΞʔΧΠϒಈըΛެ։͢Δ͔Ͳ͏͔৴ऀͷࣗ༝ -
Case: OPENREC.tv Architecture: Wowza on EC2 (c4, g2), CloudFront, S3,
ElasticTranscoder Aurora LIVE API https LIVE CORE Broadcastrer ELB EC2 RDS EIP Wowza on EC2 CloudFront Distribution EIP Wowza on EC2 CloudFront Distribution rtmp Broadcastrer rtmp Viewer HLS (https) LIVE ARCHIVE CloudFront Distribution S3 bucket PutObjects Broadcastrer VOD PutObjects CloudFront Distribution S3 bucket ElasticTranscoder -
Case: OPENREC.tv Processing Layer Aurora LIVE API https LIVE CORE
Broadcastrer ELB EC2 RDS EIP Wowza on EC2 CloudFront Distribution EIP Wowza on EC2 CloudFront Distribution rtmp Broadcastrer rtmp Viewer HLS (https) LIVE ARCHIVE CloudFront Distribution S3 bucket PutObjects Broadcastrer VOD PutObjects CloudFront Distribution S3 bucket ElasticTranscoder ▸ GPU Acceleration ▸ w/ g2 instance ▸ ಉ࣌৴ʹԠ֦ͨ͡ுॖୀ੍ޚ ▸ w/ EC2 API -
Case: OPENREC.tv CPU ༻ ͕ 50 ʙ 70% ఔʹ͑ΒΕΔΑ͏ʹ৴Λࢄ Aurora
LIVE API https LIVE CORE Broadcastrer ELB EC2 RDS EIP Wowza on EC2 CloudFront Distribution EIP Wowza on EC2 CloudFront Distribution rtmp Broadcastrer rtmp Viewer HLS (https) LIVE ARCHIVE CloudFront Distribution S3 bucket PutObjects Broadcastrer VOD PutObjects CloudFront Distribution S3 bucket ElasticTranscoder ▸ GPU Acceleration ▸ w/ g2 instance ▸ ಉ࣌৴ʹԠ֦ͨ͡ுॖୀ ੍ޚ ▸ w/ EC2 API -
Case: OPENREC.tv Network Layer Aurora LIVE API https LIVE CORE
Broadcastrer ELB EC2 RDS EIP Wowza on EC2 CloudFront Distribution EIP Wowza on EC2 CloudFront Distribution rtmp Broadcastrer rtmp Viewer HLS (https) LIVE ARCHIVE CloudFront Distribution S3 bucket PutObjects Broadcastrer VOD PutObjects CloudFront Distribution S3 bucket ElasticTranscoder All transfer in AWS ▸ CDN Caching ʹΑΔ Origin ͷ Request ݮ ▸ CDN Edge - Origin ؒͷ Latency ▸ Origin → CDN ؒͷ σʔλసૹඅ༻ ▸ CDN σʔλసૹඅ༻ͷ Volume Discount -
2014 - 2015 ϓϨΠಈըը SDK ࣌ ▸ εϚϗಛԽͷϓϨΠಈըڞ༗αʔϏε ▸ iOS
/ Android ͔Β ը / ฤू / ߘ ▸ ࠾༻ ▸ ࣌ͷ؊ͷ SDK ։ൃʹྗ -
2015 - 2016 ಈըߘ → LIVE ৴ ▸ খ࢝͘͞ΊΔ ▸
ϦʔυλΠϜݮͷͨΊ Zencoder Live Λ׆༻ ▸ େ͖͘ҭͯΔ ▸ 2016 ʹೖΔͱ LIVE ʹྗ ▸ ߴը࣭ɾԆɾඅ༻ʹ͖߹͏ LIVE -
1st Replace in 2016 Mid Replace Transcoder Aurora LIVE API
https LIVE CORE Broadcastrer ELB EC2 RDS EIP Wowza on EC2 CloudFront Distribution EIP Wowza on EC2 CloudFront Distribution rtmp Broadcastrer rtmp Viewer HLS (https) LIVE ARCHIVE CloudFront Distribution S3 bucket PutObjects Broadcastrer VOD PutObjects CloudFront Distribution S3 bucket ElasticTranscoder -
2016 Mid - Later ΞʔΧΠϒػೳͷ՝ײ ▸ VODԽʹཁ͢ΔϦʔυλΠϜ ▸ ϥΠϒऴྃޙʹύοέʔδϯά͞Εͨ mp4
Λ ETS Ͱ ࠶ Transcode ͯ͠ S3 ʹӬଓԽ ▸ ৴͕24࣌ؒʹͳΔͱͯΒΕͳ͍ ▸ Elastic Transcoder ͷඅ༻૿ ▸ ΞʔΧΠϒର શϥΠϒ৴ ▸ ެ։/ඇެ։ ৴ऀͷݖར ▸ ྉۚ ಈը × ৴࣌ؒ ͷֻ͚߹Θͤ -
2nd Replace in 2016 Later Extract by Wowza MPEG-TS Ingestion
Listner API Broadcaster Media Server (Ingest / Transcode) Viewer CDN http(s) On Memory Extract plugin rtmp http -
2nd Replace in 2016 Later Extract by Wowza MPEG-TS Ingestion
Listner API ▸ Wowza Streaming Engine v4.5.0 or later ▸ ϥΠϒ৴தϝϞϦ্ʹ͋Δ HLS Λநग़ ▸ ଈ࣌ΞʔΧΠϒԽΛ࣮ݱ ▸ ΞʔΧΠϒԽͷͨΊͷ࠶ Transcoding අ ༻Λେ෯ݮ ▸ Elastic Transcoder ߘಈըɺෆ҆ఆͳϥΠϒಈ ըͷมʹҾ͖ଓ͖ར༻ -
2017 Early نͷ֦େ ▸ ಉ࣌ϥΠϒ৴ ૿Ճ ▸ 2016 Mid: ʙ
े ▸ 2017 Mid: ʙ ඦ ▸ ͜Εʹ͍ αʔό૿Ճ ▸ ϩʔϦϯά σϓϩΠ / ϝϯςφϯεͷΘ͠͞ ▸ ϥΠϒ৴Λड͚͚ͨ Wowza αʔόΛϥΠϒऴྃ·Ͱམͱͤͳ͍ ▸ ৴ऀ͔Βͷଓ࣋ଓଓ RTMP ▸ ϢʔβʔओಋͷϥΠϒ৴ऴ͕ྃ࣌ؒಡΊͳ͍ LIVE CORE EIP Wowza on EC2 CloudFront Distribution EIP Wowza on EC2 CloudFront Distribution -
Next 3rd Replace Wowza αʔόΛشൃԽ Amazon ECR (Container Registory) Developer
ECS Cluster Broadcaster Container Instance Task (Container) Broadcaster Container Instance Task (Container) Broadcaster Container Instance Task (Container) -
Next 3rd Replace Expire >> Drain >> Stop Container Amazon
ECR (Container Registory) Developer ECS Cluster Broadcaster Container Instance Task (Container) Broadcaster Container Instance Task (Container) Broadcaster Container Instance Task (Container) -
Next 3rd Replace Expire >> Drain >> Stop Container Amazon
ECR (Container Registory) Developer ECS Cluster Container Instance Task (Container) Broadcaster Container Instance Task (Container) Broadcaster Container Instance Task (Container) -
Next 3rd Replace Expire >> Drain >> Stop Container Amazon
ECR (Container Registory) Developer ECS Cluster Container Instance Broadcaster Container Instance Task (Container) Broadcaster Container Instance Task (Container) -
Next 3rd Replace ৴ʹԠͯ͡ Container ͔Β Instance ͔Β EIP/DNS Record
·Ͱ AutoScale Amazon ECR (Container Registory) Developer ECS Cluster RunTask Broadcaster Container Instance Task (Container) Broadcaster Container Instance Task (Container) Broadcaster Container Instance Task (Container) Container Instance -
Next 3rd Replace ϦϦʔε࡞ۀ `docker image push` ͷΈ Amazon ECR
(Container Registory) Developer docker image push ECS Cluster Broadcaster Container Instance Task (Container) Broadcaster Container Instance Task (Container) Broadcaster Container Instance Task (Container) Container Instance -
Next 3rd Replace ͋ͱ৽Πϝʔδ͕উखʹਁಁ͢ΔͷΛ͚ͭͩ Amazon ECR (Container Registory) Developer docker
image push ECS Cluster Container Instance Task (Container) Broadcaster Container Instance Task (Container) Broadcaster Container Instance Task (Container) Broadcaster Container Instance Task (Container) RunTask -
Next 3rd Replace Container Scheduler ▸ EC2/ECS Auto Scaling ૬ੑ͕ѱ͍
▸ RTMP = ৗ࣌ଓ ▸ ෛՙ͕ͯ͘৴͍ͯ͠ΕॖୀͰ͖ͳ͍ ▸ “৴ঢ়گ” ͱ͍͏ಠࣗࢦඪʹج͍ͮͯ εέʔϧͤ͞Δεέδϡʔϥʔ͕ඞཁ -
Container Scheduler 1. ▸ Container Scheduler for Amazon ECS ▸
re:Invent 2016 Ͱެ։͞Εͨ golang OSS ▸ ECS Cluster ༻ͷΧελϜεέδϡʔϥΛ࣮Մೳ ▸ ECS Cluster ͷΠϕϯτݕ ▸ ECS Cluster ͷঢ়ଶ ▸ ΧελϜεέδϡʔϥʔͷ࣮ߦ ▸ REST API ͷఏڙ -
Container Scheduler 2. Amazon ECS Event Stream + Lambda ▸
Amazon ECS ͷλεΫͱίϯςφΠϯελϯεͷঢ়ଶߋ৽Λ hook ʹ Lambda function Λ࣮ߦ Amazon ECS CloudWatch Events Lambda Event Stream Event -
Next 3rd Replace 3. CloudWatch Events (scheduled/1min) + Lambda +
API ECS Cluster Broadcaster Container Instance Task (Container) Broadcaster Container Instance Task (Container) Broadcaster Container Instance Task (Container) Container Instance Aurora LIVE API ELB EC2 RDS CloudWatch Events scheduled 1 minute ec2::RunInstances ecs::RunTask ecs::StopTask ec2::StopInstances … -
Next 3rd Replace 3. CloudWatch Events (scheduled/1min) + Lambda +
API ECS Cluster Broadcaster Container Instance Task (Container) Broadcaster Container Instance Task (Container) Broadcaster Container Instance Task (Container) Container Instance Aurora LIVE API ELB EC2 RDS CloudWatch Events scheduled 1 minute ec2::RunInstances ecs::RunTask ecs::StopTask ec2::StopInstances … Coming soon… -
OPENREC.tv ʹ͓͚Δ Chat Offline - Online ؒͷۭؒڞ༗ ▸ ձͷྟײΛ Online
Ͱٙࣅମݧ ▸ e.g. e-sports Πϕϯτ RAGE ▸ Communication ▸ ৴ऀ - ࢹௌऀ ؒ ▸ ࢹௌऀ - ࢹௌऀ ؒ -
OPENREC.tv ͷνϟοτͷཁ݅ ϦΞϧλΠϜϝοηʔδ৴ج൫ ▸ ϦΞϧλΠϜੑ ▸ Online - Offline ؒͷྟײͷڞ༗
▸ ৴ऀ - ࢹௌऀ, ࢹௌऀ - ࢹௌऀ ؒͷॏཁͳରखஈ ▸ ߴ֦ுੑ ▸ ಉ࣌ࢹௌऀ૿ʹैͰ͖ΔεέʔϥϏϦςΟ ▸ ؒʹूத͢ΔϥΠϒ৴ -
OPENREC’s Chat in 2015 1st Architecture: Node.js (WebSocket) + Redis
(Pub/Sub) + API (ELB / EC2) Chat API https WebSocket Cluster ELB EC2 RDS EIP Node.js on EC2 EIP Node.js on EC2 ElastiCache for Redis (Pub/Sub) wss wss Viewer -
Chat API https WebSocket Cluster ELB EC2 RDS EIP Node.js
on EC2 EIP Node.js on EC2 ElastiCache for Redis (Pub/Sub) wss wss Viewer OPENREC’s Chat in 2015 1st Architecture: Node.js (WebSocket) + Redis (Pub/Sub) + API (ELB / EC2) ▸ WebSocket ଓΛࣗ࡞ API Ͱࢄ ▸ ELB (Classic) ͕ WebSocket ඇରԠͷͨΊ -
Chat API https WebSocket Cluster ELB EC2 RDS EIP Node.js
on EC2 EIP Node.js on EC2 ElastiCache for Redis (Pub/Sub) wss wss Viewer OPENREC’s Chat in 2015 1st Architecture: Node.js (WebSocket) + Redis (Pub/Sub) + API (ELB / EC2) ▸ API ͔Βฦ͞ΕΔ endpoint ʹ WebSocket ଓཱ֬ ▸ Message Hub ʹ ElastiCache for Redis Λ࠾༻ -
OPENREC’s Chat After 1 year … Chat API https WebSocket
Cluster ELB EC2 RDS EIP Node.js on EC2 EIP Node.js on EC2 ElastiCache for Redis (Pub/Sub) wss wss Viewer Θ͕͠͞ग़ ▸ Not AutoScaling ▸ EIP + DNS record ▸ SSL αʔό ূ໌ॻߋ৽ Redis Cluster Λࢄ͍ͤͨ͞ ▸ Pub/Sub ૿ -
OPENREC’s Chat Replaced Architecture Chat API https WebSocket Cluster ELB
(CLB) EC2 RDS ELB (ALB) wss Viewer Aurora Node.js Cluster w/ AutoScaling ElastiCache for Redis (Pub/Sub) Target Group Node.js Cluster w/ AutoScaling ElastiCache for Redis (Pub/Sub) Target Group -
OPENREC’s Chat Replaced Architecture Chat API https WebSocket Cluster ELB
(CLB) EC2 RDS ELB (ALB) wss Viewer Aurora Node.js Cluster w/ AutoScaling ElastiCache for Redis (Pub/Sub) Target Group Node.js Cluster w/ AutoScaling ElastiCache for Redis (Pub/Sub) Target Group ▸ Contents Based Routing Λ׆༻ͨ͠ Sharding ▸ wss ଓऴʹΑΔӡ༻ ෛՙݮ -
OPENREC’s Chat Replaced Architecture Chat API https WebSocket Cluster ELB
(CLB) EC2 RDS ELB (ALB) wss Viewer Aurora Node.js Cluster w/ AutoScaling ElastiCache for Redis (Pub/Sub) Target Group Node.js Cluster w/ AutoScaling ElastiCache for Redis (Pub/Sub) Target Group ▸ AutoScaling ׆༻ʹΑΔӡ༻ෛՙݮ ▸ Middleware Version up ▸ Node.js ▸ Socket.IO -
Point of WebSocket Application w/ AutoScaling Scaling ʹ͓͍ͯز͔ͭͷҙ͕ඞཁ ▸ ૣΊʹεέʔϧΞτͤ͞Δ
▸ WebSocket = ࣋ଓଓܕϓϩτίϧ ▸ ෛՙ͕ภΓ͗͢ͳ͍Α͏ʹૣΊʹεέʔϧΞ τͤ͞Δͱྑ͍ ▸ ॏཁͳࢦඪ ▸ ಉ࣌ଓ ▸ ϝοηʔδྲྀྔʢPub/Sub සʣ ▸ ϝοηʔδαΠζ -
Point of WebSocket Application w/ AutoScaling Scaling Policy ▸ γϯϓϧʹ
CPU Utilization ͕͓͢͢Ί ▸ ᮢΛݫ͠Ίʹ ૣΊʹ Scale out ▸ Increase හײʹ Decrease ؇͘ ▸ ϐʔΫଳΠϕϯτ͕ಡΊΔ߹ Scheduled Policy ͕༗ޮ -
Caution of ALB w/ WebSocket ▸ ༧ظͤ͵࠶ଓʹඋ͑Δ ▸ ALB ෦ϊʔυ͕
Scale up / out ͢ΔλΠϛϯάͰҰ੪அͱ࠶ଓ͕Δ ▸ onConnect, onDisconnect ͷίʔϧόοΫॲཧྲྀྔ੍ޚ͓ͯ͘͠ͱྑ͍ ▸ Stickness ༗ޮԽ ( Socket.IO ͷ߹) ▸ Handshake ॲཧ ʙ Upgrade ·Ͱͷ xhr-polling ௨৴࣌ʹඞཁ ▸ client ʹΑͬͯ Upgrade ࣌ʹ Cookie ͕Βͣ Stickness ͕ޮ͔ͳ͍ࣄ͕͋Δ ▸ socket.io-client-swift, socket.io-client-java Ͱ֬ೝ ▸ جຊ Stickness Λ༗ޮԽ͠ɺϥΠϒϥϦʹԠͯ͡ forceWebSocket ͯ͠ճආ͢Δ -
Requests to ALB ▸ Sticky Session ͷ Custom Cookie ࢦఆ
▸ CLB ͰՄೳ ▸ ALB ෦ͷεέʔϦϯάͷಈ࡞ΛγϡϛϨʔγϣϯ͍ͨ͠ ▸ ෦ϊʔυͷ Scale up / out / in ͕ൃੜͨ͠߹ͷɺΞϓϦέʔγϣϯʹ༩͑ΔӨڹ֬ೝ ▸ Leastconn Balancing Rule ▸ ࠷ଓͷগͳ͍όοΫΤϯυʹ༏ઌతʹ Balancing ͍ͨ͠ ▸ ಛʹ WebSocket ͷΑ͏ͳৗ࣌ଓܕ௨৴ͷෛՙΛۉࢄ͍ͨ͠ -
RUNNING LEAN ελʔτΞοϓʹ͓͚Δ3ͭͷεςʔδ ՝ / ղܾ ϑΟοτ / ࢢ
ϑΟοτ ֦େ ूதɿݕূʹΑΔֶश ࣮ݧɿϐϘοτ ूதɿ ࣮ݧɿ࠷దԽ -
RUNNING LEAN ֶशʹඞཁͳ ࠷ඞཁͳ͜ͱΛΔ ՝ / ղܾ ϑΟοτ /
ࢢ ϑΟοτ ֦େ ूதɿݕূʹΑΔֶश ࣮ݧɿϐϘοτ ूதɿ ࣮ݧɿ࠷దԽ ▸ ήʔϜϓϩϞʔγϣϯͷͱޮՌ্ͱ͍͏໋ ▸ ϓϨΠಈըڞ༗ͱ͍͏ݕূ ▸ εϚϗಛԽ / SaaS ׆༻ / SDK ूத -
RUNNING LEAN ֶशʹඞཁͳ ࠷ඞཁͳ͜ͱΛΔ ՝ / ղܾ ϑΟοτ /
ࢢ ϑΟοτ ֦େ ूதɿݕূʹΑΔֶश ࣮ݧɿϐϘοτ ूதɿ ࣮ݧɿ࠷దԽ ▸ LIVE ৴ʹϐϘοτ ▸ SaaS ׆༻, 2 week Chat࣮, UI/UXूத -
RUNNING LEAN Grow larger, Small Start ՝ / ղܾ ϑΟοτ
/ ࢢ ϑΟοτ ֦େ ूதɿݕূʹΑΔֶश ࣮ݧɿϐϘοτ ूதɿ ࣮ݧɿ࠷దԽ ▸ Ϣʔβʔٸ૿ ▸ LIVE & CHAT ج൫ͷ࠷దԽ -
LEAN STARTUP ։ൃ - ܭଌ - ֶश ͷαΠΫϧΛԿʹ͘ճͤΔ͔ IDEAS CODE
DATA LEARN MEASURE BUILD -
Why rebuild 4 times? “The Perfect is often the enemy
of the good” -
Why rebuild 4 times? “The Perfect is often the enemy
of the good” ϏδωεඪΛୡ͢ΔͨΊͷ ޮతͳಓےΛඳ͘͜ͱ