IOT開源數據平臺Thingsboard源碼分析(三)-Actor模型

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。

參考:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章