Netty 100万级到亿级流量 高并发 仿微信 IM后台 开源项目实战
文章很长,而且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 :
免费赠送 :《尼恩Java面试宝典》 持续更新+ 史上最全 + 面试必备 2000页+ 面试必备 + 大厂必备 +涨薪必备
免费赠送 经典图书:《Java高并发核心编程(卷1)加强版》 面试必备 + 大厂必备 +涨薪必备 加尼恩免费领
免费赠送 经典图书:《Java高并发核心编程(卷2)加强版》 面试必备 + 大厂必备 +涨薪必备 加尼恩免费领
免费赠送 经典图书:《Java高并发核心编程(卷3)加强版》 面试必备 + 大厂必备 +涨薪必备 加尼恩免费领
免费赠送 经典图书:《尼恩Java面试宝典 最新版》 面试必备 + 大厂必备 +涨薪必备 加尼恩免费领
免费赠送 资源宝库: Java 必备 百度网盘资源大合集 价值>10000元 加尼恩领取
写在前面
本文的内容只是一个初稿、初稿,本文的知识,在《Netty Zookeeper Redis 高并发实战》一书时,进行大篇幅的完善和更新,并且进行的源码的升级。 博客和书不一样,书的内容更加系统化、全面化,更加层层升入、层次分明、更多次的错误排查,请大家以书的内容为准。本文的最终内容, 具体请参考疯狂创客圈 倾力编著,目前已升级为《Java高并发核心编程 卷1加强版:NIO、Netty、Redis、ZooKeeper》一书 。
更重要的是,本文的架构设计和源码,在写书时,已经迭代更新了几轮,架构和尤其是源码的 实现,以随书源码为准。
亿级流量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 淘宝的东西。很不错。目前最高效的吧。
本文配套视频
很多小伙伴反应,实操起来有点难点(实属正常),故提供了配套视频