You are on page 1of 36

ELB를 활용한 socket.

io 멀티노드
구축사례
2017.12.27

박상원 (DeepNatural, Inc.)

anson@deepnatural.io
www.linkedin.com/in/ansonswpark
Zamir
Live Match

WebRTC Signaling
Text Chat
실시간 통신 필요
Socket.IO
구현이 간편하고
성능 좋은 비동기 서버
클라이언트 라이브러리도 훌륭함
+
익숙함
Minimum
Viable

Product

3달만에 MVP 출시
iOS iOS
Client Client

HTTP/HTTPS Mode
ELB
TCP/SSL Mode
RESTful API

Django
DRF
uWSGI
Nginx Socket.IO

EC2 Single Node


정식버전 개발시작
Premium Features
In app purchase
..

Multi Node Socket.IO


ELB 뒤에 Node 추가
iOS iOS
Client Client

HTTP/HTTPS Mode
ELB
TCP/SSL Mode

Socket.IO Socket.IO Socket.IO

EC2 EC2 EC2


Handshake
iOS iOS
Socket.IO != WebSocket Client Client
Multiple Requests
Mixed HTTP & TCP

HTTP/HTTPS Mode
Sticky Session X ELB
TCP/SSL Mode

Socket.IO Socket.IO Socket.IO

EC2 EC2 EC2


Application Load Balancer
Launched on August 11, 2016
iOS iOS
Client Client

ALB Cookie-based Stickiness

Socket.IO Socket.IO Socket.IO

EC2 EC2 EC2


iOS iOS
Client Client

Handshake fails
Cookie handling issue on Socket.IO
client Swift Implementation? ALB Cookie-based Stickiness

Certificate issue?

Socket.IO Socket.IO Socket.IO

EC2 EC2 EC2


Working on Working on
vs
Socket.IO Swift Client Proxy for Sticky Session

• 클라이언트 개발을 99.9% 마친 상태. • Sticky Connection만 보장되면 문제 해


• 클라이언트 수정이 부담됨 결됨이 명확
• 추후 안드로이드 클라이언트에서 같은 이 • 서비스 로직 코드 수정 불필요
슈가 발생한다면? • 프록시 설정되면, 추후 노드 내에 멀티
• 작업 시간 예측이 어려움 프로세스 운영 가능
Googling
Best Practice
Load-balancing Websockets on EC2
https://medium.com/@Philmod/load-balancing-websockets-on-ec2-1da94584a5e9
Load-balancing Websockets on EC2
https://medium.com/@Philmod/load-balancing-websockets-on-ec2-1da94584a5e9

HAProxy가 클라이언트 IP Address 기반 Sticky Connection 제공할 수 있도록 ELB


에 Proxy Protocol 활성화

aws elb create-load-balancer-policy —load-balancer-name elb-storifyeditor


—policy-name EnableProxyProtocol —policy-type-name ProxyProtocolPolicyType
—policy-attributes AttributeName=ProxyProtocol,AttributeValue=True

aws elb set-load-balancer-policies-for-backend-server —load-balancer-name


elb-storifyeditor —instance-port 3030 —policy-names EnableProxyProtocol
iOS iOS
Client Client

TCP Mode
ELB Proxy Protocol Enabled

HAProxy HAProxy HAProxy

Socket.IO Socket.IO Socket.IO


Messaging
between Nodes
A B

다른 노드에 붙은 두 클라이언트 A, B.
ELB
A에서 B로 메시지 보내기 불가능

HAProxy HAProxy HAProxy

Socket.IO Socket.IO Socket.IO


A B

ELB

HAProxy HAProxy HAProxy


ElastiCache
+
Socket.IO Redis Adapter

Socket.IO Socket.IO Socket.IO

ElastiCache
Redis Cluster
https://github.com/socketio/socket.io-redis
Deployment
iOS iOS
Client Client

TCP Mode
ELB Proxy Protocol Enabled

HAProxy HAProxy HAProxy Fabric Script


Code deploy

Launch new instance


Socket.IO Socket.IO Socket.IO Socket.IO setup
HAProxy setup & update

ElastiCache
Redis Cluster
iOS iOS
Client Client

TCP Mode
ELB Proxy Protocol Enabled

HAProxy HAProxy HAProxy Fabric Script


Code deploy

Launch new instance


Socket.IO Socket.IO Socket.IO Socket.IO setup
HAProxy setup & update

ElastiCache
Redis Cluster
서비스가 다음 단계로
성장한다면
Auto Scaling Real-Time NodeJS Applications on
AWS — The last tutorial you’ll need!

https://medium.com/@eyalronel1984/auto-scaling-real-
time-nodejs-applications-on-aws-the-last-tutorial-youll-
need-eba1d2c88a4c
자미르 메이저 업데이트 커밍순

https://zamir.io/
talk

anson@deepnatural.io
www.linkedin.com/in/ansonswpark

You might also like