java akka_用于大型事件处理的Akka Java
java akka
我們正在設計一個大型的分布式事件驅動系統,用于跨事務數據庫的實時數據復制。 來自源系統的數據(消息)在到達目的地之前經歷了一系列轉換和路由邏輯。 這些轉換是多進程和多線程的操作,包括可以同時執行的較小的無狀態步驟和任務。 相反,沒有跨進程的共享狀態,狀態轉換保留在數據庫中,并且每個進程直接從數據庫中提取其工作隊列。
基于此,我們需要一種在Java + Spring平臺上支持分布式事件處理,路由和并發的技術,其中考慮的三個選項是MessageBroker(RabbitMQ),Spring Integration和Akka。
RabitMQ: MQ是首選,因為它是消息傳遞/事件處理的傳統且經過驗證的解決方案。 RabbitMQ,因為它是流行的輕量級開源選項,并獲得了我們已經使用過的供應商的商業支持。 RabbitMQ給我留下了深刻的印象,它易于使用,精簡但仍支持高級分發和消息傳遞功能。 它對我們來說唯一缺少的是在Oracle中持久存儲消息的能力。
即使RabbitMQ是開放源代碼(免費),但對于企業而言,它還是有相當大的成本因素。 由于MQ是中間件堆棧中的一個附加組件,因此它需要專門的人員來進行管理和維護以及對該產品的商業支持。 同樣,MesageBroker的設置和配置也有其自身的復雜性,并且涉及跨團隊的協調。
MQ主要是EAI產品,并提供跨平臺(多語言,多協議)支持。 當僅用作異步并發和并行解決方案時,它們可能會過于龐大和昂貴。
Spring集成: Spring有一些模塊可提供可擴展的異步執行。 Spring TaskExecutor提供帶有輕量級線程池選項的異步處理。 Spring Batch允許通過Job Launcher和Job Repository進行分布式異步處理。 Spring Integration通過提供EAI功能,消息傳遞,路由和中介功能進一步擴展了它。
盡管所有三個Spring模塊都具有某些必需的功能,但是很難將所有內容組合在一起。 像這個用戶一樣,我期望Spring Integration具有類似RMI的遠程處理功能。
Akka Java: Akka是一個工具包和運行時,用于在JVM上構建高度并發,分布式和容錯的事件驅動應用程序。 它具有Java API,因此我決定嘗試一下。
Akka很容易上手,我發現Activator很有幫助。 Akka基于Actor模型,該模型是在沒有共享對象和阻塞的情況下實現并發的消息傳遞范例。 在Akka中,不是直接調用對象,而是構造一條消息,并通過參與者引用將其發送到該對象(稱為參與者 )。 這種設計大大簡化了
并發管理。
但是,簡單性并不意味著可以在不更改代碼的情況下將傳統的基于鎖的并發程序(線程/同步)轉換為Akka。 人們需要通過定義較小的任務,消息和它們之間的通信來設計其Actor系統。 Akka的概念和Actor Model范例有一個學習曲線。 考慮到并發和并行性的復雜性,它相對較小。
Akka提供了正確的抽象級別,您不必擔心共享狀態的線程和同步,但是您具有完全的靈活性和控制權來編寫自定義并發解決方案。
除了簡單之外,我還認為Akka的真正功能是遠程處理及其將參與者分布在多個節點上以實現高可伸縮性的能力。 Akka的位置透明性和容錯性使擴展和分發應用程序變得容易,而無需更改代碼。
我能夠輕松地為我的多進程和多線程用例構建一個PoC。 我仍然需要解決Actor中的Spring注入問題。
請注意,由于Scala的類型系統,Akka的Java代碼具有大量的類型轉換,因此實現對象可變性可能很棘手。 我很想將現有的JPA實體(可變的)重用為消息,以減少數據庫調用。
此外,Akka社區面向Scala,并且Akka Java上的資料較少。
盡管如此,Akka Java在這三種中似乎是更便宜,更快和有效的選擇。
翻譯自: https://www.javacodegeeks.com/2014/05/akka-java-for-large-scale-event-processing.html
java akka
總結
以上是生活随笔為你收集整理的java akka_用于大型事件处理的Akka Java的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么自己设置壁纸(华为手机怎么自己设置壁
- 下一篇: 社团活动有什么好玩的互动游戏,附加搜集真