2012-06-14 67 views
3

我需要解碼使用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協議緩衝區,但看起來好像它不支持解碼位掩碼字段。

回答

3

我會創建每個連接一個工作線程。

我會用DataInputStream類,除非你確定這是不是足夠快。性能影響很小,但在1000 msg/sec時不太可能發生。

,因爲它到達使用JDK,我只想解碼消息。在這種情況下,我還沒有找到第三方庫來簡化它。

+0

謝謝,我這樣走了,但還沒有做過任何性能測試。 – user127091

1

我會去與NIO和選擇器模型。這是一個article(舊但仍相關),你可以閱讀。

如果您想要實現超低延遲,那麼您應該考慮將可重用的對象集中在一起,而不是創建新的對象。 GC不適合低延遲應用。

最後我會嘗試使用來自Google的Protocol Buffers,因爲它們非常高效且易於使用多種語言。

2

的Apache MINA是你的情況考慮一個非常好的選擇。 Mina非常好地管理多個會話,並且非常可擴展。我們已經將它用於非常相似的情況,到目前爲止我們對此非常滿意。

我們已經開發使用MINA從數以千計的GSM設備的接收二進制消息網關,對其進行解碼,並將其存儲到數據庫中。我們負載測試我們的網關超過2000個併發會話在Core2 Duo,4 GB RAM的服務器上連續發送數據。

可以,很乾淨,塞解碼器和編碼到它使用Codec Filters。文檔也非常合理,您可以通過基本的JAVA知識輕鬆完成jump start