2013-08-05 12 views
2

我們的應用程序的體系結構由多個模塊組成。這些模塊可以作爲單個進程運行,也可以單獨運行在不同的服務器上。當他們在不同的服務器上時,我們使用REST進行模塊之間的交互。現在我們需要處理模塊之間的流數據。一個模塊發送請求 - 另一個模塊異步發回數據塊(對象)。我們試圖使用KryoNet和Apache Mina。我們選擇了最後一個,一般情況下一切正常。但解決方案有幾個問題,並且有一種感覺,我們重新發明了輪子。用於創建異步流API的框架

也許沒有用於創建異步API來傳輸流數據,並且支持多種傳輸以及內置的序列化框架的準備:

  • 地方 - 當模塊/服務的單一進程中的互動
  • 網狀或模擬 - 當所述模塊在不同的機器彼此交互
  • REST - 通過HTTP與模塊交互

小號就像elasticsearch Java API一樣 - 所有操作都可以通過網絡,本地或通過REST異步執行。 是否有創建此類API的現成框架?

我們使用的是Scala 2.10和Java。

+0

vert.x是一個完整的異步通信框架。 –

+0

Vert.x是否支持不同的傳輸和內置序列化來創建如上所述的API? – chardex

回答

0

我建議Scramjet。它可以與你的本地和模擬案例一起工作,但是當給予一個任務時,有多個REST API正在進行中 - 它在這種情況下擴展爲對數,而其他流媒體系統按指數規模(!)擴展。這裏是一個基準scramjet-benchmark on GitHub

它可以用一串簡單的lambda表達式編程,並且基於node.js和所有的異步模塊,你可以在一行中運行所有的REST服務(我建議你嘗試過請求承諾)。一個簡單的例子如下:

const scramjet = require("scramjet"); 
const request = require("request-promise"); 

process.stdin.pipe(new scramjet.StringStream()) 
    .split("\r?\n") 
    .map((uri) => request.get("https://example.com/" + uri)) 
    .filter((data) => data.status === 200 && data.articleUrl) 
    .map((data) => request.get("http://somesite.org/" + data.articleUrl) 
    .accumulate((data) => database.put(data.key, data)) 
    .then(() => console.log('finished')) 

這就是調用兩個API並將結果寫入數據庫的軟件。