高速 (> 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 プロトコルのバッファを少し調べましたが、ビット マスク フィールドのデコードをサポートしているようには見えません。