作者回复: 可以通过插帧的方式来解决。视频流每隔一定帧数内,插入服务器的时间戳,聊天内容也埋入服务器的时间戳。回放视频时到达相应的时间戳,获取跟这个时间戳相匹配的消息在页面上渲染出来即可。
作者回复: 是的,实际上也不需要等到最后一个长连断开哈,对于剩余的少量的长连接可以采取强制断开方式,等待客户端断连重连即可。
作者回复: 嗯,这是个好问题,我们来理一理。
先想一想群聊和直播的使用场景,对于直播场景来说,房间和房间之间是隔离状态,也就是说每次用户进入到一个房间,都需要通过信令告诉网关机自己当前连接的是哪个房间,这样网关机才不会推错消息。正是通过这个加房间的信令,网关机有机会来维护一个 房间 - 用户 -连接的关系,因此对于直播间消息,我们的消息给到网关机时只需要按房间维度来pub消息就可以;但是对于群聊来说,群和群之间不是隔离状态,我们的长连接对于任何群的消息都是需要推送的,因此在app打开建立好长连后,客户端不需要再告知自己当前进入了哪个群,所以网关机在建立长连时只能建立一个 用户 - 连接的映射,所以对于群聊我们需要在提交给网关机时扇出成用户维度才可以。
理解了上面说的就不难解答你的问题,用户离开直播间加入另一个直播间都会通过长连通道下发一个退出旧直播间信令和加入新直播间信令(或者一个切换房间信令),这多个信令都是被长连接那一台网关机接收到并处理的,所以不存在需要多网关机同步数据的问题哈。
作者回复: 是的,所以这个需要一个权衡,如果业务场景大部分都是点对点场景那么使用全局在线状态来精确投递是更好的选择,如果是群聊和直播类似扇出较大的场景推荐使用所有网关来订阅全量消息的方式。
作者回复: 这个问题可以思考一下:一个用户的好友是有限的,在线状态如果是通过中央kv型存储的,并发查询几百个好友也并不是个问题,性能上不会太慢,只是存储压力会比较大。如果真要优化,好友数太多的情况下,我个人觉得可以把这个用户的好友查出后,组装成一条特殊消息下发给所有网关机,由各台网关机认领各自本机维护的这些好友中的那些在本机登录连接的,然后push上下线消息就可以。
作者回复: 嗯,看具体业务的在线率和网关机数量吧。低在线直播间本来没量也不是重点,我们的重点是要解决那少数几个高热度、高并发的直播间的问题。
作者回复: 个人感觉还是需要理论结合实际来学习哈,平时没事的时候可以用wireshark抓点包来分析研究一下,印象和理解都会不一样的。推荐一下林沛满的两本wireshark的书吧。。
作者回复: 直播和聊天室场景第一种使用更多,点对点的也有很多使用第二种的,对于网关服务器不太多的业务,个人倾向都使用第一种。
作者回复: 是的,对于长连接的网关服务,我们缩容是只需要禁止新的建连请求接入,已存在的长连接尽量等用户自动断开后关闭,对于剩余的少量的长连接可以采取强制断开方式,等待客户端断连重连即可。
作者回复: 扩容网关机收到的是扇出前的单条房间维度的消息呀,扇出是在网关机的逻辑里实现的,扇出完就推送出去了。分拣消息慢这一块可以优化一下,在用户上线时在网关机以房间维度建立当前房间的本地用户连接列表,下推时直接获取连接列表就可以了。我们线上下推qps实际能到千万级别,绝大部分机器都是弹性扩容的。
作者回复: 是的,一般还需要先禁止新的连接接入,可以通知客户端断线重连或者等待大部分旧连接断线后再杀进程。
作者回复: 这个具体还是需要根据你的业务访问量来决定,一般单个域名搭配多个vip能满足大部分场景的,对于访问量很大、对DNS解析性能不满意的可以通过HTTPDNS方式来解析域名并根据后端vip的压力进行均衡和调度。
作者回复: 个人理解如果你这里指的200ms的延迟是从客户端发出到另一个客户端接收的话,这个估计比较有挑战呀,光速绕地球一圈也得一百多毫秒,国内一般rtt在几十毫秒比较正常,海外用户的话就够呛了。发布订阅都在主库上延迟实际也还好呀,如果担心这一块也可以尝试通过rpc来直接从业务层调用网关层推消息,不过不维护中央的在线状态的话就需要并发来调用所有网关机了。
作者回复: 什么业务场景需要知道每个成员连接在哪一台服务器呀?实现上倒是不难,这个用户上线的时候把他连接的服务器ip也当做一条业务消息push给这个用户加入的所有群里的用户就行。不过一个用户加入的群会比较多,你说的应该是类似聊天室场景吧,同时一个用户只能在一个聊天室里面。
作者回复: 一般全局共享的就行,因为直播间上行消息本来不多,考虑到消息频率过快一般都还有每秒消息数限频,所以扇出前需要下推的消息数不多的。
第二个问题就是课程里讲过的,根据后端服务器压力比如连接数,pps,带宽等来调度,让后端接入服务器压力小的入口vip承接更多请求。vip和后端接入服务器成组成组的扩容,所以比较方便处理。
作者回复: 大部分场景发消息可以不用短连接,都使用同一个长连。对于直播互动场景,由于下推压力大,为了不影响用户发消息行为,所以可以通过短连来隔离一下。为什么不是再多维护一个长连主要是出于维护成本考虑,支持一定idle的短连基本上够用了。
作者回复: 容器化这个在后面的课程会讲到哈,依托docker能够非常简单的实现。
作者回复: 没看懂呀~