海量消息的直播互动系统---融云

海量消息的直播互动系统---融云

融云是做即时性消息通宵的一个平台,由于这个产品和我们目前正在开发的pushservice比较像,所以后期思考的比较多,和讲师也多次线下沟通,但是由于某些原因,具体的业务细节并没有进行详谈,方案上有很多可借鉴之处。

其业务模型如下:

下面分析下他这个模型:

在一个实时消息推送系统中需要保证不同QoS级别的消息,想一些红包之类就需要完全高可靠,像一些弹幕就需要通过设置消息可靠性的等级来推送,有的就不需要保证太强的可靠性。由于是直播间,那消息量和用户量都是没有上线的,且瞬间并发量很高。总结起来有以下几个特点:

1、链接数无上线

2、瞬时消息峰值较高

3、红包礼物要求保障可靠性

4、系统稳定性好

5、系统可伸缩性好

其业务模型大致如下,客户端发送一个消息到服务端时,服务端返回一个应答ack,确认消息已经收到,这里每个消息都一个递增的消息id,然后服务端将消息id发送给客户端,客户端来去这个id所对应的消息,当然也可以一次发送某一段的消息id,客户端B收到消息后,来服务端查询,如果查询不到可以继续查询(或等待下一次消息id的推送)。

这样做的几个原因:

1、通知的推送无需消息质量的保障

2、服务端的消息存储顺序和和到达客户端的顺序一致

3、消息密集时可以将消息合并进行处理

4、可以控制消息的下发条数

5、以存储分级实现消息分级

6、不以消息的条数控制服务器的规模,以用户连接数来控制

这里有个疑问:为什么不是主动推送消息到客户端B,等客户端B应答ACK?

如果推送超时,那么需要重新推送。而现在不需要(主要和直播这种业务模型有关,这里可以采用定时器,或者等下一条消息推送到了,就会触发下一次推送,通常下一条消息到了的可能性较大)。(注释:服务端和客户端之间的通讯采用的是私有化的MQTT实现)

还有个疑问就是如何保障缓存区不溢出?

每个类型的消息都有一个队列,可靠性高的就不设置队列限制,反之就采用LRU算法来限制队列。

其组网架构如下:

海量消息的直播互动系统---融云_第1张图片

时间:2014-2015.8

同一直播间的用户会落到同一节点。

业务与消息在同一服务

最大支持单一直播间9000人(爆个内幕:直播服务上面显示的人数一般都是现有人数的xx倍)

这里有个问题就是连接层和业务层是两个集群,(私下沟通:其集群内的通讯都是通过ak来完成)那么在集群通讯的时候,另外一个集群只有一个receptionlist节点来接受消息,在一定程度上会形成消息瓶颈。(这里在微信问了讲师,还没回,好像被我问烦了。。。)可能需要我们自己实测一下。

2.0版本

海量消息的直播互动系统---融云_第2张图片

2.0的版本将消息服务和直播服务分开了。。。


海量消息的直播互动系统---融云_第3张图片

2.1的时候有加了一个控制层,估计是用来做路由的,将某条消息路由到某个固定的连接

还需要了解的技术点:

一致性hash保证连接,环形队列保证?

gj8:[~N

你可能感兴趣的:(海量消息的直播互动系统---融云)