仿微信 IM后台 亿级流量实战

亿级流量IM的应用场景

随着移动互联网、AI的飞速发展,高性能高并发IM(即时通讯),有着非常广泛的应用场景。

一切高实时性通讯、消息推送的场景,都需要高并发 IM 。

私信、聊天、大规模推送、视频会议、弹幕、抽奖、互动游戏、基于位置的应用(Uber、滴滴司机位置)、在线教育、智能家居等。

有这么多的应用场景,对于想成长为JAVA高手的小伙伴们,高并发IM 都绕不开一个话题。尤其是对于APP开发的小伙伴们来说,即时通讯,已经成为大多数APP标配。移动互联网时代,推送(Push)服务成为App应用不可或缺的重要组成部分,推送服务可以提升用户的活跃度和留存率。我们的手机每天接收到各种各样的广告和提示消息等大多数都是通过推送服务实现的。

随着5G时代物联网的发展,未来所有接入物联网的智能设备,都将是IM系统的客户端,这就意味着推送服务未来会面临海量的设备和终端接入。为了支持这些千万级、亿级终端,一定是需要强悍的后台系统。对于想在后台有所成就的小伙伴们来说,高并发IM实战,更是在终极BOSS PK之前的一场不可或缺的打怪练手。

十万级 单体IM 系统

路一步一步走,饭一口一口吃。飞起来之前的第一步,先来完成一个并发量在十万级别的 IM单体系统架构

首先是IO模型

传统的BIO模型是肯定不行的,那么就只能使用 NIO 了。和阻塞模式的OIO(old IO)相比,JAVA NIO 的原理,也是比较复杂的。疯狂创客圈的这三篇   JAVA NIO 简介    | Java NIO Buffer   |  Java NIO Channel 文件,对JAVA NIO 做了比较详细的介绍。

JAVA NIO本身比较复杂,如果要通过JAVA NIO 写一个大型的程序,更加的复杂了。于是,一个非常牛逼的框架就摆在眼前,它就是Netty。 做JAVA NIO 的编程,Netty 一定不能少。Netty 的牛逼之处,就是通过 Reactor 模式pipeline 模式future promise模式 这些神一级的 JAVA设计模式,对 JAVA NIO 进行了封装。在使用Netty之前,一定要先了解这几大模式,一定能事半功倍。

其次是通讯协议

大部分小伙伴应该都听说过 openfire 吧。 这个传统的企业级开源IM,使用在高并发环境,肯定是非常不合适的。不说别的,就说 openfire 所使用的XMPP协议。XMPP协议是一种古老的XML为基础的通讯协议(古老不太适合),其弊端就是附加传输数据量大。并且因其复杂的通讯过程,性能会大大的降低。

另外,openfire 的基础组件是使用了mina。正因为mina的创始人也是Netty的作者,正是由于看到了mina的劣势,该大牛才会自立门户,写出了一个全新的Netty。

相比与机遇笨重的XML的XMPP,现在互联网编程都是用的轻量级的JSON。所以,建议小伙伴们选择协议的时候,考虑一下JSON的优势。

单体Netty服务, 仅仅支持十万级的并发吗?

呵呵,肯定不止这个数。

在CPU 、内存还不错的情况下,如果配置得当,单体的Netty服务器,远远不止支持10万并发,甚至能撑到100万级别

至于如何配置呢? 请看 此文 —— Netty 100万级高并发服务器配置

高并发分布式IM系统架构

终于到了重要的小节了。

先上一图,看下分布式IM系统的架构。对比下和单体架构的不同。

分布式IM的五大组件

  • Netty Server 连接器
    主要用来负责维持和客户端的TCP连接

  • 连接器集群
    负责  Netty Server 连接器集群的注册、路由、负载均衡。集群IP注册和节点ID分配。

  • 缓存集群

    负责用户、用户绑定关系、用户群组关系的缓存。  缓存临时数据、加快读速度。

  • DB持久层集群

    存在用户、群组、离线消息

  • 消息队列集群

    用户状态广播,群组消息广播

                  

业务系统配套功能                  

上面仅仅是 IM 系统的基本功能,还需要业务系统的其他功能进行配套。比方说: 单点登录访问系统,完成用户身份校验、加密令牌的发放、令牌签名合法性校验等接口和功能检索接口。再比方说:用户在线管理系统,完成管理用户在线状态,负责统一保存所有用户的在线离线状态、保存用户所连接的连接器。

这些个配置系统,也应该是分布式的。只是使用restful 短连接实现。

高并发分布式IM系统实战——技术选型

  • 核心:

    Netty4.x + spring4.x

  • 业务配套系统:spring cloud

    基于restful 短连接的分布式微服务架构, 完成用户在线管理、单点登录系统。

  • 消息队列:

    rocketMQ 高速队列。整流作用。

  • 底层数据库:mysql+mongodb

    mysql做业务还是很方便的,用来存储结构化数据,如用户数据。

​ mongodb 很重要,用来存储非结构化离线消息。

  • 协议JSON +自定义数据包

    fastjson 淘宝的东西。很不错。目前最高效的吧。

实战计划

疯狂创客圈,将组织一群小伙伴,逐步实现整个源码,并选择一些重点的模块设计以博文的形式公开。

如果对源码有兴趣或者分布式设计感兴趣,想参与到开发过程当中,请加入疯狂创客圈QQ群。


无编程不创客,无案例不学习。疯狂创客圈,一大波高手正在交流、学习中!

疯狂创客圈 Netty 死磕系列 10多篇深度文章: 博客园 总入口 QQ群:104131248**

猜你喜欢

转载自www.cnblogs.com/crazymakercircle/p/9912267.html