Akka基礎
- Akka筆記之Actor簡介
Akka中的Actor遵循Actor模型。你可以把Actor當作是人。這些人不會親自去和別人交談。他們只通過郵件來交流。
1. 消息傳遞 2. 並發 3. 異常處理 4. 多任務 5. 消息鏈
- Akka筆記之消息傳遞
消息發送給actor代理;
消息是不可變對象(可帶有屬性的case class);
分發器dispatcher和郵箱: dispatcher從actorRef取出一條消息放在目標actor郵箱中,然后放mailbox放在一個Thread上;當MailBox的run方法運行的時候,它會從隊列中取出一條消息, 然后將它傳給Actor去處理。在Actor的世界中,郵箱一有機會就會要求Actor去完成自己的任務。
- Akka筆記之日志及測試
使用slf4j打印日志:Akka通過一個叫做ActorLogging的特質(trait)來實現的這一功能。可以這個trait混入(mixin)到類中。當我們要打印一條消息的時候,ActorLogging中的日志方法會將日志信息發布到一個EventStream流中。沒錯,我的確說的是發布。
EventStream:EventStream就像是一個我們用來發布及接收消息的消息代理。它與常見的消息中間件的根本區別在於EventStream的訂閱者只能是一個Actor。DefaultLogger默認訂閱這些消息並打印到標准輸出。
akka{ loggers = ["akka.event.slf4j.Slf4jLogger"] loglevel = "DEBUG" logging-filter = "akka.event.slf4j.Slf4jLoggingFilter" }
- Akka筆記之請求與響應
技術上來講,消息發送給Actor就是希望能有副作用的。設計上便是如此。目標Actor可以不做響應,也可以做如下兩件事情——
1. 給發送方回復一條響應(在本例中,TeacherActor會將一句名言回復給StudentActor)
2. 將響應轉發給其它的目標受眾Actor,后者也可以進行響應/轉發/產生副作用。Router和Supervisor就是這種情況。
- Akka筆記之配置及調度
配置管理:applicaiton.conf
調度器: 一次調度和循環調度。import context.dispatcher這條語句非常重要。schedule方法需要一個非常重要的隱式參數——ExecutionContext。schedule方法只是把消息發送封裝到了一個Runnable中,而它最終是由傳進來的ExecutionContext來執行的。
- Akka筆記之生命周期
preStart: Actor重啟的時候(比如說崩潰了之后重啟)通過調用preStart方法還能重新初始化。而構造方法則實現不了這點(只會初始化一次)。
postStop: ActorSystem.stop(), ActorContext.stop(), PoisonPill 都可以終止一個actor,關閉時回調用postStop()
- Akka筆記之子Actor及路徑
Actor是純粹的分層結構。你所創建出來的Actor必定是某個Actor的子Actor。actorRef.path可以獲取到actor路徑。
子Actor:當某個任務由一個或多個子任務所組成的時候通常就會創建子Actor。或者當某個任務由父Actor執行比較容易出錯,而你希望將它進行隔離的時候,也可以使用子Actor(這樣當子Actor崩潰的時候,你還能夠恢復它)。如果不存在父子Actor關系,就不要創建子Actor。
- Akka筆記之Actor監控
監控(Watch):不管Actor是怎么掛掉的,系統里面會有些Actor希望能夠知曉這一情況。ActorContext.watch和ActorContext.unwatch就是監控與取消監控的方法了。進行了監控之后,監控者會收到已停止的Actor發來的一條Terminated消息,它們只需要把這個消息放到receive函數的處理邏輯里就好了。
監督(Supervision):只存在於父子關系的actor之間。