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