while模式嚴格來說是while迴圈在akka中的合理實現。while是開發過程中經常用到的語句之一,也是絕大部分程式語言都支援的語法。但while語句是乙個迴圈,如果迴圈條件沒有達到會一直執行while語句體的**,且會阻塞while語句外的**。如果在akka中簡單的使用while語句會極大的限制當前actor的功能。
object generalwhile}object whilepattern1
}
輸出:
do start work012345
6789
start work done
do other work
上面**是actor中簡單使用while的例子。其實在簡單的業務場景下,這種實現並沒有太大問題,只不過while可能會阻塞當前actor而已。不過while有乙個極端的情況,那就是while死迴圈。雖然死迴圈不能輕易出現,不過也非常有用。比如有以下場景:迴圈讀取資料庫做某種操作。在akka的訊息處理過程中是絕對不能出現死迴圈的,一旦出現死迴圈這個actor基本就廢了(因為阻塞到了這個方法處理)!
其實如果你的業務需求需要在akka中使用死迴圈,而且你也的確這麼用了,那只能說明對actor模型不熟悉,因為actor模型本身對訊息的處理就是「死迴圈」。為什麼說actor本身就是乙個「死迴圈"呢?actor在收到訊息會進行對應的處理,死迴圈也就意味著一直收到訊息,那麼如何一直收到訊息呢?其他actor給它發訊息或者自己給自己發訊息,很顯然,actor內部的迴圈邏輯跟其他actor關係不大,發訊息給自己是比較合理的。
class whileforeveractor extends actoroverride def receive: receive =
case "otherwork" =>
println("處理其他訊息")
}}object whilepattern2
}
輸出:
從資料庫獲取n條資料迴圈處理處理完畢
從資料庫獲取n條資料迴圈處理
處理完畢
從資料庫獲取n條資料迴圈處理
處理完畢
處理其他訊息
處理其他訊息
從資料庫獲取n條資料迴圈處理
處理完畢
從資料庫獲取n條資料迴圈處理
處理完畢
從資料庫獲取n條資料迴圈處理
處理完畢
從資料庫獲取n條資料迴圈處理
上面是akka中的while模式。簡單點說,就是用自身訊息驅動acotor的迴圈處理。這樣做的好處就是可以在某次迴圈結束後及時的處理其他型別的訊息,而不至於阻塞當前的actor,而且可以隨時通過發訊息的形式中斷迴圈或修改迴圈條件。
akka設計模式系列 Aggregate模式
所謂的aggregate模式,其實就是聚合模式,跟masterworker模式有點類似,但其出發點不同。masterworker模式是指master向worker傳送命令,worker完成某種業務邏輯。而聚合模式則剛好相反,由各個worker完成某種業務邏輯後,把結果彙總發給某個actor,這個ac...
akka設計模式系列 akka在秒殺場景的應用
本部落格討論一下akka在秒殺場景下的應用,提出自己的見解,只做拋磚引玉,大神勿噴。秒殺活動涉及到前中後台各個階段,為了說明問題,我們簡化場景,只研究akka在後台如何處理秒殺業務。秒殺活動 所謂的秒殺活動,簡單點來說,就是把某個稀缺商品或 商品,掛到頁面,供大量客戶搶購。這裡有兩個關鍵點,商品數量...
設計模式系列
簡單工廠模式 factory pattern 單例模式 singleton pattern 工廠方法模式 factory method pattern 抽象工廠模式 abstract factory pattern 建造者模式 builder pattern 原型模式 prototype patte...