簡體   English   中英

Akka在Java中鍵入了演員

[英]Akka typed actors in Java

我不明白為什么不在Akka使用TypedActors 使用反射(well .. instanceof )來彌補Java中缺少模式匹配是非常難看的。
據我所知, TypedActors應該像你的軟件的“Akka world”和“Non Akka world”之間的門。 但是,為什么我們不拋棄所有OO主體並僅使用反射!
您為什么不想要使用演員並確切知道它應該響應什么呢? 或者為了保持演員模型的Akka,為什么不創建一個使用雙調度的消息層次結構來激活actor中的正確方法(我知道你不應該將Actors作為參數傳遞並使用ActorRef代替)。
免責聲明:我是Akka和這個模型的新手,我沒有使用Akka寫過一行代碼,但只是閱讀文檔讓我頭疼。

在我們開始之前 :問題是關於已棄用的 “類型化演員”模塊 這將很快被akka-typed取代,這是一個更優越的問題,這避免了以下解釋的缺點 - 如果你對打字的演員感興趣,請看看akka-typed!


我將列舉使用您引用的類型化actor實現的一些弊端。 但是請注意,我們剛剛合並了一個新的akka型模塊,這將類型安全性帶回了akka演員的世界。 為了這篇文章,我不會深入研究開發打字版本是如此艱難的挑戰的原因,讓我們現在回答“為什么不使用(舊的)打字演員”的問題。

首先 ,它們從未被設計為工具包的核心。 它們建立在Akka提供的消息傳遞基礎架構之上。 請注意,由於有了該消息傳遞基礎結構,我們能夠實現位置透明性以及Akka著名的性能。 他們大量使用反射和JDK代理來轉換消息發送方法和從消息發送方法轉換。 這是非常昂貴的(時間方面),並且與普通的Akka Actors相比,將性能降低了大約10倍,參見下面的“乒乓”基准測試(使用兩種風格實現,發送者告訴演員,演員回復 - 100.000次) :

Unit = ops/ms
Benchmark                                                Mode   Samples         Mean   Mean error    Units
TellPingPongBenchmark.tell_100000_msgs                   thrpt       20 119973619.810 79577253.299   ops/ms
JdkProxyTypedActorTellPingPongBenchmark.tell_100000_msgs thrpt       20  16697718.988   406179.847   ops/ms

Unit = us/op
Benchmark                                                Mode   Samples         Mean   Mean error    Units
TellPingPongBenchmark.tell_100000_msgs                   sample  133647        1.223        0.916    us/op
JdkProxyTypedActorTellPingPongBenchmark.tell_100000_msgs sample  222869       12.416        0.045    us/op

(基准測試保存在akka / akka-bench-jmh中,並使用OpenJDK JMH工具,通過sbt-jmh插件運行。)

其次 ,使用方法來抽象分布式系統並不是一個很好的方法(哦,我記得RMI ......讓我們不再去那里)。 使用這樣的“看起來像方法”使您不必再考慮消息丟失,重新排序以及分布式系統中所有可能發生的事情。 它還使用def getThing(id: Int): Thing類的簽名鼓勵(使其“ 容易做錯def getThing(id: Int): Thing - 會生成阻塞代碼 - 這對性能來說太可怕了! 您確實確實想保持異步和響應能力 ,這就是為什么當嘗試與這些(基於代理)類型的actor正常工作時,最終會承受大量期貨的原因。

最后 ,你基本上失去了一個主要的Actor功能 Actor可以執行的3個規范操作是1)發送消息2)啟動子actor 3) 根據收到的消息改變它自己的行為 (參見Carl Hewitt關於Actor模型的原始論文)。 第三種功能用於精美地建模狀態機。 例如,您可以說(在簡單的akka​​演員中) become(active)然后become(allowOnlyPrivileged) ,在receive實現之間切換 - 使得有限狀態機實現(我們還有用於FSMDSL )是一種樂趣。 您無法在JDK代理類型的actor中表達這一點,因為您無法更改公開方法的集合。 一旦您使用狀態機進行思考和建模,這是一個重大的缺點。

新希望 (第1集):請看看即將推出的由Roland Kuhn撰寫的akka類型模塊 (預覽很快將包含在2.4版本中),我很確定你會喜歡你會發現的安全明智。 此外,該實現最終將比當前的無類型演員更快(省略了impl細節,因為答案已經很久了 - 短版本:基本上我們將刪除大量分配,這要歸功於新的實現)。

我希望你會喜歡這個徹底的答案。 歡迎在此處或在akka用戶 (我們的官方郵件列表)上的評論中提出后續問題。 哈克!

Typed Actors為您提供了根據域名定義的靜態合約 - 您可以將其消息命名(將被委托給底層實施並異步執行)在您的域中有意義的操作,避免在您的域中使用反射part(TypedActors使用JDK Proxies,所以仍然有反射,你只需要擔心它,並且你根據傳遞給活動對象/類型的actor及其的參數獲得類型檢查文檔很清楚,但是我知道對於那些基於角色的並發性而言,新的示例總是有幫助的,所以如果您仍然感到麻煩,請隨時提出其他問題/意見。

但是,你們是否意識到您擁有大量沒有專門知識開發人員的公司,而是一個可以根據需要進行水平擴展的大型基礎設施,因此性能並非總是最佳的選擇,而是具有響應性,消息驅動,彈性和彈性,現在感謝我們擁有的類型演員,被不熟悉Akka或Reactive Programing的開發人員使用。

別誤會,我每天都在使用純Akka類型,但是對於交付團隊來說,我們擁有使用類型化actor的框架,而我們的使用者則用作POJO,卻不知道他們在反應式系統中進行編碼。 這是一個很棒的功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM