我是从2002年参加工作,至今已经十七年,其中有十五年的时间都是在做关于 IM
的工作。2004年时我加入了 MSN,作为 MSN
进中国第一个落地的本地化服务,我在其中担任项目负责人的工作。2008年到2014年间我都在从事与飞信相关的工作,经历了飞信从一个非常小的业务成长为数亿级规模的水平。2014年后随着云服务的兴起,我与团队创立了融云,将即时通讯与云服务结合提供给开发者,让开发者可以通过调用
SDK 使用 IM 服务。
关于信令服务和媒体服务的关系,绝大多数的厂商信令服务和媒体服务都是在一起的,融云的设计理念强调要解耦,使得部署和维护都更简单,因此信令服务和媒体服务之间也需要解耦和无依赖,信令服务与媒体服务之间原本存在的状态同步也要解开,而且融云本身就有特别健壮的信令服务,因此可以复用融云的
IM 通道,融云本身在这方面的投入也相当大。
上图是为了实现解耦引入的实时通信发布/订阅的模型,当 Client A 要与 Client B
进行会话时,第一步是进行发布,首先用 Client 调用 IM Server,提交加入房间/通话申请,调用信令服务的目的是拿
Token 返回,Token 中包括之后整个订阅/发布功能所需要的关键数据,拿到这些 Token
之后去调用相关媒体服务的地址,传统的设计通常是找信令服务,在分析 IP 地址库之后指到媒体服务,由于我们需要做到解耦,因此在
Token 调用媒体服务后会给出一个返回值,返回值是 IP 地址和 Domain。返回 Client 之后就可以拿到 IP
的信息,连到媒体服务开始与 Client B 通信,通信的过程完全是依靠长链接的信令服务通道来进行的,Client A
将它得到的 Domain 信息发送给 Client B,此时发送阶段工作结束。发送阶段结束之后由 Client B
来执行订阅工作,Client B 会找到离它比较近的信令服务,调用媒体服务接口连到 Client A
连接的媒体服务,这就是完整的发布/订阅模式。
融云在做 IM 的时候对于全球网络设计有非常丰富的经验,通过多年来在全球覆盖地区 IM
网络和基础数据的收集,基本可以了解全球各个地区的实时网络变化情况。在这过程中团队总结出任何物理的优化都不是特别稳定,因此全球网络的设计理念就包括客户端就近接入,多链路选择,数据中心间同源音视频只有一路级联,利用IaaS能力进行中心间级联链路的优化。
5.2 跨国级联示意图
跨国级联示意
5.3 全球网络的工作
另外,融云在全球网络中还做了一些工作,比如 DoH 刚在2018年9月变成RFC
的标准,主要解决 DNS 中间人劫持问题,根据融云这么多年业务开发经验来看,很多连接问题最终发现都是由 DNS
劫持导致的。另外在引入 SmartDNS 时会遇到 LocalDNS
缓存不准的问题,这些都会导致最终分配的就近地址不是真正的就近地址。融云目前的工作模式是将三者结合起来使用,在引入
SmartDNS 技术的同时引入 BGP Anycast
运营商技术来解决最近地址问题,通过这三层技术最大化来保证找到用户的最近地址。另外可以在某些特殊情况下采用公网链路来做数据中心之间的级联通信,绝大多数厂商碍于成本的考虑也采取了这样的方法,但公网存在某些特殊情况不稳定的问题,因此需要有一些备用链路,甚至在一些特殊的国家地区做物理链路优化,融云
IM 在全球的基础网络设施投入很大成本,也收获了很可观的成绩。