當前位置:
首頁 > 最新 > Orbit框架解析

Orbit框架解析

Orbit是在JVM上的一個使用虛擬actor來做分布式系統的框架。它使得開發者在開發分布式和易擴展的應用的時候,能夠極大簡化系統的集群、服務發現、網路、狀態管理、actor生命周期等特性的開發。

Orbit是由EA(對,就是那個著名遊戲公司)的下屬遊戲子公司Bioware(開發了無冬之夜、質量效應等優秀遊戲)開發並開源的,這個框架的靈感是由微軟的Orleans框架得來的,其目前的版本是1.1.0,這個版本優化了本地緩存,其使用了caffeine cache,增強了KryoSerializer,並優化了一些性能。Orbit所需的環境是java8、maven3.1及以上。Orbit這個框架目前在github上有超過一千的star,不算太小眾,而且還獲得了2016年的Duke s Choice Award for Open Source,所以還是值得一看的。

Orbit的一個重要組件是actor,actor之間的通信都是通過非同步消息來交互的,Orbit確保一個actor不會同時被並行調用,這樣開發者就不用擔心actor的並發訪問問題,但是如果開發者使用@Reentrant這個annotation來標識actor的話,當服務被阻塞時就能夠讓另一個請求進來(其實還是只有一個線程在活動)。創建一個actor時必須得先創建一個介面,如下,這個interface必須extends Orbit的Actor介面,然后里面定義的方法的返回類型必須是Orbit的Task類。Task類對CompletableFuture進行了簡單的封裝,可見Actor的方法都是通過非同步回調方式來處理的。

public interface Chat extends Actor { @OneWay Task say(ChatMessageDto message); Task join(ChatObserver observer); Task leave(ChatObserver observer); Task getHistory(int messageCount); }

然後你得創建一個類來實現上述介面,如下,這個類得extends Orbit的AbstractActor抽象類,並且這個類一次只能實現一個actor的介面。

public class ChatActor extends AbstractActor implements Chat { private int maxMessages = 1000; private long lastSave; public static class State { ObserverManager observers = new ObserverManager(); LinkedList history = new LinkedList(); } @Override public Task say(final ChatMessageDto message) { System.out.println(message.getMessage()); if (getLogger().isDebugEnabled()) { getLogger().debug("Message received: " + message.getMessage()); } message.setWhen(new Date()); state().history.add(message); trimHistory(); state().observers.notifyObservers(o -> o.receiveMessage(message)); if (System.currentTimeMillis() - lastSave > TimeUnit.SECONDS.toMillis(60)) { return writeState(); } return Task.done(); } 省略。。。 }

不像別的框架,在Orbit中沒有明確的actor的生命周期管理,actor不會創建和銷毀,在概念上它是一直存在的。只不過它是分為「活動」和「不活動」兩種狀態,如果一個actor 被載入到內存中,那就是「活動」的,如果沒有那就是相反。

Stage是Orbit的另一個重要組件,它是一個運行時執行容器,並且它是開發者與actor交互的重要手段。Orbit默認會使用UDP廣播模式結合JGroups、Infinispan組件來做集群間的通信,但是通常UDP廣播模式不太適合做雲部署(比如AWS就沒有提供UDP廣播的支持),所以Orbit可以讓開發者來配置具體的通信方式(如tcp通信),可以自定義xml配置文件放置到資源路徑classpath下,如:classpath:/conf/jgroups.xml。

Actor能通過定義一個內部靜態類來保存自己的狀態,如下,可見還需要在extends AbstractActor的時候定義一下泛型。

public class StatefulActor extends AbstractActor implements Some { public static class State { String lastMessage; } }

這個狀態操作起來也很方便,在actor的創建時就已經生成了它的內部靜態類的一個實例,然後通過state()這個方法來獲取這個實例,然後操作裡面的屬性。並且還能通過writeState()、readState()等方法來持久化存取狀態(需要有相應的存儲擴展)。

通常情況下Orbit只允許同id的actor只有一個是「活動」中的,不過有些情況下actor是無狀態的,並且想提高吞吐量和降低響應時間,那就可以使用@StatelessWorker這個annotation,這樣就能支持同id的actor能有多個實例「活動」著了。

Orbit有良好的擴展機制,目前官方也提供了很多不錯的擴展,比如AWS S3、MongoDB、Jetty、HK2等的支持,自己去實現一些擴展也是很容易的,Orbit提供了很多擴展介面出來,如關於存儲方面的StorageExtension,S3、MongoDB的擴展實現了這個介面,關於生命周期的LifetimeExtension,HK2的擴展實現了這個介面。

Orbit還與spring有了簡單的集成,幫助開發者通過配置文件配置相關參數來自動創建stage並維護在容器里。還提供了OrbitHealthIndicator這個HealthIndicator(需要引入spring boot actuator)來監控容器內stage的狀態,通過actuator暴露的rest api來獲取信息。

目前Orbit還比較年輕,不過已經開始用於Bioware公司里的一些項目里,讓我們多關注關注這些新興的框架,說不定哪天它們就能火呢,哈哈。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 推酷 的精彩文章:

傳統服裝市場不景氣,服裝行業如何實現消費升級?
像Excel一樣使用R進行數據分析
什麼是SSL預證書?
點融網 CTO 孔令欣:區塊鏈應用的普及取決於行業的頭部公司
用戶個人行為報告思考:報告的價值與設計

TAG:推酷 |

您可能感興趣

Android項目解耦-路由框架ARouter源碼解析
iOS crash 日誌堆棧解析
AtomicInteger 源碼解析
使用 Python的urlliib.parse 庫解析 URL
SparseArray 稀疏數組解析
RequireJS框架源代碼解析
Photoshop詳細解析CameraRaw插件使用
Ansible 深度解析
Android Studio項目模板全面解析
Grasshopper曲面玻璃平板化解析
藉助Jackson的JsonTypeInfo註解實現多態類的解析
Google 開源 robots.txt 解析器,推動 REP 標準化
0xcert Protocol項目解析—行業技術
hbase查詢解析
Siemens MPI協議解析
Spring源碼解析——Spring思想、設計模式總結
技術解析系列PouchContainer Goroutine Leak 檢測實踐
Bayesian Personalized Ranking 演算法解析及Python實現
網關 Spring-Cloud-Gateway 源碼解析——路由之RouteDefinitionLocator一覽
druid-spring-boot-starter源碼解析