Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

WebSocket on AWS (ロードバランサとSocket接続を使用したイベント通知サーバの負荷分散)

29,329 views

Published on

ELBを使用した場合に、WebSocketなどのSocket接続をロードバランシングする方法についての説明です。
(追記:2015年4月10日)
資料を新しいものに更新いたしました。

Published in: Technology

WebSocket on AWS (ロードバランサとSocket接続を使用したイベント通知サーバの負荷分散)

  1. 1. WebSocket on AWS Yuta Imai Solutions Architect, Amazon Data Services Japan, K.K.
  2. 2. WebSocketについて •  リアルタイム/インタラクティブなアプリケーション、特にゲームなどで WebSocketが利用されることが増えている。 •  AWS上での利用事例も増えている。 •  WebSocketでも可用性やスケーラビリティをあげるためにロードバラ ンサーを使いたい! •  トラフィックの性質がHTTPと異なるので、Elastic Load Balancing(ELB)含め、ロードバランサーとの付き合い方を変える必要 がある。
  3. 3. おさらい(1):HTTPとTCPコネクション HTTPではリクエスト/レスポンスごとに空いているTCPコネクションを利用す る(なければ新規作成する) ➔HTTPセッションとTCPコネクションが非依存 GET / HTTP/1.1... HTTP/1.1 200... GET /foo.html HTTP/1.1... HTTP/1.1 200... GET /a.jpg HTTP/1.1... HTTP/1.1 200... コネクション新規作成 空いていれば再利用 空きがなければさらに新規作成 時間
  4. 4. WebSocketはセッションごとにTCPセッションを作成し、セッション中は継続 的に利用する。 ➔アプリケーションのセッションがTCPコネクションに依存する。 ➔アプリケーションのセッションが終了するまでそのTCPコネクションは 専有される。 GET /chat HTTP/1.1 Host: ... Upgrade: websocket Connection: Upgrade HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade message message message message おさらい(2):WebSocketとTCPコネクション 時間
  5. 5. WebSocketとロードバランサー(LB) •  前述のとおり、WebSocketはクライアント・サーバー間でアプリ ケーションのセッション数に応じてTCPコネクションが持続的に専 有される。 •  間にLBを挟むとLBのコネクションも専有してしまう。LBのリソース がボトルネックになり得る。 •  WebSocketはサーバーとクライアントを1対1でセッションを確立さ せ、それを維持して利用する仕組みなので、セッションが確立され てしまえばLBはあまり意味がない。遅延が増加するというデメリッ トもある。 •  セッション確立時だけLBを使うのが上手な付き合い方。
  6. 6. 1. わたしはどこに行けば? 2. 君はApp server2へ! 3. WebSocket接続おねがいしまーす App servers GET /app HTTP/1.1 Host: ... Upgrade: websocket Connection: Upgrade GET /dispatch HTTP/1.1 Host: ... HTTP/1.1 200... ... Goto ws://App server2 セッション確立時だけELBを使うアーキテクチャ コネクション数のレポート Auto Scaling group Dispatchers ディスパッチ時に各サーバー のコネクション状態を確認
  7. 7. このアーキテクチャの利点 •  ロードバランサを挟まないため: –  ロードバランサによるコネクション切断はない –  ロードバランサのポート枯渇等による新規接続の棄却は起きない –  ロードバランサによる遅延の増加は起きない •  負荷(例えばコネクション数)に応じてアプリケーショ ンサーバをスケールさせられる •  ソケットサーバの障害にも対応可能 –  クライアント側で別サーバーに再接続するなどの仕組みも重要
  8. 8. 注意点 •  クライアントのディスパッチ先は別途管理して、アプ リケーションがクライアントに正しく通知できるように する •  アプリケーションサーバの数を減らす際は、コネク ション切断の影響を抑えるため、十分なクールダウ ンをする –  クライアントに再接続を実装することで影響を小さく
  9. 9. 運用のTIPS •  アプリケーション・サーバーは負荷(例えばコネク ション数)に応じてスケールさせる •  アプリケーションサーバの障害への考慮 –  クライアント側で別サーバーに再接続するなどの仕組みが重要。 –  ゲームの場合、そのゲームプレイは一旦終了させ、新たなゲームを 始めてもらうイメージ。
  10. 10. まとめ •  WebSocketを使うときはセッション確立とアプリケー ションセッションを分けて考える •  ELBはセッション確立(ディスパッチャ)側だけで使う
  11. 11. (参考)HTTPとELB セッションがTCPコネクションを専有しないので、LBとEC2の間で少ない TCPコネクションを効率的につかいまわすことができる。
  12. 12. (参考)WebSocketとELB •  現状、ELBはWebSocketをサポートしていない。 –  Socket.ioを使うと動くように見えるが、これは単にSocket.ioがHTTPにFallbackしているだけ •  TCPモードで動かすことにより、セッション開始時のロードバランシングは可能。 •  しかしセッション確立後、クライアントは特定のEC2と継続的に通信し続ける のでLBの意味がない。 •  にも関わらず、ELBのリソース(コネクション)を利用されつづけてしまう ※もしそれでもこの方式をとる場合、ELBには非アクティブなセッションを切断する機能があ るのでこれにも注意が必要。(タイムアウト値は設定可能)

×