2012年3月3日土曜日

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

AWSにはElastice Load Balancerというロードバランサがあります。これはとても安いこともあって多くのお客様のwebサービスで使っていただいています。

最近はwebsocketを使いたい!という声もありますが、いくつかの制限により、
ELBは最初のネゴシエーションにだけ使って、ネゴシエーション後のwebsocketにかかわらない方法がおすすめです。

そもそも問題は、

  1. ELBの場合、HTTPモードだとそもそも同じポートのままではwebsocketに遷移できない。

  2. ELBでTCPモードにした場合でも60秒でタイムアウトする。


の2点が原因です。そのため、2つの方法があります。

解1: ELBは最初のネゴシエーションにだけ使って、ネゴシエーション後のwebsocketにかかわらない方法
C ---------> ELB(HTTPモード) --> S   ふつうにHTTPでアクセス。
C <--------- ELB <---- S スクリプトがダウンロードされる

このスクリプトには Sのアドレスpublic ホスト名がそのまま埋めてある
C -------------------> S websocketで接続
C <--------------------S websocketのネゴ

という具合でELBは最初にだけかかわります。

解2: websocketでping/pongを行う

クライアントをいじるのはむずかしいでしょうから、サーバ側からPINGを60秒に一度
はなげることになります。
C ---------> ELB(TCPモード) --> S   ふつうにHTTPでアクセス。
C <--------- ELB <---- S スクリプトがダウンロードされる
C ----------> ELB ------> S websocketで接続
C <---------- ELB <----------S

websocketのpingを以降、たとえば30秒に一度なげます。