Axon是一個輕量級框架,可以幫助開發者經過在架構層面構建可擴展和可伸縮的應用。(注:以DDD面向領域驅動設計爲基礎的CQRS框架)web
Axon Framework背景、發展簡史緩存
隨着時間的發展,軟件的需求也在不斷增加。公司都但願本身的(web)應用程序和自身業務共同發展。這就意味着不只僅是工程和代碼變得更復雜,也意味着功能不斷地新增、更改和移除。它使人沮喪的是,一個看似易於實現的功能,卻要求開發團隊改動整個應用程 序。此外,現在的web程序的目標是針對潛在的數十億用戶,這便使可伸縮性成了必要的條件。服務器
雖然有不少的應用和框架圍繞着可擴展性問題進行處理,例如GigaSpaces(相似Microsoft Azure) 和 Terracotta(分佈式緩存線性擴展平臺),它們都存在着一個根本的缺陷。他們經過要求開發人員在開發應用時,使用分層體系架構,來試圖解決可擴展性問題。在某些狀況下,他們甚至會阻止或嚴格限制使用一個真正的領域模型,強迫全部領域邏輯都放到服務中。雖然能夠很快地構建一個應用程序,最終,這種作法將致使複雜性的增長和開發速度減慢。多線程
命令查詢職責分離(CQRS)模式解決了這些問題,大幅改變了應用程序的架構。CQRS不是將分離的邏輯分到不一樣的層 ,邏輯的分離是以改變應用程序的狀態或查詢爲依據。這意味着,執行命令(行爲有可能更改應用程序的狀態)和查詢應用程序數據是由不一樣的組件執行。這種分離事實上最重要的緣由是,他們各自有不一樣的技術和非技術的要求。當命令執行後,查詢組件利用事件同步或異步地進行更新。該更新機制經過事件來完成,正是這種架構如此的可擴展,可伸縮,最終會更易於維護。架構
注意
一個完整的CQRS解釋不在本文的範圍以內。若是你想了解更多關於CQRS的信息, 請訪問 Axon Framework的網站: www.axonframework.org。它包含了背景知識的連接。併發
因爲CQRS與主導當今軟件局面的分層架構有着根本上的不一樣,開發人員試圖找到本身實現這個架構的方式,但每每會掉入各類陷阱。這就是了Axon Framework 產生的緣由:幫助開發人員實現CQRS,並讓他們只專一於業務邏輯。框架
Axon是什麼?異步
Axon Framework 經過支持開發者應用命令查詢職責分離(CQRS)架構模式,來幫助構建可伸縮、可擴展和可維護的應用程序。它經過提供最重要的構建塊的實現來實現,如:聚合、倉儲以及事件總線(事件的調度機制)。此外,Axon提供了對註解(annotation)的支持,它容許你構建聚合和事件監聽器而不用將你的代碼捆綁到Axon特有的邏輯。這使你可以專一於業務邏輯, 而不是數據傳輸(the plumbing),並幫助你使代碼更容易隔離測試。分佈式
Axon不會試圖以任何方式隱藏CQRS架構或任何組件。所以,根據團隊規模,明智的選擇是,每 個團隊中有一個或多個對CQRS有着透徹瞭解的開發人員。無論怎麼樣,Axon幫助保證把事件交付給正確的事件監聽器,並按正確的順序併發處理它們。這些多線程問題一般很難處理,致使難以跟蹤Bug、應用程序徹底失去響應。當你的時間緊迫,你可能甚至不想去關心這些問 題。Axon的代碼是通過徹底測試的,以防止這些類型錯誤的出現。工具
Axon Framework由多個模塊(jar)組成,這些模塊提供工具和組件來構建可伸縮的基礎設施。Axon核心模塊爲不一樣的組件提供了基本的API,併爲單JVM的應用程序解決方案提供了簡單實現。其餘模塊提供專業的組件,來解決可伸縮性和高性能的問題。
什麼時候使用Axon?
並非每個應用程序都會從Axon中獲益。簡單的CRUD (Create, Read, Update, Delete) 應用程序、沒有橫向擴展預期的應用程序,可能沒法從CQRS或Axon中受益。
具備如下一個或多個特色的應用程序可能會從CQRS和Axon中受益:
在至關長的一段時間內可能會擴展新的功能。例如,一個網上商店可能初期僅僅是一 個訂單進度跟蹤系統。後期,可能會擴展到對庫存信息的管理,確保物品售出後及時的更新 庫存。隨後,財務人員可能須要銷售的財務統計數據等等。雖然很難預測軟件項目將來會如何發展,可是大多數類型的應用程序都清楚地呈現爲這樣。
應用程序有一個比較高的讀寫比,這意味着數據只寫幾回,但卻要讀不少次。因爲查 詢的數據源與用於命令驗證的數據源不一樣,所以纔有可能對數據源的快速查詢提供優 化。重複數據再也不是一個問題,由於當數據改變時,事件也會被髮布。
應用程序須要不一樣格式的展現數據,許多應用程序目前不只僅只停留在顯示數據到網 頁上。 某些應用程序,例如,每個月郵件通知所發生的與用戶有關的變化,搜索引擎也是一個例子。他們使用相同的應用程序數據,但在某種意義上這是優化的快速搜索。 報表工具隨着時間的變化彙總信息,這一樣是同一數據的不一樣格式。使用Axon,每一個數據源均可以彼此獨立地實時或定時更新。
當應用程序面對不一樣的受衆,清晰地隔離組件時,它也能從Axon中獲益。例如網上商 店。員工會在網站上更新產品信息和可用性,同時客戶能夠下單和查詢他們的訂單狀 態。經過Axon,這些組件能夠部署在不一樣的服務器上,並使用不一樣的策略進行擴展。 經過事件機制,Axon將分發事件到部署在不一樣服務器上的訂閱組件,使其保持最新的 數據狀態。
與其餘應用程序集成多是繁瑣的工做。嚴格使用命令和事件定義應用程序的API, 會使它更容易與外部應用程序集成。任何應用程序均可以發送命令或監聽應用程序生 成的事件。