heimdallr LINE+ チャット サービス アーキテクチャからインスピレーションを受け、Akka のアクター モデルに基づいて Scala 言語で書かれた大規模なチャット アプリケーション サーバーです。 Redis Pubsub に基づいたフォールトトレラントで信頼性の高いスケールアウト オプションを提供し、概念実証からエンタープライズ対応ソリューションへの拡張をサポートします。大規模システムでは、socket.io よりも少なくとも 100 倍高速であることがテストされています。 heimdallrは現在、現実世界のプロダクションによって強化されており、大量の同時接続をサポートしています。このプロジェクトは、Apache License v2.0 に基づいてライセンスされています。
heimdallrのアーキテクチャは、Akka HTTP サーバー、ストリーム、および ChatRoomActor、UserActor、AggregationActor で構成されます。各 ChatRoom は複数のサーバーに分散できます。サーバー間でメッセージを同期するには、Redis PubSub を使用します。 UserActor は WebSocket クライアントごとに作成されます。
TODO: まだ実装されていません。
以下の HTTP サーバー テストは、wrk ベンチマーク ツールを使用して、単一の m4.large インスタンス上で 6 つのスレッドと 10000 の接続を使用して実行されました。
Node.js | heimdallr | |
---|---|---|
1秒あたりのリクエスト数 | 14533.90 | 20675.89 |
平均レイテンシ | 68.94ミリ秒 | 13.35ミリ秒 |
まとめ | 1.00m で 873389 リクエスト、108.36MB 読み取り ソケット エラー: 接続 8981、読み取り 0、書き込み 0、タイムアウト 0 リクエスト/秒: 14533.90 転送/秒: 1.80MB | 1.00m で 1242244 リクエスト、181.26MB 読み取り ソケット エラー: 接続 8981、読み取り 0、書き込み 0、タイムアウト 0 リクエスト/秒: 20675.89 転送/秒: 3.02MB |
この表は、イベント ブロードキャストのパフォーマンス、メッセージが WebSocket クライアントに到着するまでの平均遅延を示しています。このテストは、HTTP サーバー テストと同じ m4.large インスタンスで実行されました。
Socket.io (単一ノード) | heimdallr (単一ノード) | heimdallrクラスター (2ノード) | heimdallrクラスター (4ノード) | |
---|---|---|---|---|
サブ 10 軒、パブ 1 軒 | 43ミリ秒 | 43ミリ秒 | 16ミリ秒 | 20ミリ秒 |
サブ100、パブ5 | 62ミリ秒 | 61ミリ秒 | 53ミリ秒 | 32ミリ秒 |
1000 サブ、10 パブ | 496ミリ秒 | 390ミリ秒 | 129ミリ秒 | 47ミリ秒 |
1000 サブ、50 パブ | 1304ミリ秒 | 554ミリ秒 | 141ミリ秒 | 109ミリ秒 |
1000 サブ、100 パブ | 2242ミリ秒 | 605ミリ秒 | 202ミリ秒 | 114ミリ秒 |
リポジトリのクローンを作成し、sbt でビルドしてみます。
% sbt run
WebSocket ロード バランサーをセットアップするには、HAProxy または Apache2 HTTPD をプロキシ モジュールとともに使用できます。大量の同時実行をサポートする必要がある場合は、AWS ALB または HAProxy をお勧めします。 Apache2 を使用する場合は、次のコマンドでモジュールを有効にします: sudo a2enmod rewrite proxy proxy_http proxy_wstunnel proxy_balancer lbmethod_byrequests
そして、仮想ホストファイルを以下のように編集します。
<VirtualHost *:80>
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<IfModule proxy_module>
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/
RewriteRule ^(.*)$ /$1 [P]
ProxyRequests Off
ProxyPass "/" balancer://mycluster/
<Proxy "balancer://mycluster">
BalancerMember ws://{ heimdallr _SERVER_ADDRESS_1}:8080
BalancerMember ws://{ heimdallr _SERVER_ADDRESS_2}:8080
</Proxy>
</IfModule>
</VirtualHost>
Redis PubSub を有効にするには、application.conf ファイルを開き、Redis IP アドレスとポートを次のように編集します。
redis-ip = "{REDIS_IP_ADDRESS}"
およびredis-port = 6379
この例では、Java-WebSocket ライブラリが使用されました。
public class WSClientSample extends WebSocketClient {
public WSClientSample ( URI serverURI ) {
super ( serverURI );
}
...
public static void main ( String [] args ) throws Exception {
String uri = ( "ws://APACHE_WEBSERVERR/{CHATROOMID}" );
WSClientSample c = new WSClientSample ( new URI ( uri ));
c . connect ();
}
}
プロジェクトのデモを見るには、 heimdallr /src/main/web
にある既製の WebSocket 接続 HTML ファイルを使用できます。
基本的には Scala スタイルガイドに従います。