本方案属于本人,侵权必究
最近在做流媒体,发现客户端和后端的交互中,双端在消息传递过程中,消息受网络链路条件的制约,使得重要的消息可能在传输中丢失,使得双端瘫痪。为了防止这种情况的发生,提出了下面的消息传递闭环方案。
理论基础
对于直播和互动直播这种网络模型,有种非常显著的一个充分/非充分和必要/非必要的逻辑关系:对于a->b->c->d这样的多个节点单链路的信息传递模型,即如果信息从a出发,最终目的是d。
有这样的推论:如果信息到达了d,那么必定有信息也到达了b,c。但是反过来,信息到达了b,不一定到达c、d。信息到达了c,不一定到达d。根据这样的推论,可以在信息重要的情形下,建立这样的代码逻辑。这个推论可以用来:
1、形成回路:比如主播踢人操作,中间经过后端踢人,但是是否踢成功没有反馈,主播端就不知道。但是如果在收到踢成功的消息后,再给主播端一个反馈信息,主播端就可以明确是否操作成功。比如主播端收到了“踢人成功”的消息,那么必定是踢人成功;如果没收到“踢人成功”的消息,那就是踢人成功或不成功都有可能。解释(这个链路的信息传递是a->b->c,其中a是主播踢人消息,b是后端踢人成功消息,c是后端给主播的踢人成功的反馈消息。如果主播得到c消息,那么必定有b踢人成功消息,就是a到b实现了,且b到c也实现了。而如果主播没有收到c消息,它可能的情形是,a到b实现了,但是b到c失败,或者a到b没实现,也就不存在b到c了。)
上述情形可抽象到更多的情形。比如a->b->c->...->z。
将这个模型称为回路机制。
优点:可主动获取操作是否成功的最终结果,是一种主动动作。
缺点:由于有反馈动作,需要发送消息,会占用网络带宽
适用情形:必要情况下,比如建立连接的过程中
和超时操作关系:相辅相成,一个主动保证,一个被动保证
方案实现
由此,可以用回路机制,超时机制,递归算法来确立一个保证消息链路闭合的方案:
递归结束条件:1、收到回路信息;2、满足超时条件;3、或者自定义递归条件满足
递归继续条件:自定义(比如未超时,未收到回路信息等)
针对网络链路需要注意的点
此外,虽然网络链路中消息传输失败的可能性低,但是仍然具有风险性,尤其是对于网络链路条件差的,消息发送越多,失败率越高。因此,对于不必要的确认动作,需要精简。(网络链路中多次消息确认可以看成是马尔可夫链,那么最终成功的概率为P=P(第n个消息成功到达|第n-1个消息成功到达|...|第1个消息成功到达),其中,只要有一个前置条件失败,就会导致链路失败,因此尽量减少不必要的中间过程,也可提高成功率)
最后,衡量不同的操作重要性,结合长连接和短连接的特点,选用不同的连接方式,也是一个可以提升整体网络性能的方向。