Skip to content

Instantly share code, notes, and snippets.

@you21979
Last active May 10, 2019 01:21
Show Gist options
  • Save you21979/8a8dddf849a1a30e441e to your computer and use it in GitHub Desktop.
Save you21979/8a8dddf849a1a30e441e to your computer and use it in GitHub Desktop.
Websocketのロードバランス

Websocketのロードバランス戦略

問題

websocketに対応していないロードバランサを使うといくつか問題が起きる

  • upgradeヘッダを捨ててしまい接続できない(L7スイッチなど)
  • ポート番号枯渇により新規接続ができなくなる
  • タイムアウトの設定が短いと定期的に切断されてしまう
  • 接続を維持しているとバランスされずに片寄る

選択肢

問題に対応できそうな方法

  • DNS RoundRobbin
  • NGINX websocket proxy
  • node-http-proxy
  • LVS
  • HAProxy
  • 自前で作る

DNS RoundRobbin

良い点

  • DNSの設定だけでできるので楽
  • 接続トラブルとは無縁

悪い点

  • DNSをキャッシュするプロバイタにたくさんユーザがいると、とても片寄る
  • 片寄って悲鳴を上げているサーバを救うことはできない
  • ラウンドロビンしているがいろんなレイヤーでキャッシュされるのでコントロールできない

NGINX websocket proxy

あまり試してないので適当

良い点

  • nginx慣れていれば楽に設定できる

node-http-proxy

あまり試してないので適当

LVS

あまり試してないので適当

HAProxy

あまり試してないので適当

自前で作る

それ程難易度が高くないので自前で作ってもよいのでは

仕様例

クライアント:最初にHTTPでAPIにアクセスし接続するサーバーを取得、そのIPで接続
サーバー:HTTPでアクセスしてきた時に現在WEBSOCKETに繋げてる接続数を見て一番少ないサーバを返す
懸念:グローバルIPアドレスが必要になる

良い点

  • なんでもできる

悪い点

  • 未知のトラブルが発生する
  • 良くも悪くも実装者依存

識者の知見

Elastic Load Balancerをつかってwebsocketを処理する方法

WebSocket アプリの負荷分散

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment