3

高速 (> 1000 msgs/sec) で受信するバイナリ メッセージをデコードし、JAVAを使用して DB (どれかは未定) に格納する必要があります。このサーバーには複数の TCP 接続があり、それぞれに処理が必要なバイナリ データの独自のストリームがあります。

メッセージは「フラグ」で区切られていません。
メッセージの先頭には、4 バイトの長さフィールドがあります。その後に固定ヘッダーが続きます。

メッセージのペイロードは複数のメッセージになり、それぞれが固定ヘッダーを持ち、その後に他のフィールドが存在するかどうかを決定するビット マスク (32 ビット) が続きます。各ビット マスク フィールドは 32 ビットで、ビット 32 ~ 30 (MSB -32 / ビッグ エンディアン) は、各オプション フィールドの長さを指定します。他のすべてのビット (29-1)。「ON」の場合、フィールドがメッセージに存在することを意味します。

たとえば、ビット 32 ~ 30 が 100 で、ビット 1 が「1」の場合、フィールド XXX はビット マスク フィールドに続き、長さは 4 バイトです。ビット 2 が「0」の場合、フィールド YYY はメッセージに存在しません。複数のビット マスク フィールド (オプション) が存在しますが、最大数によって制限されます。私はJava(c / C ++のバックグラウンド)が初めてなので、質問があるかもしれません...

1)「メイン」スレッドが接続を受け取り、そのソケットでメッセージを処理する「ワーカースレッドA」を作成する通常の方法でアプリを設計することを考えています。「workerThread A」が各メッセージを処理するためのスレッドプールを作成するか、独自に作成するかを構成ファイルで制御できるようにすることを考えています。前者を実装してパフォーマンスをチェックし、改善が必要かどうかを確認します。私の質問は、nettyまたはApache Mina を検討するのに適したオプションですか? これは POC の取り組みであるため、すぐにクランクアップする必要があります。

2) nio - SocketChannel と ByteBuffer を使用することを考えました。しかし、ソケットから指定されたバイト数を読み取れないようですか? 「readInt()」で長さを取得し、ソケットから「長さ」のバイト数を読み取って完全な1つのメッセージを取得してから解析する方が簡単だと思います。DataInputStream は使用するのに適していますか? oio と nio の使用によるパフォーマンスへの影響はありますか?

3) メッセージをデコードするためのフレームワークを調べる必要がありますか? Google プロトコルのバッファを少し調べましたが、ビット マスク フィールドのデコードをサポートしているようには見えません。

4

3 に答える 3

3

接続ごとに 1 つのワーカー スレッドを作成します。

これが十分に高速ではないと判断しない限り、DataInputStream を使用します。パフォーマンスへの影響はわずかですが、1000 メッセージ/秒では問題にならない可能性があります。

JDK を使用して、到着したメッセージをデコードするだけです。この状況で物事を簡単にするサードパーティのライブラリは見つかりませんでした。

于 2012-06-14T17:08:39.040 に答える
2

あなたのケースでは、Apache MINA を検討することをお勧めします。Mina は複数のセッションをうまく管理し、非常にスケーラブルです。非常によく似たケースで使用しており、これまでのところ非常に満足しています。

数千の gsm デバイスからバイナリ メッセージを受信し、それをデコードしてデータベースに保存する MINA を使用するゲートウェイを開発しました。Core2 Duo、4 GB RAM を搭載したサーバーでデータを継続的に送信する 2000 を超える同時セッションで、ゲートウェイの負荷テストを行いました。

Codec Filtersを使用して、デコーダーとエンコーダーを非常にきれいにプラグインできます。ドキュメンテーションも非常に合理的であり、基本的な Java の知識があれば非常に簡単に始めることができます。

于 2012-06-16T08:54:31.457 に答える
1

私なら NIO と Selector モデルを使います。これはあなたが読むことができる記事です(古いですが、まだ関連があります)。

超低レイテンシーを達成したい場合は、新しいオブジェクトを作成する代わりに、再利用できるオブジェクトをプールすることを検討する必要があります。GC は、待ち時間の短いアプリケーションには適していません。

最後に、Google の Protocol Buffers を使用してみます。これらは非常に効率的で、複数の言語から簡単に使用できるからです。

于 2012-06-14T18:27:33.010 に答える