Actor模型在異步處理中使用廣泛,尤其是scala語言中actor框架的使用。本篇主要介紹thingsboard中其自主實現的actor模型,及在數據傳輸中的使用。
Actor模型簡介
Actor由狀態(state)、行爲(Behavior)和郵箱(mailBox)三部分組成
- 狀態:Actor中的狀態指的是Actor對象的變量信息,狀態由Actor自己管理,避免了併發環境下的鎖和內存原子性等問題
- 行爲:行爲指定的是Actor中計算邏輯,通過Actor接收到消息來改變Actor的狀態
- 郵箱:郵箱是Actor和Actor之間的通信橋樑,郵箱內部通過FIFO消息隊列來存儲發送方Actor消息,接受方Actor從郵箱隊列中獲取消息
TB Actor實現
通過測試類來跟蹤源碼,是學習源碼非常有效的方式。我們也從測試類ActorSystemTest開始跟蹤actor實現的過程。首先運行測試方法test1actorsAnd100KMessages(),體驗一下actor模型處理的速度。
模型本身用到的類比較少,下面對每個類的的功能做一個描述:
與經典的Actor模型對應關係爲:
- TbActor-->Actor
- Dispatcher --> Behavior
- TbActorRef --> mailBox,TbActorRef對應的實現類爲TbActorMailbox。
Actor在TB中的應用
Actor對象
如下圖所示,tb針對不同場景實現了不同的actor對象,actor對象裏通過processor來處理業務邏輯。
actor與queue打通:
DefaultTbRuleEngineConsumerService在消費隊列時,如果存在actorMsg,就執行ActorSystemContext.tellWithHighPriority()處理。執行流程如圖:
下面分析一下AbstractConsumerService類,其在spring初始化完成後會啓動線程來消費actor的隊列數據,具體的實現在rule-engine中分析。
Actor模型使用的優點
tb是使用actor模型處理接收到的message,有效的隔離了消息的接收和處理過程。並且actor對消息處理的過程進行了隔離,不用考慮資源的併發處理問題。Mailbox中的actor對象處理消息的速度是非常快的,處理完後直接tell給下游childActor。