当前位置: 华文星空 > 知识

技术解码 | IM全球智能通信之接入调度服务

2021-06-16知识

人类社会对通信的强需求,推动着通信技术的不断进步。从车马邮驿到万物互联,通信的距离、速度、传播对象、传输网络等都发生了革命性的变化。

在移动互联网时代,即时通信是一种最基础的产品场景。腾讯云即时通信IM(Instance Message)基于QQ超过20年的IM社交领域积累开发,仅需植入SDK 即可轻松集成聊天、会话、群组、资料管理等能力,帮助产品实现文字、图片、短语音、短视频等富媒体消息收发,支持各大平台小程序接入使用,全面满足通信需要。

腾讯云IM旨在为客户提供简单接入、稳定必达、覆盖全球、场景丰富、安全可靠的即时通信平台能力。从功能层次上看,整个IM平台可以分为终端、接入层、逻辑层、存储层。再加上调度、监控、配置等各个平台运营系统,即构成了整个IM系统。

本文将详细介绍腾讯云IM在接入及调度方面的最佳实践。

接入层为各种类型的终端提供全球范围统一联网接入、调度、加解密、鉴权、路由转发、频控等核心能力,另外具备防重放、防DDos等安全防护能力。在接入类型方面,提供Android/IOS/Windows/Web/小程序等全类型覆盖的终端接入,同时为IM后台提供RestAPI统一接入,回调客户服务的统一出口。

在覆盖度方面,腾讯云IM在全球各主要国家都有部署,全球加速节点超过2500个。对于多地域多节点的接入,为了实现最优接入,让用户达到最优体验(登录成功率、收发消息时延、稳定性等),终端和后台在设计联网调度策略时,需要对各个方面都做细致考虑。下来腾讯云IM通过在即时通信领域内超过20年累积的接入调度经验,分享腾讯云IM在获取IP列表、选址、防孤岛、网络质量评优、以及精细化运营等几个方面的实现策略。

1、获取接入IP列表 业界常用的做法有两种,一种是给APP分配一个域名,通过域名解析直接获得接入点。通过为域名配置地域运营商调度规则,实现域名解析就近接入;另一种是直接给APP hardcode或下发一批IP地址,APP利用简单群ping跑马,哪个IP先回来就选哪个IP进行联网。这两种做法一个优势就是逻辑简单,容易实现。但劣势也很明显,例如,DNS劫持或DNS故障导致无法获取IP列表、外网波动时要么无法调度要么会全部跑到同一个IP上,引起服务过载、群ping逻辑无法选到最优接入点等等。和常见做法不同,腾讯云IM终端可以通过多种方式获得IP列表。APP首次使用时,可以通过httpdns,anycast接口拉取,localdns域名解析等多种方式主动获取接入点IP。客户端连接到IM后台后,后台会主动下发IP列表。列表包含最优、次优接入点,以满足最优接入和容灾容错的需求。主动下发调度列表和指令的方式,可以实现用户的精准调度和实时迁移。 2、建联策略 客户端在获取到IP列表之后,启动与接入层之间建立TCP长连接。客户端建联时需要考虑多方面的问题。1)失败重连机制:客户端如果与接入层建联失败或者感知连接异常关闭后,则应启动重连。重连时选择IP列表中下一个IP,同时按照有最大阈值的指数时间增长间隔重连,防止网络波动等异常给后台造成雪崩。2)长连接维持:考虑到TCP建联的成本,客户端与接入层之间需要维持长连接。因为运营商中间网络会话存在超时回收,因此客户端需要在会话超时时间内发起数据包,如果没有业务数据包,则应该及时发送心跳包维持长连接。客户端在一定时间内如果连续出现多个请求包或心跳包响应超时,则可判定长连接异常。接入层也可以主动push连接探测包,以判断连接是否正常。

3)孤岛问题:接入层孤岛问题是指客户端到接入层IDC节点之间公网访问正常,心跳收发也正常,但是接入层到各个业务系统之间的内网访问异常,这时接入层无法正常转发业务请求,造成客户端请求超时。客户端在一段时间内,出现连续N个不同业务包超时时,则应该重连到IP列表中的容灾节点。 3、网络质量评优 如果说调度系统是IM的指挥官,那么网络质量评优系统就是这个指挥官的军师,给调度系统提供最优的决策方案。调度系统利用网络质量评优系统实现最优接入,网络波动实时干预等能力。腾讯云IM在构建和优化网络质量过程中,探索出一些设计思路和经验。

1)丢包时延加权算法:网络质量评优系统以网关维度来评测该网关的网络质量,并生成该网关的最优调度列表(包括最优次优,精确到IP+端口),每个质量数据会涉及到该网关到各接入点的时延rtt、丢包率c及超时时间D这三个指标,所以在计算最优接入前先要按照加权方式把这三个数据统一量化成一个数值。 我们通过多种数据建模,并利用 ABTest进行上千次用户质量提升对比,最终探索出数值的计算公式 t=rtt+Dc/(1-c) ,另外考虑到国内网络实际情况,以及质量评优在计算时可能存在偏差,所以在计算最优列表时会对同运营商接入自动减去一定权值,确保在数据接近情况下按同运营商接入。2)脏数据剔除:由于公网环境的多样性和复杂性,任何模型产生的质量数据,都会存在脏数据情况。我们分析了一下,发现我们每天产生的质量数据中,脏数据约占10%,如果不识别出这些脏数据并做剔除处理,那么这个量级会影响到质量评优系统对最优调度列表的计算,导致无法给到用户选择最优接入,腾讯云IM根据依据多年的探索,最终设计出一种简单实用的脏数据剔除算法,原理很简单,就是利用同一时刻同一个网关到同个接入点生成的质量数据应该趋于一致的思想,对差异较大数据做识别并自动剔除。

3)平滑rtt算法:对于持续的探测数据,我们尝试过算术平均、几何平均、时间序列及平滑rtt算法,最终从效果来看,平滑rtt算法效果最优。

4、精细化调度 对于用户调度,除了考虑速度质量,还需要考虑接入层容量、容灾容错等因素,实现IP、IDC、运营商、地域级别的用户实时调度。根据统计,平均每天外网抖动次数超过200次,原因多种多样,比如线路被挖断,运营商割接等。从影响来看,这些抖动可能会导致最优路径变差,甚至不可用,这需要调度系统能及时识别并把用户重新调度到相对最优的接入点。例如,2014年12月3日,重庆联通到全国各地质量都出现大的丢包,默认策略是调度到深圳联通,其中深圳联通丢包率高达40%。网络质量评优系统分钟级感知到重庆联通网络发生变化,并立刻重新生成最优接入列表,把重庆联通用户从深圳联通IDC调度到深圳电信IDC接入点,从而降低对用户的影响。我们采用了ABTest对比方法,保证有约20%用户不使用网络质量评优系统调度调度,其他80%用户使用网络质量评优系统调度。

5、调度演习 所有好的调度机制,如果不定期演习,那么到了真正启用时,往往会发现就是一堆定时炸弹,或无法生效,或产生其他极端的副作用,所以需要建立常态化的调度演习,通过演习来保证策略的持续有效性。

接入节点覆盖和最优调度,解决了第一公里传输问题。对于长距离的海外传输,中间传输质量对整个系统的体验同样至关重要。腾讯云通信IM通过增加中继节点、智能路由、QUIC协议加速、专线传输、多IDC服务就近寻址发现等加速机制保证IM在全球的体验上真正实现连得上、连得快、连得稳的目标。

1、增加中继 传输层是端到端的协议,增加中继是指将长距离的端到端传输,分割成多段传输层代理中转的模式。设链路最大带宽时延积BDP为b,最大带宽为B,RTT为t,增长到最大窗口需要的时间T=log2b*t=log2(B*t)*t。增加中继,分段的RTT变小,分段间的传输层窗口调整更快,因此可以更快达到线路的吞吐量。另外,某一段丢包,丢包发现和恢复快,并且不影响其他段的传输。 2、QUIC传输协议 传统的传输协议优化方式,一般指优化TCP拥塞控制算法,例如基于带宽测量的BBR算法等。但是TCP重传歧义的缺陷,终究无法完全克服。现在越来越多的业务,使用基于UDP实现的QUIC协议实现可靠传输加速,事实上QUIC已经是HTTP3的标准。腾讯云IM加速传输使用QUIC协议进行数据中转。 3、最优路径

把全球范围的IDC节点作为顶点,节点之间的互联作为边,就构成了一张双向拓扑图。互联节点通过相互探测,可以获取节点间的延时rtt和丢包率loss。那么,节点之间的距离d=c*rtt/(1-loss),其中c为光速常量。将距离作为拓扑权重,就形成了一张双向带权图。基于已有的拓扑图,并结合最优调度选择的接入节点和出口节点,使用Dijkstra算法即可计算最短路径。下图是选择的部分节点之间传输,直连和最优路径加速之后的延时对比。

4、回调智能寻址 腾讯云IM云,通过统一的多地出口Proxy集群回调客户第三方HTTP(S)服务时,由于外部网络环境以及第三方业务的不可预知性,业务机器需要选择Proxy机器作为访问第三方HTTP(S)服务的最优出口,做到访问耗时最短,成功率最高,并且能够自适应网络波动和自恢复。

我们通过在Proxy出口机器获取和第三方客户服务的TCP连接Rtt信息和业务的成功率作为出口决策的指标。例如,客户服务在南京部署,那么各地出口Proxy探测结果比较,上海最优,因此业务会选择上海出口访问客服服务。下图可以看出,相比随机出口,回调智能出口寻址在提升回调成功率和降低延时有明显优化效果。

腾讯云IM接入层在单机接入和处理能力方面进行了持续的性能优化。利用vtune、perf、strace、gprof等各种性能分析工具和基础监控,分析服务在操作系统层面和业务层面,对CPU、内存、网络、磁盘等资源使用的性能瓶颈。在支持加解密、打解包、压缩、监控汇聚、频控、包中转等逻辑的情况下,在8核16G内存的机器上,可以支持到70w在线和接近10wpps的外网包量。

1、系统参数调优 1)增大somaxconn值2)增大监听backlog3)打开tcp_syncookies4)关闭timestamp5)增大route cache条目6)减少initial RTO值7)CPU中断优化 2、业务逻辑优化 衡量接入层是否强大的一个核心指标就是看接入层单机支持同时在线数和处理的包量。这意味着程序需要尽可能减少每个请求消耗的cpu和每条连接消耗的内存,从而支持更多的在线量。我们经过多次的调优后,总结出接入层可以考虑的几个优化方向:

1)逻辑处理全异步化。2)用户session数组化,利用fd做index,加快查询速度。

3)减少加锁粒度,尽量使用循环队列,或基于CAS原理做成伪无锁数据结构;对数据按线程数做逻辑拆分,进行无锁化设计。

4)慎用map、set这种非O(1)的数据结构,需要的话考虑用hash_map、hash甚至数组来替代。

5)内存分配使用tcmalloc,加快分配速度。

6)日志使用direct io直接落地硬盘,主要为了减少占用系统cache,导致在内存紧张时出现swap而影响程序性能。

7)struct中各字段按字节对齐原理排序,防止空洞。

8)减少字符串直接比较,可以改为先比较前4字节或8字节,符合条件后再进行完整比较。

9)代码编译优化,例如部分频繁调用且耗时的计算逻辑,单独成文件,加O2编译选项进行编译。 3、富媒体传输优化 1)多连接多分片上传。2)预建连预发送。在用户选图片时客户端就先和后台建立连接,并开始发送用户选到的第一张图片的第一个分片,根据统计,用户选到第一张图片并最终会发送出来的概率超过90%。3)支持秒传。当用户要发送图片时,如果我们发现图片已经在后台存在了,这时不用真实发送图片,只需要给后台发送一条图片发送成功的信令即可。4)断点续传。

1、接入点 clb提供vip到机器实例的端口转发能力,clb端口探测能力能够实现机器实例故障的自动屏蔽。结合测速系统和容量调度系统,接入层提供机器实例、IP、IDC、运营商、地域等多个维度的故障自动调度能力。 2、频控能力 终端SDK在实现时需要对建联以及接口发包速率做底层控制,避免上层不恰当使用造成频繁的建联和接口请求,给接入层和后台造成负载压力。接入层提供用户、客户、接口等多维度的请求频率控制能力,为接入层和业务后台提供保护。 3、沙箱调度 开发者对SDK的使用差异,客户端版本迭代,异常逻辑等各种因素,可能造成终端异常。比如持续的建联断链,持续高频发送特定接口请求等,造成接入层资源的大量耗费。腾讯云IM接入层建设了沙箱集群环境,对于异常的客户或SDK版本,可以调度到沙箱集群环境,避免对其他客户造成影响。 4、过载保护 对于接入层来说,过载保护包括两部分,一是对本身的过载保护,二是对后端的过载保护。1)对接入层的过载保护:

  • 由调度系统的动态均衡和容量保护策略来做保护;
  • 单机连接数保护,超过限制会close新用户;
  • 有请求队列长度和延时保护,超过长度的请求或在队列中时间超过1秒的请求均会自动丢弃;
  • 2)对业务后台的过载保护:

  • 通过请求成功上报,自动屏蔽失败率高的机器;
  • 关闭重传功能。业务后台出现成功率低的情况时,如果继续重传,则会带来滚雪球效应,因此需要降低重传比例,甚至适当比例的主动丢包;
  • 调整longpolling拉取时间间隔,根据消息优先级保证高优先级消息可靠传递,限制群消息下发条数,避免直播大群群消息这类的扩散类接口给业务后台带来的冲击。
  • 接入层给客户端SDK推送对接口业务做频率限制请求,请求包包括是否弹tips、允许下次发送该命令字的时间间隔,从SDK侧拦截用户请求,彻底减少到后台的请求量;
  • 柔性服务策略。例如当群成员资料模块出现故障,且短时间无法恢复,那么可以临时关闭该功能,即使用户获取不到群成员资料,对应用体验影响也不大。
  • 接入层是整个IM系统的门户,是整个服务的第一道屏障。因此,接入层对保障IM业务的安全,有至关重要的职责。 1、基础安全 在基础安全方面,通过腾讯云的防DDos服务,以及门神web安全检测能力,为腾讯云IM业务保驾护航。 2、接入层安全 在逻辑方面,接入层需具备防重放,防串包的能力。通过引入服务端cookie机制,校验TCP连接上传输数据的有效性,防止业务重放。收到后台业务回包时,通过校验终端连接关联的序列号,防止下发的包出现串包。后台通过加密机制,保证数据的保密性和防篡改。通过票据校验机制,验证用户身份的有效性。 3、业务后台安全 接入层在对业务后台的保护方面,提供用户、接口、客户、版本等各个维度的频率控制或屏蔽能力,防止异常终端持续对后台带来安全风险。同时接入层提供和业务安全打击的联动能力。

    1、控制台 一款好的云产品,控制台体验至关重要。控制台需要提供DAU、请求量、流量、分版本分平台等各种业务指标多维度的实时统计,精确的计费数据,监控告警,业务报表,问题分析工具集,配置变更等能力。 2、监控告警 业务的持续健康运营离不开完备的实时监控告警系统。监控系统应该包含对CPU、内存、磁盘、网络、组件等基础属性,以及业务容量负载、成功率指标、延时、业务逻辑、客户、版本等多维度属性进行监控。结合自动化聚合分析、整体数据分析,提供智能监控运营能力。同时联动邮件、短信、电话、微信、企业微信等通道,分风险级别传达告警通知。辅以定期的人工巡查,提升监控告警的准确性,避免经常性的误告降低研发运营人员的风险意识。 3、全链路日志 由于IM后台服务分模块解耦,以及内部业务以微服务模式运行,因此,终端的一个接口请求,可能在后台会产生很长的服务调用关系链。为了明确调用关系链中各阶段请求响应情况,需要进行全链路的跟踪。客户端在请求接口时,产生一个trace id,各个业务后台的跟踪日志,需要统一上报,并带上该trace id。这样在调试阶段或者定位问题时,可以根据全链路日志,快速定位到是调用链中哪个环节存在问题。 4、客户端上报 由于客户集成方式、用户使用习惯、所处位置、网络环境、使用场景等各不相同,并且整个IM服务按功能分模块解耦,因此后台很难完全感知客户端的行为。客户端SDK可以采集用户使用应用时,应用的执行逻辑和产生的非隐私数据,并上报到IM服务平台,用于分析用户、客户、地域、版本、终端类型、平台等多维度的客户端表现,包括获取登录成功率、联网耗时、消息成功率等核心业务指标。 5、业务报表 业务报表可以为产品规划和运营提供决策指引。针对客户、场景、流程做差异化的运营策略,提升运营动作的效率最大化。基于业务数据分析的产品不断验证优化迭代,实现产品用户与价值的持续增长。