7

私は、サーバー(別の場所で実行されている)からのコマンドを待機するために、すべてが開いた(できればHTTP)接続を維持する必要がある潜在的に数百万のクライアントで構成される分散システムを構築しています。メッセージ/コマンドの負荷はそれほど高くはありません。おそらく1メッセージ/秒/1000クライアントです。つまり、1000メッセージ/秒@100万クライアントになります。=>基本的には同時接続についてです。

要件も単純です。一方向メッセージング(サーバー->クライアント)、「チャネル」ごとに1つのクライアントのみ。

私はテクノロジーに関してかなりオープンです(xmpp / websockets / comet / ...)。サーバーとしてGoogleAppEngineを使用していますが、残念ながらそれらの「チャネル」は機能しません(クォータが低すぎてJavaクライアントがありません)。XMPPはオプションでしたが、かなり高価です。これまで私はURLFetch&pubnubを使用していましたが、接続の課金を開始したばかりです(かなりの時間)。

それで:

  1. 手頃な方法で私のためにそれを行うことができるサービスを知っている人はいますか?私が見つけたほとんどの場合、接続の制限または高額な請求があります。

  2. そのようなサーバーを自分で実装した経験はありますか?私は実際にそれをすでに行っており、(TomcatとNIOに基づいて)かなりうまく機能しますが、大規模な負荷テスト環境を実際にセットアップする時間はまだありません(これはまだフォールバックソリューションであるため、私は好みますバトル強化されたメッセージサーバー)。1GBあたり何人のユーザーを獲得したかについての経験はありますか?厳しい制限はありますか?

私のアーキテクチャでは、msgサーバーをフラグメント化することもできますが、msg処理のCPUオーバーヘッドが最小限であるため、同時接続を最大化したいと思います。

4

2 に答える 2

6

その間、netty.ioを使用して独自のメッセージサーバーを実装しました。NettyはJavaNIOを利用しており、非常に優れた拡張性を備えています。アイドル状態の接続の場合、接続ごとに500バイトのメモリフットプリントが得られます。私は非常に単純なメッセージ転送(キャッシュ、ストレージ、その他の凝ったものはありません)のみを行っていますが、小さなアマゾンインスタンス(1ECU / 1.6GB)で1000〜1500 msg /秒(それぞれ0.5 KB)を簡単に取得しています。

それ以外の場合、(有料の)サービスをお探しの場合は、spire.io(接続料金はかかりませんがメッセージあたりの料金が高くなります)またはpubnub(接続料金はかかりますがメッセージあたりの料金は安くなります)をお勧めします。

于 2012-05-25T23:32:30.650 に答える
3

あなたはそのような環境を作るアーキテクチャにもっと目を向ける必要があります。まず、自分でソケット管理を作成する場合は、クライアントソケットごとのスレッドを使用しないでください。データの送受信には非同期方式を使用してください。メッセージが小さい場合、WebSocketは重すぎる可能性があります。ソケットごとに個別にメッセージに適用する必要があるフレーミングを実装しているため(キャッシュはWebSocketプロトコルのさまざまなバージョンで使用できます)、特にデータマスキングのために、受信と送信の両方向の処理が遅くなります。 。

何百万ものソケットを作成することは可能ですが、それができるのは最先端のテクノロジーだけです。Erlangは数百万の接続を処理でき、かなりスケーラブルです。他のより高いレベルのテクノロジーを使用して何百万もの接続を確立したい場合は、達成しようとしていることのクラスタリングについて考える必要があります。

たとえば、すべての処理サーバーを追跡するゲートウェイサーバーを使用します。そしてそれらのデータ(IP、ポート、負荷(1つの内部ネットワークの場合、ファイアウォールとポート転送がここで便利かもしれません)を持っています)クライアントソフトウェアはそのゲートウェイサーバーに接続し、ゲートウェイサーバーは最も負荷の少ないサーバーをチェックしてIPとポートを送信しますクライアントは、提供されたアドレスを使用して、動作中のサーバーへの直接接続を作成します。これにより、認証も処理できるゲートウェイが作成され、接続を長時間保持しないため、そのうちの1つで十分な場合があります。データと接続の維持。

これはニーズに非常に関連しており、ソリューションに適していない可能性があります。

于 2012-04-12T09:14:12.280 に答える