远程教学之消息顺序保证机制.md 2.46 KB

返回在线授课相关文档

以IOS目前的实现思路为例说明

教师端主要是针对页面内的动作消息,包括按钮的点击,手势操作,答题的动作以及播放器的播放等 学生端主要是针对各种回答的消息。 这些消息需要按照发送的顺序被处理,如果有提前到达的消息,需要接收方有一个缓存机制先保留消息留到以后处理。

发送方记录的同步信息:

  • 学习页的编号(从0开始递增,每次进入学习页,本次学习的总学习页编号加1)
  • 页内动作的编号(从0开始递增,在学习内内,每做一个动作,该页的动作编号加1,在进入新的学习页后重置为0)

接收方的同步信息

  • 接收到的学习页的编号(接收到的课程信息会附带SendPageIndex,设置为这个值)
  • 期待的页内动作的编号(从0开始,每次收到信的符合顺序的页内动作信息,本编号加1,等待下一个符合要求的消息)

同步策略

  • 消息接收端构造1个本地缓存消息队列
  • 发送端记录发送的学习页序号和页内消息序号,接收端记录收到的学习页的序号,和消息序号
  • 当收到的消息不符合预期顺序的时候(例如后发先至的消息),把该消息缓存到队列
  • 当收到的消息符合预期顺序的时候,直接处理该消息,处理完毕后更新期待的消息序号,然后检查缓存队列中是否有期待的消息序号,如果有则拿出来继续处理,重复执行本条逻辑直到缓存队列中没有期待的消息序号为止。(处理队列中缓存信息的时候,需要设置一定的时间间隔,以防止两个相邻动作执行过快,破坏画面的动画效果和预期的结果)
  • 当接收端根据接收的信息创建一个新的学习页面后,清空队列中之前页面的动作消息,从队列中查看是否有先于页面到达的第0个页内动作信息,有则处理,没有则等待动作消息到达。
  • 切换页面的时候,重置期待页内消息序号。
  • 结束课程的时候,重置期待学习页序号,页内消息序号,清空队列。

待解决的问题

  • 如果预期的消息迟迟未到,例如超过10秒,接收方应该向发送方重新请求预期的消息。(需要发送方保持一个当页的发送队列,以备接收方再次请求的时候,再次发送该消息,发送该消息的时候,应该保持原来的序号)