在第 1 讲“架构与特性:一个完整的 IM 系统是怎样的?”中,有讲到即时消息系统中非常重要的几个特性:实时性、可靠性、一致性、安全性。实际上,这些特性的实现大部分依赖于通道层的稳定和高可用。
对于即时消息系统来说,消息的通道主要承载两部分流量:一部分是用户发出的消息或者触发的行为,我们称为上行消息;一部分是服务端主动下推的消息和信令,我们称为下行消息。
由此可见,消息通道如果不稳定,一来会影响用户发送消息的成功率和体验,二来也会影响消息的下推,导致用户没法实时收到消息。
那么,在面对如何保障消息通道的高可用这一问题时,业界有哪些比较常用的优化手段呢?
让消息通道能连得上
要保障消息通道的高可用,最基本的是要让通道能随时连得上。不过你可能会觉得,这看起来好像挺简单的,不就是申请个外网虚拟 IP,把接入层服务器挂上去,然后通过域名暴露出去就行了吗?
但实际上,这个“连得上”有时真正做起来却不是那么容易的,主要原因在于用户的网络情况复杂性高。比如,有的用户走 2G 网络来连,有的通过 HTTP 代理来连,还有的会出现 DNS 解析服务被封的情况,诸如此类。
此外,移动运营商各种比较奇怪的限制也会导致连通性不佳的问题。因此,要想你的通道能让用户随时都连得上,还需要做一些额外的优化。
多端口访问
首先就是端口的连通性问题。
计算机端口范围是 0 ~ 65535,主要分成三大类:公认端口(0 ~ 1023)、注册端口(1024 ~ 49151)、动态或私有端口(49152 ~ 65535)。
虽然理论上大部分公认端口和注册端口都可以在外网暴露,但实际上,由于移动网管代理的端口限制,以及一些网管软件为了控制安全风险,只允许访问某些端口,因此大部分端口都存在连通性的风险。
目前,业界确认比较安全的端口基本上只有 80、8080、443、14000 这几个。因此如果开发一个外网服务,我们应当尽量选用这几个端口来对外进行暴露,确保可连通性。
此外,还可以通过同时暴露这几个端口中的某几个,来进一步提升可连通性。当其中一个端口出现连通性问题时,另外的端口还可以作为 Failover 端口,当