2013-11-23 60 views
5

繼續我的illogical question,要求使用OSGi Akka,我被告知,兩者可以一起使用,並且他們每個人都解決不同的問題。我可以使用OSGi提供模塊化和可更新性,Akka提供可擴展性和性能。由於OSGi和Akka相結合還沒有很多實驗,我仍然有幾個問題。OSGi和Akka如何從彼此中受益?這是如何組織的?

OSGi和Akka如何一起使用並互相受益?這是如何組織的?你所有的演員是否都住在一個OSGi包中,他們每個人都得到一個單獨的包,有沒有混合的解決方案,還是沒有真正的「正確」的方法來做到這一點?

我會將大組件分成不同的OSGi包。每個包都有不同的Akka actor。然後可以根據該捆綁上的負載,將每個捆綁分別彼此縮放。在每個包中,可以使用透明負載平衡將負載分散到不同的角色上。 這會是一個正確和現實的方式嗎?實施後

編輯

思考: 他們顯然相得益彰!我將應用程序劃分爲大塊,然後使用Spring注入應用程序的某些部分。在大塊裏面,我單獨使用了Akka。塊的門是類型的演員。爲了使我的系統完全異步,我必須實現一些額外的功能。所以沒有阻塞調用仍然是所有的接口方法都應該返回void類型。找不到任何其他方式。然後,您可以通過接口傳遞一條消息作爲一個屬性,在請求的整個過程中執行該屬性,並在請求開始時將其註冊到「響應者」中。最後,成功返回DeferredResult對象或返回錯誤/超時。

+0

嗨亞瑟,我也在研究這個問題。你能分享自13年11月以來的經歷嗎(例如你的論文)?這會很好。 – Flori

+0

我發佈了一個修改。 –

+0

它足夠清楚了嗎? –

回答

4

以下是我將兩者結合使用的方法。

把它看成是這樣的...

面向對象編程介紹封裝的新的層次。在對象級別(與私人成員)。 OSGi只是啓用JAR級封裝。如果沒有OSGi,只要它編譯完成,它就會融入一鍋。 OSGi在JAR級別強制執行接口。正因爲如此,你具有更清潔的模塊化和更好的代碼(出於同樣的原因,任何類型的封裝都是好的)。

我只使用OSGi來執行JAR級別的封裝。任何重疊的功能,比如根據使用情況擴展某些模塊,我在Akka中都會這樣做,因爲API是更高級別的,因此更容易執行和維護。

但是,關於它們的許多事情並不重疊,所以您應該能夠根據該經驗法則輕鬆查看哪些地方容易出現。

OSGi對我來說只是非常有用的強制執行一個好的設計,因爲它有我如何使用服務的規則......在JAR級執行一個接口。

我想說你的最後一段很好解釋。就像對任何大型軟件進行模塊化一樣。但現在他們是OSGi包。

如果您有後續問題,請發表評論。我可以編輯說更多。我一直在一起使用這兩個現在。

編輯:迴應評論

閱讀你的問題,看來你可能知道有些事情我不知道。我無法確定,所以讓我知道這個帖子是否會漏掉它的標記。我是一個阿卡人,後來做了一些OSGi,如果你這樣做了,你可能會意識到我沒有的選擇。

分享演員系統是微不足道的。 OSGi包不會像框架一樣導致控制反轉。你可以像其他庫代碼那樣調用它。

無論你在哪裏創建actor,都會使用system.actorOf來調用另一個bundle中的actor的類,就是這樣。你的問題似乎意味着你對其他OSGi選項有了更多的瞭解,或者也許正在考慮OSGi會對控制進行反轉,所以每個bundle都會被它自己的actor系統所困住。

如果現在還不清楚,我會推薦一個快速原型。只需通過使用設計的第一個端到端測試,然後重構在OSGi中添加。

+0

謝謝你的解釋。 OSGi和Akka之間的合作是否共同?我在最後一段中的解決方案是否構成這種結構的常用方法,並且是否有時使用其他結構? –

+2

我不確定它是否很常見。但是,如果已經完成但沒有聽說過,這並不會讓我感到驚訝,因爲兩者都是非常常用的工具......並且大多數情況下它們彼此正交。所以這不是一個會在對話中出現的組合。 與Akka一起使用OSGi的方式與您對任何代碼的使用方式相同。我還沒有遇到過任何我需要用Akka做的事的情況,都不同於它是普通的同步代碼。所以,你在OSGi的一本好書中找到的建議,比如OSGi在行動中應該可以工作。對Akka也一樣。它們大多彼此正交。 –

+0

如果可以在多個bundle之間共享ActorSystem,那麼有一個示例(也許在github上,如果它對於SO來說太複雜)會很有用。我設想通過ActorSystem提供服務的某些bundle和其他可以引用它們的bundle(通過ActorSystem的相同實例)向其他bundle中定義的Actor發送消息。 – axiopisty