一、IM 系统的高并发场景

IM 系统中,高并发多见于直播互动场景。比如直播间,在直播过程中,观众会给主播打赏、送礼、发送弹幕等,尤其是明星直播间,几十万、上百万人的规模一点也不稀奇。近期随着武汉新型肺炎疫情的蔓延,很多教育机构也提供了“停课不停学”的在线直播教学服务,也是一大直播互动场景。

直播互动场景具有这样的特点:流量峰值具有“短时间快速聚集”的突发性、流量随着开播和结束而剧烈波动,因而会带来很大的高并发压力。

二、IM 系统的高并发解决方案

1.网关全量转发

我们先看两张图:


可以看到两张图很像,但也有不同之处。
上面的图是普通聊天场景的流程图:
① 用户通过网关机进入直播间;
② 网关会保存、维护所有进入直播间用户的在线状态;
③ 用户 A 发送一条弹幕消息,经过一系列处理;
④ 通过网关机维护的用户在线状态,查询出同一直播间其他用户的网关机,将消息投递到这些网关机上;
⑤ 网关机将消息推送给用户的设备。
也就是:通过维护一个全局的“在线状态”,逻辑层在确定好接收人后,通过这个“在线状态”查询接收人所在的网关机,将消息投递给这台网关机,最后由网关机通过长连接进行投递。

问题来了!如果是一个 10w 人的直播间,每发送一条消息,就要对这个“在线状态”进行 10w 次的查询,更何况是多人、高频的消息发送呢?!

下面的图是基于上面的流程进行优化后的流程图,更适用于高并发聊天场景:
① 用户通过网关机进入直播间,会在每台网关机本机维护“在线状态”
② 用户 A 发送一条弹幕消息,经过一系列处理,投递给消息队列,而每台网关机均订阅了这个全局的消息队列,因而都能收到消息;
③ ;
④ 网关机通过本机维护的用户在线状态,将消息推送给用户的设备。
这个优化的核心就是:不再去精准地确认这个直播间的用户在哪些网关机上,而是将这个直播间的消息全量投递给网关机,再由网关机将消息下推给本机连接的用户设备,也就是下推服务不依赖外部状态服务

2.微服务拆分

对所有业务进行拆分:核心服务和非核心服务。核心服务如发弹幕、点赞、打赏等;非核心服务如直播回放、第三方系统的同步等。核心服务通过 DB 从库或者消息队列的方式与非核心服务解耦依赖,避免被直接影响。

对核心服务进行梳理:容易出现瓶颈点的服务和基本不会有瓶颈的服务。容易出现瓶颈的长连接入服务独立部署,并且和用户发送消息的上行操作拆分成各自独立的通道,这样能够使消息上行通道、和推送下行通道互相隔离。

3.自动扩缩容

直播互动场景的监控指标一般可以分为两大类:

  • 业务性能指标,比如直播间人数、发消息和信令的 QPS 与耗时、消息收发延迟等;
  • 机器性能指标,主要是通用化的机器性能指标,包括带宽、PPS、系统负载、IOPS 等。


通过收集业务性能指标或者机器性能指标,结合模拟线上直播间数据来进行压测,找出单机、中央资源、依赖服务的瓶颈临界点,制定相应的触发自动扩缩容的指标监控阈值,实现自动化。

4.智能负载均衡

扩容可能会出现旧机器和新机器对于新增流量负载不均衡的问题:

对于长连接入服务前端的负载均衡层来说,大部分都采用普通的 Round Robin 算法来调度,并不管后端的长连接入机器是否已经承载了很多连接,这样会导致后续新的连接请求还是均匀地分配到旧机器和新机器上,导致旧机器过早达到瓶颈,而新机器没有被充分利用。

这是因为负载均衡层支持自定义的均衡算法只能在某一台负载均衡机器上生效,无法真正做到全局的调度和均衡。最好的办法是接管用户连接的入口,在最外层入口来进行全局调度

比如,在建立长连接前,客户端先通过一个入口调度服务来查询本次连接应该连接的入口 IP,在这个入口调度服务里根据具体后端接入层机器的具体业务和机器的性能指标,来实时计算调度的权重。负载低的机器权重值高,会被入口调度服务作为优先接入 IP 下发;负载高的机器权重值低,后续新的连接接入会相对更少。

后记

上面的一些应对高并发的举措,不仅仅可以用于直播互动场景,也适用于其他业务场景,而选用什么策略往往是根据业务需求而定。

《即时消息技术剖析与实战》学习笔记10——IM系统如何应对高并发的更多相关文章

  1. 《即时消息技术剖析与实战》学习笔记4——IM系统如何保证消息的可靠性

    IM 系统中,保证消息的可靠投递主要体现在两方面,一是消息的不丢失,二是消息的不重复. 一.消息不丢失 消息丢失的原因 首先看一下发送消息的流程,如下图所示: 消息.可以采取"时间戳比对&q ...

  2. 《即时消息技术剖析与实战》学习笔记5——IM系统如何保证消息的一致性

    一.什么是消息一致性 消息一致性指的是消息的时序一致性,即消息收发的一致性.如果不能保证时序一致性,就会造成聊天语义不连贯,引起误会. 对于点对点的聊天场景,时序一致性保证接收方的接收顺序和发送方的发 ...

  3. 《即时消息技术剖析与实战》学习笔记1——IM系统的架构

    一.IM的应用场景 聊天.直播.在线客服.物联网等所有需要实时互动.高实时性的场景,都需要应用到 IM 技术.

  4. 《即时消息技术剖析与实战》学习笔记6——IM系统如何保证消息的安全性

    在消息产生.流转的各个环节中,需要保证消息传输安全性.消息存储安全性.消息内容安全性. 一.消息传输安全性 消息传输的重要防范点有两个,一是访问入口安全,二是传输链路安全. 1.HttpDNS保证访问 ...

  5. 《即时消息技术剖析与实战》学习笔记12——IM系统如何提升图片、音视频消息发送、浏览的体验

    IM系统如何提升用户发送.浏览图片和音视频消息的体验呢?一是保证图片.音视频消息发送得又快又稳,二是保证用户浏览播放图片.音视频消息时流畅不卡顿. 一.提升用户发送图片.音视频的体验 1. 多上传接入 ...

  6. 《即时消息技术剖析与实战》学习笔记11——IM系统如何保证服务高可用:流量控制和熔断机制

    IM 系统的不可用主要有以下两个原因: 一是无法预测突发流量,即使进行了服务拆分.自动扩容,但流量增长过快时,服务已经不可用了: 二是业务中依赖的这些接口.资源不可用或变慢时,比如发消息可能需要依赖& ...

  7. 《即时消息技术剖析与实战》学习笔记3——IM系统如何保证消息的实时性

    IM 技术经历过几次迭代升级,如图所示: 从简单.低效的短轮询逐步升级到相对效率可控的长轮询: 全双工的 Websocket 彻底解决了服务端的推送问题: 基于 TCP 长连接衍生的 IM 协议,能够 ...

  8. 《即时消息技术剖析与实战》学习笔记7——IM系统的消息未读

    一.什么是消息未读 消息未读包括会话未读和总未读.前者指的是当前用户和某一聊天方的未读消息数,后者指的是当前用户的所有未读消息数,也就是所有会话未读的和.比如用户A收到用户B的2条消息,还收到用户C的 ...

  9. 《即时消息技术剖析与实战》学习笔记8——IM系统如何保证长连接的可用性:心跳机制

    假设有以下突发意外情况: 用户进入信号不好的地方,手机没有网络信号了 上网的路由器突然掉线了 这个时候,比如微信发消息,消息就会转圈圈,甚至变成红色叹号-- 上面情况都会导致"长连接&quo ...

随机推荐

  1. JMeter Web测试计划

    在本节中,将学习如何创建测试网页的基本测试计划. 出于演示测试目的,我们将测试URL - https://www.yiibai.com/ 的网页性能. 创建JMeter测试计划 进入到JMeter安装 ...

  2. Struts2注解详解(转)

    一,引入支持Struts2支持注解开发jar包: struts2-convention-plugin-2.1.8.1.jar(支持Struts2框架注解开发的jar包) 二,Struts2使用注解开发 ...

  3. POJ-1741 树上分治--点分治(算法太奇妙了)

    给你1e5个节点的树,(⊙﹏⊙) 你能求出又几对节点的距离小于k吗??(分治NB!) 这只是一个板子题,树上分治没有简单题呀!(一个大佬说的) #include<cstdio> #incl ...

  4. 2019 ICPC南昌网络赛 B题

    英雄灭火问题忽略了一点丫 一个超级源点的事情,需要考虑周全丫 2 #include<cstdio> #include<cstring> #include<queue> ...

  5. 并查集的超市问题---溜TM的

    三个月前我就错了,现在又错了,我就是个傻****** 服了,看图哇 打扰了... #include<cstdio> #include<iostream> #include< ...

  6. CSS3(4)---动画(animation)

    CSS3(4)---动画(animation) 之前有写过过渡:CSS3(2)--- 过渡(transition) 个人理解两者不同点在于 过渡 只能指定属性的 开始值 与 结束值,然后在这两个属性值 ...

  7. spring之通过注解方式配置Bean(一)

    (1)组件扫描:spring能够从classpath下自动扫描.侦测和实例化具有特定注解的组件. (2)特定组件包括: @Component:基本注解,标识一个受spring管理的组件: @Respo ...

  8. 浅析vue封装自定义插件

    在使用vue的过程中,经常会用到Vue.use,但是大部分对它一知半解,不了解在调用的时候具体做了什么,因此,本文简要概述下在vue中,如何封装自定义插件. 在开始之前,先补充一句,其实利用vue封装 ...

  9. Q&A系列一:DataPipeline常见问题回答

    不知不觉中,大家已经陪伴DataPipeline走过了3年时间.在这期间,得益于客户们的积极反馈和沟通,我们总结了一些日常工作中比较常见的问题,并基于这些问题进行了总结. 为避免突兀,我们会先从比较基 ...

  10. 高德API对接

    <?php class GaoDeAPI { private $key = '123456789'; # 你应用key /** * 地址转经纬度 */ public function getTr ...