2012-05-08 54 views
4

用例:一個具有一個或兩個C++進程的Java進程,始終在同一臺機器上。雙向,二進制,非持久通信是必需的。其中一個C++進程負責實例化其他進程。哪個rpc /消息框架最適合這種情況?

我已經給環顧四周,看到的東西,如XML/JSON-RPC,協議緩衝區,節儉,zeromq等

如果可能的話,便攜性將是不錯,但需要的Windows XP/7。

+1

http://activemq.apache.org/ – ant

+0

要看是什麼樣的數據(文本/二進制)你要傳輸,系統的期望吞吐量以及您希望使用哪種API(高級別,如SOAP或低級別,如協議緩衝區/ zeromq)。 –

+0

@Skeptic另外,你需要傳輸層的持久性還是持久性會由端點提供?如果是前者,你將需要類似JMS的東西。 –

回答

9

一般來說,你應該在你的設計中分開消息傳輸和消息反序列化,並儘可能保持正交。簡而言之,將數據(消息)流動行爲從消息內容中分離出來。

  1. 有幾種面向消息的傳輸架構,其允許客戶端/服務器通信(請求/應答的某些行爲模式發送和接收中性的有效載荷數據(消息),發佈/訂閱,推/拉,.. )在線程,進程和網絡服務之間作爲客戶端和服務器實例。
  2. 有一些數字框架可以在傳輸中立(例如,提供用於交換與機器永久性無關的本地整數數據的有線格式)的方式對您的有效負載(消息)數據進行解/序化。
  3. 什麼是您的特定用例的最佳組合選擇,取決於一系列的爲您的設計決策要求和約束你:

    • 可擴展性在客戶端/服務器處理單元的線程,進程或服務器/處理
    • 總體性能和消息延遲
    • 處理單元的資源需求(例如,堆存儲器或代碼大小)
    • 網絡資源的影響(這是什麼經由網絡接口​​發送)
    • 等...

可能的解決方案:
我覺得ZMQ messaging frameworkGoogle Protobuf消息framwework可以爲您的使用情況下,可行的解決方案組合。有(請參閱ZMQ Java binding)的語言綁定,您將擁有用於進程間和線程間通信的優化實現。 ZMQ連接採用類似套接字的方式設計,支持雙向(請求/回覆)通信模式以及單向(發佈/訂閱,推/拉)。

如上所述,消息內容的格式取決於您,但Google Protobuf可能適用於內部定義的消息協議,支持C++和Java語言綁定。 Google Protobuf也提供了一種機制來定義RPC service interfaces,但是您必須爲客戶端/服務器實現提供具體的消息傳輸協議。我從來沒有通過ZMQ運輸來實現這一點,但如果有必要,它應該是可能的。

XML/JSON-RPC可能會考慮發佈(例如,通過REST服務)協議(使用ZMQ橋接相當容易)。

考慮到您的要求,我猜想後面的協議格式選項不是必需的,但可能會有用,但取決於您打算使用的Java/C++參與者的框架。

AFAIK ZMQ與您對Windows XP/7平臺的可移植性約束匹配。不確定,但Windows系統上的線程間通信可能存在限制。但是這似乎並不適用於你所描述的情況。

替代運輸框架:

  1. ActiveMQ
  2. Boost asio(C++包裝了本地插座,我不知道Java方面也隨意加強這方面的信息)

備用信息輸入/解碼框架:

  1. XML-RPC C++/java(通常假定HTTP傳輸)
  2. JSON
+0

「生產就緒」是如何與ZMQ Java綁定? GitHub頁面一見不見。 – Rhangaun

+0

不知道關於java綁定的很多細節,但似乎有人在使用它(我經常閱讀郵件列表)。 –

+0

當你說_不令人信服_時,你指的是什麼。最近的補充是前一段時間,但[問題清單](https://github.com/zeromq/jzmq/issues)似乎並不長。我也在我的答案中提供了一個鏈接到doc主頁面,可能這會幫助您瞭解更多信息。 –

1

根據來自問題評論的信息,我猜想協議緩衝區是需要考慮的事情 - 它在線上具有二進制格式,具有簡單的API並且不提供任何冗餘的東西,例如持久性。

相關問題