akka設計模式系列 Aggregate模式

2021-09-20 07:37:36 字數 2418 閱讀 4437

所謂的aggregate模式,其實就是聚合模式,跟masterworker模式有點類似,但其出發點不同。masterworker模式是指master向worker傳送命令,worker完成某種業務邏輯。而聚合模式則剛好相反,由各個worker完成某種業務邏輯後,把結果彙總發給某個actor,這個actor不一定是masteractor。

class aggregatemasteractor extends actor")

backendactor ! cmd

case aggregatebackendevent.workdone(sum) =>

val from = sender()

println(s"aggregatemasteractor [$] 收到 $ 彙總結果 $sum")

}}class aggregatemasterbackendactor(replyto:actorref,parallel:int) extends actor] 開始工作,parallel $parallel,工作結果彙總給 $")

1 to parallel foreach

case aggregateworkerevent.workdone(result) =>

counter += 1

sum += result

if(counter == parallel)] 工作結束退出")}}}

class aggregateworker(replyto:actorref) extends actor] 開始工作 index=$index,工作彙總給 $")

val result = calcresult(index,parallel)

replyto ! aggregateworkerevent.workdone(result)

println(s"aggregateworker [$] 工作結束退出")

context.stop(self)

}}object aggregatepattern

}

輸出:

aggregatemasterbackendactor [aggregatemasterbackendactor-1531383454073] 開始工作,parallel 3,工作結果彙總給 aggregatemasteractor

aggregateworker [aggregateworker-1] 開始工作 index=1,工作彙總給 aggregatemasterbackendactor-1531383454073

aggregateworker [aggregateworker-2] 開始工作 index=2,工作彙總給 aggregatemasterbackendactor-1531383454073

aggregateworker [aggregateworker-3] 開始工作 index=3,工作彙總給 aggregatemasterbackendactor-1531383454073

aggregateworker [aggregateworker-1] 工作結束退出

aggregateworker [aggregateworker-3] 工作結束退出

aggregateworker [aggregateworker-2] 工作結束退出

aggregatemasterbackendactor [aggregatemasterbackendactor-1531383454073] 工作結束退出

aggregatemasteractor [aggregatemasteractor] 收到 aggregatemasterbackendactor-1531383454073 彙總結果 18

從**來看該設計模式也比較簡單,就是由master建立以臨時的子actor,此處命名為masterbackend,將匯報物件的actorref以建構函式的形式傳遞給masterbackend,此處為了簡單用self替代;masterbackend根據並行引數,建立對應個數的workeractor,並把本身的actorref以建構函式的形式傳遞給workeractor,workeractor執行具體的業務邏輯,並將彙總結果,傳送給replyto(也就是masterbackend);masterbackend收到workeractor的彙總結果,根據並行引數,判斷所有子actor是否執行結束,若執行結束,此次計算完成,將彙總後的結果,傳送給replyto(也就是masteractor)。

上面這種設計模式有乙個明顯的好處,就是master可以迅速建立大量的聚合工作而不阻塞,因為它收到命令後,只是簡單的建立masterbackend,工作交給它去執行,這個過程非常快。如果某個聚合工作比較慢,並不會影響其他任務。

之所以說這個設計模式非常重要,是因為在spark/storm等大多分布式框架中都有它的影子。他們都選擇將功能進行拆解,專門的節點或actor分別負責任務的接收、建立、執行、彙總這些工作,工作之間互不影響。如果能夠深刻的理解這種設計模式,你將會設計出乙個架構分層合理、互相解耦的高質量應用系統。

akka設計模式系列 While模式

while模式嚴格來說是while迴圈在akka中的合理實現。while是開發過程中經常用到的語句之一,也是絕大部分程式語言都支援的語法。但while語句是乙個迴圈,如果迴圈條件沒有達到會一直執行while語句體的 且會阻塞while語句外的 如果在akka中簡單的使用while語句會極大的限制當前...

akka設計模式系列 akka在秒殺場景的應用

本部落格討論一下akka在秒殺場景下的應用,提出自己的見解,只做拋磚引玉,大神勿噴。秒殺活動涉及到前中後台各個階段,為了說明問題,我們簡化場景,只研究akka在後台如何處理秒殺業務。秒殺活動 所謂的秒殺活動,簡單點來說,就是把某個稀缺商品或 商品,掛到頁面,供大量客戶搶購。這裡有兩個關鍵點,商品數量...

設計模式系列

簡單工廠模式 factory pattern 單例模式 singleton pattern 工廠方法模式 factory method pattern 抽象工廠模式 abstract factory pattern 建造者模式 builder pattern 原型模式 prototype patte...