Netty 100万级到亿级流量 高并发 仿微信 IM后台 开源项目实战

疯狂创客圈,一个Java 高并发研习社群博客园 总入口html

疯狂创客圈,倾力推出:面试必备 + 面试必备 + 面试必备 的基础原理+实战 书籍 《Netty Zookeeper Redis 高并发实战mysql


写在前面

顺便说明下:
本文的内容只是一个初稿、初稿,本文的知识,在《Netty Zookeeper Redis 高并发实战》一书时,进行大篇幅的完善和更新,而且进行的源码的升级。 博客和书不同,书的内容更加系统化、全面化,更加层层升入、井井有条、更屡次的错误排查,请你们以书的内容为准。
本文的最终内容, 具体请参考疯狂创客圈 倾力编著,机械工业出版社出版的 《Netty Zookeeper Redis 高并发实战》一书 。
书籍面试

​更重要的是,本文的架构设计和源码,在写《Netty Zookeeper Redis 高并发实战》一书时,已经迭代更新了几轮,架构和尤为是源码的 实现,以随书源码为准spring

亿级流量IM的应用场景

随着移动互联网、AI的飞速发展,高性能高并发IM(即时通信),有着很是普遍的应用场景。sql

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

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

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

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

十万级 单体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**