前言

 

 除了像QQ和微信这样的聊天工具,不同行业还有很多即时通讯工具,比如淘宝阿里旺旺、网易泡泡、YY之声。碰巧公司的产品也需要基于我们自己的行业开发一个类似即时消息的系统。幸运的是,我充当了这个产品的架构师、核心代码作者和实现者。在这里,我将分享我近年来对即时消息系统(即时消息的传输,不包括语音、视频和文件的传输)的理解和设计。我希望你不要笑,并欢迎给予批评。

 

 此外,以下关于即时消息实际开发的文章也值得一读。如果你感兴趣,你可以看看:

 

 适合初学者:从头开始开发即时消息服务器(基于Netty,带有完整的源代码)

 "拿起键盘是干的:和我一起开发一个分布式即时通讯系统. "

 自己开发即时通讯有这么难吗?手工教你一个Andriod版本的简单即时消息(带源代码)

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

 教你用Netty实现网络通讯程序的心跳机制和断线重连机制

 “WebSocket实时聊天室演示:基于node . js+Socket . io[附件下载]”

 

 选择难点1:网络传输协议的选择

 

 目前,我所知道的所有即时消息传输系统都使用基于协议的UDP、TCP和http中的一种或多种。例如,QQ主要使用UDP协议,MSN主要使用TCP协议,它们都支持HTTP协议的代理模式。有关更多信息,请参与本文“通信软件的网络协议和端口集合,如即时通讯”。

 

 我们应该如何选择?

 

 UDP协议具有较好的实时性,但如何处理不同客户端之间安全可靠的传输和消息交互是一个难以实现的难题。

 HTTP协议属于扩展支持,所以我们不需要在产品的初始阶段支持它;

 那么它一定是TCP,而且还有很多事情要考虑,尤其是如果有大量用户的话。如何保证单个服务器的高并发性,以及如何实现灵活的扩展架构。

 

 (即时通讯网注:你也可以参考相关文章“为什么QQ使用UDP而不是TCP?”,“移动即时通讯协议选择:UDP还是TCP?,更多类似的文章:http://www.52im。net/forum.php?mod =收集和操作=查看&ctid=18英寸。

 选择困难2:数据通信格式(协议)的选择

 

 二进制格式?文本格式?本主题转到本文“如何选择即时通讯应用程序的数据传输格式”。从我们目前的需求和产品周期来看,我认为最好选择JSON数据协议。

 

 (即时通讯网注:即时消息数据传输格式的选择是一个令人头痛的问题。例如,这篇文章不同于这篇文章。"强列建议Protobuf作为您的即时通讯应用程序数据传输格式。更多类似的文章:http://www.52im。net/forum.php?mod =收集和操作=查看和ctid=18英寸)

 建筑设计

 

 首先,让我们细化即时消息系统的主要需求,包括账号、关系链、在线状态显示和消息交互。

 

 1架构考虑

 

 由于采用了可靠的传输协议TCP,考虑了负载问题(短连接实现账号和关系链相关业务,长连接实现在线和信息推送);

 后台架构的灵活性和可扩展性支持分布式部署——分离网络层、业务逻辑层和数据层,网络层和业务层支持负载平衡策略,数据层支持分布式存储;

 客户端SDK的易用性:独立的网络层、数据层和业务逻辑层。

 

 背景架构简图:

 即时通讯系统的架构设计

 

 建筑示意图:

 即时通讯系统的架构设计

 

 架构细化图:

 即时通讯系统的架构设计

 

 描述:

 从架构细化图可以看出,对于在线服务,建立了TCP长连接,对于单个服务器,由于硬件资源、系统资源和网络资源的限制,大量用户不能同时在线。因此,它被设计为根据服务器负载支持多服务器在线。同时,由于多服务器在线导致了整个系统交互的分离(不同客户端之间的交互,应用服务与协作部门的客户之间的交互),引入了消息转发服务器作为绑定点。另外,对于多服务器在线造成的统一账户信息(在线状态、消息)数据的分割,统一数据层(内存存储层:会话、状态信息存储、消息队列存储;数据库:帐户信息存储)将业务与数据分开,并支持分布式部署。请参阅我的文章“构建高性能服务的注意事项”。

 

 对于一些业务服务:将网络层、业务层和数据层完全分开。首先,对于TCP短连接,它不会像长连接那样消耗资源。即使后期有大量的并发访问请求,也可以通过负载均衡策略和数据分布式部署策略平静地解决。请参阅我的文章“服务器架构中的网关服务器”。

 

 2服务器平台和技术选择

 

 系统开发平台:

 Centos是一种稳定、可靠、可定制和优化的Linux发行版,具有丰富的支持。

 网络支持层:

 libevent-降低开发成本并增强稳定性。

 缓存存储层:

 redis-支持丰富的存储结构和分布式存储。

 数据库:

 MySQL是最适合互联网的数据库,它是免费的、高效的、稳定的、可控的。

 开发语言:

 C/C++ .

 

 3.审议热点问题

 

 主要是关于系统性能的考虑:

 

 编码角度:

 采用高效的网络模型、线程模型、输入输出处理模型、合理的数据库设计和操作语句优化;

 垂直缩放:

 通过改善单个服务器的硬件资源或网络资源来提高性能;

 水平缩放:

 通过合理的架构设计和运行维护中的负载均衡策略来分担负载,有效提高性能;稍后,您甚至可以考虑加入数据缓存层来突破IO瓶颈;

 系统的高可用性:

 防止单点故障;

 在架构设计中,业务处理和数据是分开的,因此依赖分布式部署来确保单点故障情况下的系统可用性。

 对于关键的独立节点,可以使用双机热备技术进行切换。

 磁盘阵列和主备数据库的冗余配置可以解决数据库数据的安全性问题。


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

哇谷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钉钉技术分析交流

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

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