当前位置: 代码迷 >> 综合 >> Bigbluebutton akka-bbb-apps 模块分析
  详细解决方案

Bigbluebutton akka-bbb-apps 模块分析

热度:42   发布时间:2023-12-22 19:10:47.0

                                          Akka-bbb-apps模块介绍

在分析这个模块时,首先找到这个模块程序的入口程序 ,它是 Boot.scala中的 Boot. 这是由SprintBoot这个框架决定的。

 

在分析Boot之前 ,要先了解akka中的 actor 和 bus 的概念。

 

object Boot extends App with SystemConfiguration {

 

  implicit val system = ActorSystem("bigbluebutton-apps-system")

  implicit val executor = system.dispatcher

 

  val logger = Logging(system, getClass)

 

  val eventBus = new InMsgBusGW(new IncomingEventBusImp())

 

  val outBus2 = new OutEventBus2

  val recordingEventBus = new RecordingEventBus

 

  val outGW = new OutMessageGatewayImp(outBus2)

 

  val redisPublisher = new RedisPublisher(system, "BbbAppsAkkaPub")

  val msgSender = new MessageSender(redisPublisher)

 

  val redisRecorderActor = system.actorOf(RedisRecorderActor.props(system), "redisRecorderActor")

 

  recordingEventBus.subscribe(redisRecorderActor, outMessageChannel)

  val incomingJsonMessageBus = new IncomingJsonMessageBus

 

  val bbbMsgBus = new BbbMsgRouterEventBus

 

  val fromAkkaAppsMsgSenderActorRef = system.actorOf(FromAkkaAppsMsgSenderActor.props(msgSender))

  val analyticsActorRef = system.actorOf(AnalyticsActor.props())

  outBus2.subscribe(fromAkkaAppsMsgSenderActorRef, outBbbMsgMsgChannel)

  outBus2.subscribe(redisRecorderActor, recordServiceMessageChannel)

 

  outBus2.subscribe(analyticsActorRef, outBbbMsgMsgChannel)

  bbbMsgBus.subscribe(analyticsActorRef, analyticsChannel)

 

  val bbbActor = system.actorOf(BigBlueButtonActor.props(system, eventBus, bbbMsgBus, outGW), "bigbluebutton-actor")

  eventBus.subscribe(bbbActor, meetingManagerChannel)

 

  val redisMessageHandlerActor = system.actorOf(ReceivedJsonMsgHandlerActor.props(bbbMsgBus, incomingJsonMessageBus))

  incomingJsonMessageBus.subscribe(redisMessageHandlerActor, toAkkaAppsJsonChannel)

 

  val redisSubscriberActor = system.actorOf(AppsRedisSubscriberActor.props(system, incomingJsonMessageBus), "redis-subscriber")

}

 

首先看Boot的最后一句:它在构造 AppsRedisSubscriberActor 时会调用 subscript()订阅相关的通道,收到外部的事件,然后传入apps内部。

 

具体细节:

AppsRedisSubscriberActor 继承了 RedisSubscripberProvider(位置在bbb-common-message/sr/main/scala/org/bigbluebutton/common2/redis/RedisSubScriberProvider.scala)

 

看 RedisSubscriterProvider的订阅方法:

 

可以看到它是用redis的subscripe 订阅相关的通道()。

toAkkaTranscodeRedisChannel,fromVoiceConfRedisChannel,toAkkaAppsJsonChannel

从名称可以看到分别是 转码相关,声音相关,和指发到这模块的通道。

 

在收到消息后利用incomingJsonMessageBus将消息发布出去,现在就到了apps模块内部来处理这些消息了。 代码如图所示。

 

再分析处理接着处理消息的 actor ReceivedJsonMsgHandlerActor.

这个actor 也只是消息根据类型分发到eventBus的 不同通道中,在用户真正进入到会议室之前 的发布到了meetingManagerChanne通道,比如会议室的创建,用户进入时的验证等消息,用户进入到会议室之后的操作发布到了以会议室ID命名的通道。比如用户聊天 ,投票等消息。 还有声音相关的被分发 voiceConf 的通道。

 

多发了一个 anylyticsEvent事件,这个事件主要是用来记录的,处理这个事件的actor只是将事件存入到Log文件中,只是用于记录事件log. 这个事件先不做分析。

 

消息现在到了eventbus ,接着往下分析eventbus中消息的处理。

 

 

在处理创建会议室时又使evetbus订阅了 会议室id,voiceCOnf,screensahreConf通道。 也就是说在用户进入后的所有操作的消息处理都在 RunningMeeting 的 MeetingActor 中。

消息的处理过程大多数是权限检测,数据检测等,然后通过后在apps模块新增相应的数据。 然后再将处理结果 发送出去。

 

再来分析发送消息出去的过程:

 

通过outGW 发送到 outBus2 的 meetingManagerChannel,然后再到 FromAkkaAppsMsgSenderActor 通过 msgSender 发送到redis 中去。

  相关解决方案