thingsboard actor消息处理流程

  • 作者: 凯哥Java(公众号:凯哥Java)
  • thingsboard
  • 时间:2023-05-04 19:18
  • 3875人已阅读
简介 Actor模型在异步处理中使用广泛,尤其是scala语言中actor框架的使用。本篇主要介绍thingsboard中其自主实现的actor模型,及在数据传输中的使用。

🔔🔔🔔好消息!好消息!🔔🔔🔔

有需要的朋友👉:联系凯哥 微信号 kaigejava2022

Actor模型简介

Actor由状态(state)、行为(Behavior)和邮箱(mailBox)三部分组成

  • 状态:Actor中的状态指的是Actor对象的变量信息,状态由Actor自己管理,避免了并发环境下的锁和内存原子性等问题

  • 行为:行为指定的是Actor中计算逻辑,通过Actor接收到消息来改变Actor的状态

  • 邮箱:邮箱是Actor和Actor之间的通信桥梁,邮箱内部通过FIFO消息队列来存储发送方Actor消息,接受方Actor从邮箱队列中获取消息

TB Actor实现

通过测试类来跟踪源码,是学习源码非常有效的方式。我们也从测试类ActorSystemTest开始跟踪actor实现的过程。首先运行测试方法test1actorsAnd100KMessages(),体验一下actor模型处理的速度。

fa9c84b7eb8226466848fc980071322d.png

模型本身用到的类比较少,下面对每个类的的功能做一个描述:

d1cf5744c0bad6745b1d8e2345d9b0ad.png

与经典的Actor模型对应关系为:

  • TbActor-->Actor

  • Dispatcher --> Behavior

  • TbActorRef --> mailBox,TbActorRef对应的实现类为TbActorMailbox。

Actor在TB中的应用

Actor对象

如下图所示,tb针对不同场景实现了不同的actor对象,actor对象里通过processor来处理业务逻辑。

7337d25167119c4d7a9bb27d89ff1c14.png

注:idea默认快捷键(Ctrl+H)可显示抽象类或接口的所有实现子类


actor与queue打通

DefaultTbRuleEngineConsumerService在消费队列时,如果存在actorMsg,就执行ActorSystemContext.tellWithHighPriority()处理。执行流程如图:

1ad40c7ffbe156b3041bfacb96c644cb.png

下面分析一下AbstractConsumerService类,其在spring初始化完成后会启动线程来消费actor的队列数据,具体的实现在rule-engine中分析。

be45a0ca196199e49f6e0c8782e91ce3.png

Actor模型使用的优点

tb是使用actor模型处理接收到的message,有效的隔离了消息的接收和处理过程。并且actor对消息处理的过程进行了隔离,不用考虑资源的并发处理问题。Mailbox中的actor对象处理消息的速度是非常快的,处理完后直接tell给下游childActor。

thingsboard actor消息处理流程

89bc1887f04a0c094c3634a815e4dab9.png










TopTop