1.前言

 

 由于移动即时通信系统是多种技术手段的综合应用,包括移动网络编程、通信安全、高性能互联网架构等,因此很难开发出一个能够在生产环境中使用的移动即时通信系统。,尤其是在即时通讯技术相对封闭、实际数据不容易找到的现状下。

 

 本文以基于TCP数据传输协议的移动即时通信为例,介绍了如何逐步构建基于分布式集群的移动即时通信接入层的设计与实现。

 2.即时通讯开发干货系列文章

 

 本文是系列文章中的第八篇,主要内容如下:

 

 即时消息传递保证机制的实现(一):保证在线实时消息的可靠传递

 即时消息传递保证机制的实现(二):保证离线消息的可靠传递

 如何确保即时消息的“时间”和“一致性”?》

 我应该使用“推”还是“拉”来同步即时消息单聊和群聊的在线状态?》

 即时消息群聊新闻如此复杂,如何确保它不丢失或沉重?》

 安卓即时通讯智能心跳算法的设计与实现探讨(含示例代码)

 “当即时消息登录移动终端时,如何通过提取数据来节省流量?》

 易于理解:基于集群共享移动终端即时消息接入层的负载均衡方案(本文)

 浅谈移动即时通信的多点登录和消息漫游原理

 构成即时通讯开发的基础知识(一):正确理解前端HTTP单点登录接口的原理

 构成即时消息开发的基础知识(2):如何为大量图像文件设计服务器端存储架构?》

 补充即时通讯开发的基础知识(3):快速了解服务器端数据库读写分离的原理和实用建议

 构成即时消息开发的基础知识(4):正确理解短连接中的Cookie、会话和令牌

 如何实现即时通讯群聊信息的阅读回执功能?》

 即时消息群聊消息是一份拷贝(即扩散阅读)还是多份拷贝(即扩散写作)?》

 构成即时消息开发的基础知识(5):易于理解、正确理解并充分利用MQ消息队列

 一种低成本保证即时消息定时的方法探讨

 补上一课关于即时消息开发的基础知识(6):您的数据库使用NoSQL还是SQL?读读这个!》

 在即时通讯中实现“身边人”功能的原则是什么?如何有效地实现它?》

 构成即时通讯开发的基础知识(七):主流移动账户登录方法的原理和设计思路

 弥补即时通讯发展的基础知识(8):历史上最流行的,彻底了解字符乱码问题的本质

 如何实现即时通讯的扫描码板功能?有一篇文章了解主流应用的扫描代码登陆技术的原理

 “即时通讯做手机扫描码登录?让我们先来看看微信扫描码登录功能的技术原理

 构成即时通讯发展的基础知识(9):想发展即时通讯集群吗?首先了解什么是RPC!》

 

 此外,如果你是即时通讯开发的初学者,强烈建议你先阅读“初学者:从零开始开发移动即时通讯”。

 3.网络短连接特点及基于长连接的负载均衡系统

 

 易于理解:基于集群的移动即时通信接入层负载均衡方案

 

 在互联网体系结构中,网络服务器访问通常使用nginx作为反向代理来实现负载平衡。整个架构分为三层:

 

 上游呼叫层:一般是浏览器或APP;

 中间反向代理层:nginx;

 下游真实访问集群:网络服务器。tomcat和apache是常见的web服务器。

 

 整个参观过程如下:

 

 浏览器向daojia.com发送请求;

 域名系统服务器将daojia.com解析为外部网络IP(1 . 2 . 3 . 4);

 浏览器访问引擎;通过外部网络IP(1 . 2 . 3 . 4);

 Nginx实施负载平衡策略。常见的策略包括轮询、随机、IP哈希等。

 Nginx将请求转发到内部网的网络服务器(192.168.0.1)。

 

 由于短的http连接和web应用程序的无状态性质,理论上,任何落在任何web服务器上的http请求都应该正常处理(如果必须落在一个服务器上,这意味着架构不合理,不能水平扩展)。

 

 但与传统的网络系统不同,在基于tcp长连接的即时消息系统中,每条长连接路径都是有状态的。一旦在客户机和服务器之间建立了连接,由客户机发起的请求必须落在同一个tcp-im-server上。那么此时如何平衡负荷,如何保证水平膨胀呢?我们继续往下看。

 4.独立场景中的tcp-im-server

 

 易于理解:基于集群的移动即时通信接入层负载均衡方案

 

 独立的tcp-im服务器显然很容易确保请求的一致性:

 

 客户端向tcp.daojia.com发起tcp请求;

 域名系统服务器将tcp.daojia.com解析为外部网络IP(1 . 2 . 3 . 4);

 客户端通过外部网络IP向tcp-im服务器发起请求(1.2.3.4)。

 

 这个计划有什么缺点?也就是说,无法保证高可用性。

 5.一种典型的基于集群的tcp-im-server方案及其不足

 

 易于理解:基于集群的移动即时通信接入层负载均衡方案

 

 通过构建tcp-im-server集群来确保高可用性,客户端实现了负载平衡:

 

 客户端配置有tcp1/tcp2/tcp3.mydomain.com三个TCP-im-服务器外部网络IP;

 客户端以“随机”的方式选择tcp-im-server,假设它是tcp1.mydomain.com。

 通过域名系统解决tcp1.mydomain.com问题;

 真正的tcp-im服务器是通过外部网络IP连接的。

 

 如何确保高可用性?

 如果客户端发现一个tcp-im-server无法连接,它会选择另一个。

 

 潜在的缺点?

 在每次连接之前,您需要再次实现DNS访问:

 很难防止域名系统劫持;

 一次以上的域名系统访问意味着更长的连接时间,这在手机端更明显。

 

 如何解决域名系统问题?

 直接在客户端配置IP可以解决上述两个问题,这是许多公司所做的(通常称为“IP直通车”)。

 

 知识产权直通车有什么新问题?

 在客户机上写入IP,并在客户机上实现负载平衡,这种方法的可扩展性较差:

 如果原IP发生变化,客户端无法得到实时通知;

 如果增加了IP,即扩展了tcp服务器,客户端将不会得到实时通知;

 如果负载平衡策略发生变化,客户端需要升级。

 

 6.优化1:将负载平衡策略放在服务器端

 

 只有将复杂的策略沉入服务器端,我们才能从根本上解决可伸缩性问题。

 

 易于理解:基于集群的移动即时通信接入层负载均衡方案

 

 添加一个http接口并将客户端的“IP配置”和“平衡策略”放在服务器上是一个很好的解决方案:

 

 客户端在每次访问tcp-im-server之前都会调用一个新的get-tcp-ip接口。对于客户端,这个http接口只返回TCP-im-服务器的IP。

 这个http接口实现了原始客户端的IP平衡策略;

 获取服务器的IP地址,并像以前一样启动与服务器的tcp长连接。

 

 这样,可伸缩性问题就解决了:

 

 如果原始IP发生变化,只需修改get-tcp-ip接口的配置。

 如果添加了IP,则获取-tcp-ip接口的配置也将被修改;

 如果负载平衡策略发生变化,客户端需要升级。

 

 然而,一个新的问题又出现了。如果所有的ip都放在客户机上,当一个IP挂断时,客户机可以改变另一个IP连接以确保可用性,而获取tcp-ip接口只维护静态的TCP-im-服务器群集IP,并且它完全不知道对应于这些IP的TCP-im-服务器是否可用。我该怎么办?

 7.优化2: tcp-im-servert改为主动报告状态

 

 易于理解:基于集群的移动即时通信接入层负载均衡方案

 

 get-tcp-ip接口如何知道tcp-im-server群集中的每台服务器是否可用?tcp-im-server主动报告是一种潜在的方案。如果tcp-im-server挂起,报告将被终止。对于停止报告的tcp-im服务器,获取tcp-ip接口不会返回到客户端对应的tcp-im服务器的外部网络ip

 

 设计有什么问题?

 诚然,状态报告解决了tcp-im-server的高可用性问题,但这种设计产生了一个“反向依赖”的小耦合错误:tcp-im-server依赖于与自身业务无关的web服务器。

 8.优化3:取而代之的是,主动拉tcp-im-server的状态

 

 易于理解:基于集群的移动即时通信接入层负载均衡方案

 

 更好的方案是网络服务器通过“拉”获得每个tcp-im服务器的状态,而不是tcp-im服务器通过“推”报告自己的状态。

 

 这样,每个tcp-im-server都是独立和解耦的,只需要关注高级tcp业务功能。

 

 get-tcp-ip的网络服务器侧重于高可用性、负载平衡和可伸缩性的任务。

 

 顺便说一下,在tcp-im服务器端实现负载平衡还有一个优点,可以实现异构TCP-IM服务器的负载平衡和过载保护:

 

 静态实现:网络服务器下的多台tcp-im服务器的IP可以配置负载权重,负载按照TCP-IM服务器的机器配置进行分配(nginx也有类似的功能);

 动态实现:web服务器可以根据tcp-im-server的状态动态分配负载,并在tcp-im-server性能严重下降时实现过载保护。

 

 9.本文摘要

 

 网络服务器如何实现负载平衡?

 使用nginx反向代理进行轮询、随机、ip哈希。

 

 tcp-im-server如何快速确保请求的一致性?

 独立。

 

 如何确保高可用性?

 一个客户配置多个TCP-im服务器的域名。

 

 如何防止域名劫持并加快速度?

 通过列车,客户端配置多个传输控制协议服务器的IP。

 

 如何确保可扩展性?

 服务器提供get-tcp-ip接口,屏蔽客户端屏幕的负载平衡策略,实现方便的扩展。

 

 如何确保高可用性?

 TCP-im-服务器将状态“推”到get-tcp-ip接口,或者get-tcp-ip接口“拉”TCP-im-服务器状态。



----------------------------------------------------------------------------------

哇谷im_im即时通讯_私有云_公有云-哇谷云科技官网-JM沟通

IM下载体验 - 哇谷IM-企业云办公IM即时聊天社交系统-JM 沟通下载

IM功能与价格 - 哇谷IM-提供即时通讯IM开发-APP搭建私有化-公有云-私有化云-海外云搭建

新闻动态 - 哇谷IM-即时通讯热门动态博客聊天JM沟通APP

哇谷IM-JM沟通热门动态博客短视频娱乐生活

关于哇谷-哇谷IM-提供企业即时通讯IM开发-语音通话-APP搭建私有化-公有云-私有化云-海外云搭建

联系我们 - 哇谷IM-即时通讯IM私有化搭建提供接口与SDK及哇谷云服务

即时通讯IM融云世界

IM即时通讯钉钉技术:企业IM钉钉在后端架构上的优越之处

新的市场叫板环信、融云、腾讯云!开源版IM即使聊天工具

企业IM即时通讯聊天办公APP钉钉技术分析交流

哇谷云-怎么样正确认识海外云服务器

公有云和私有云之间有什么区别?类似融云、环信云、网易云、哇谷云?