我需要解碼使用JAVA以高速率(> 1000 msgs/sec)進入的二進制消息並將它們存儲在數據庫中(不會決定哪一個)。將有多個TCP連接進入該服務器,每個連接都有自己的需要處理的二進制數據流。使用java解碼二進制消息
消息沒有被任何「標誌」分開。
消息的開始處有一個4字節長的字段。它後面是一個固定的標題。
消息的有效載荷將是反過來多個消息,每個都具有固定報頭和隨後的位掩碼(32位),其確定哪些其他字段存在。每個位掩碼字段是32位,而位32-30(MSB-32/Big endian)指定每個可選字段的長度。所有其他位(29-1),如果「開」表示該字段出現在消息中。
例如,如果比特32-30是100,並且位1爲「1」,則場XXX如下所述位掩碼字段,它是4個字節長。如果位2爲「0」,則消息中不存在字段YYY,依此類推。 存在多個位掩碼字段(可選),但受限於最大數量。 我是新來的java(C/C + +背景),所以問題可能...
1)我想以常規的方式設計的應用程序,「主」線程接收連接,並創建一個「工作者線程A「來處理該套接字上的消息。我正在考慮讓配置文件驅動器「workerThread A」創建一個用於處理每條消息的threadPool還是獨立執行它。我會執行前者並檢查性能,看看是否需要改進。 我的問題是,網狀或阿帕奇米娜不錯的選擇要考慮?由於這是一項POC工作,我需要儘快完成。
2)我想用nio - SocketChannel和ByteBuffer。但似乎我無法從套接字讀取指定數量的字節?我認爲,「readInt()」獲取長度然後從套接字讀取「length」字節數以獲得完整的一條消息然後解析它會更容易。 DataInputStream更好用嗎?使用oio vs nio會對性能產生什麼影響?
3)我應該看看任何框架來解碼消息?我稍微觀察了一下Google協議緩衝區,但看起來好像它不支持解碼位掩碼字段。
謝謝,我這樣走了,但還沒有做過任何性能測試。 – user127091