Netty 100万级到亿级流量 高并发 仿微信 IM后台 开源项目实战
疯狂创客圈 Java 分布式聊天室【 亿级流量】实战系列之 -10【 博客园 总入口 】
写在前面
大家好,我是作者尼恩。目前和几个小伙伴一起,组织了一个高并发的实战社群【疯狂创客圈】。正在开始高并发、亿级流程的 IM 聊天程序 学习和实战 ,今天是第10篇。
亿级流量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**
Netty 100万级到亿级流量 高并发 仿微信 IM后台 开源项目实战的更多相关文章
- Netty Redis 亿级流量 高并发 实战 (长文 修正版)
目录 疯狂创客圈 Java 分布式聊天室[ 亿级流量]实战系列之 -30[ 博客园 总入口 ] 写在前面 1.1. 快速的能力提升,巨大的应用价值 1.1.1. 飞速提升能力,并且满足实际开发要求 1 ...
- 万级TPS亿级流水-中台账户系统架构设计
万级TPS亿级流水-中台账户系统架构设计 标签:高并发 万级TPS 亿级流水 账户系统 背景 业务模型 应用层设计 数据层设计 日切对账 背景 我们需要给所有前台业务提供统一的账户系统,用来支撑所有前 ...
- 浅谈千万级PV/IP规模高性能高并发网站架构(转自老男孩)
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://oldboy.blog.51cto.com/2561410/736710 如果把来 ...
- (转)浅谈千万级PV/IP规模高性能高并发网站架构
浅谈千万级PV/IP规模高性能高并发网站架构 原文:http://blog.51cto.com/oldboy/736710 文章架构简图: 高并发访问的核心原则其实就一句话“把所有的用户访问请求都 ...
- php面试题二--解决网站大流量高并发方案(从url到硬盘来解决高并发方案总结)
php面试题二--解决网站大流量高并发方案(从url到硬盘来解决高并发方案总结) 一.总结 从外到内解决网站大流量高并发问题---从提交一个url开始(从用户按下搜索栏回车键开始) url最开始会到d ...
- Netty 100万级高并发服务器配置
前言 每一种该语言在某些极限情况下的表现一般都不太一样,那么我常用的Java语言,在达到100万个并发连接情况下,会怎么样呢,有些好奇,更有些期盼. 这次使用经常使用的顺手的netty NIO框架(n ...
- 浅谈千万级PV/IP规模高性能高并发网站架构
高并发访问的核心原则其实就一句话“把所有的用户访问请求都尽量往前推”. 如果把来访用户比作来犯的"敌人",我们一定要把他们挡在800里地以外,即不能让他们的请求一下打到我们的指挥部 ...
- Netty+MUI从零打造一个仿微信的高性能聊天项目,兼容iPhone/iPad/安卓
要说到微信,我相信是个人都应该知道,几乎人人都会安装这款社交APP吧,它已经成为了我们生活中不可缺少的一份子. 我记得我上大学那会刚接触Java,做的第一个小项目就是基于J2SE的聊天室,使用Java ...
- PHP解决网站高流量高并发问题
首先,确认服务器硬件是否足够支持当前的流量. 普通的P4服务器一般最多能支持每天10万独立IP,如果访问量比这个还要大, 那么必须首先配置一台更高性能的专用服务器才能解决问题 ,否则怎么优化都不可能彻 ...
随机推荐
- 为什么实现Serializbale接口就能够进行序列化?
从所周知,Serializbale接口是个空的接口,并没有定义任何方法.那么问题来了,为什么需要序列化的接口只要实现Serializbale接口就能够进行序列化? 这要从序列化过程的源码说起.举个例子 ...
- zabbix自定义监控项二
为zabbix增加支持传参的自定义监控项 例如使用zabbix来监控tcp的12种状态 tcp的12种状态可以通过man netstat来找到,即 LISTEN:等待从任何远端TCP 和端口的连接请求 ...
- pip 安装自己开发模块 边调试边修改
pip install -e /path/to/mypackage
- Dynamics CRM 2015/2016 Web API:Unbound Action 和 Bound Action
上篇文章介绍了Bound/Unbound Function.今天我们来看看Action吧.像我之前说的:Function和Action之前的差别能够简单理解为.Function不改动数据,可是Acti ...
- linux服务器性能检测工具nmon使用
今天介绍一款linux系统服务器性能检测的工具-nmon及nmon_analyser (生成性能报告的免费工具),亲测可用. 一.介绍 nmon 工具可以帮助在一个屏幕上显示所有重要的性能优化信息,并 ...
- 拒绝IP登陆
tail -n 30 /var/log/messages 发现很多IP尝试登陆,直接封禁. 解决方案:1. vi /etc/hosts.allow 添加 sshd:143.63.182.238 [注意 ...
- TCP/IP详解 卷一(第十一章 UDP:用户数据报协议)
UDP是一个简单的面向数据报的运输层协议. UDP不提供可靠性:它把应用程序传给IP层的数据发送出去,但是并不保证它们能到达目的地. UDP首部的个字段如下图所示
- 基于Android平台的简易人脸检测库
代码地址如下:http://www.demodashi.com/demo/12135.html ViseFace 简易人脸检测库,不依赖三方库,可快速接入人脸检测功能. 项目依赖:compile 'c ...
- JavaScript匿名函数与托付
<1> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <!-- C#匿名函数--& ...
- Linux作业(三)-shell统计某文章中出现频率最高的N个单词并排序输出出现次数
Linux课上的作业周三交,若有考虑不周到的地方,还请多多不吝赐教. shell处理文本相关的经常使用命令见此博客 # #假设输入两个參数 则第一个为统计单词的个数.第二个为要统计的文章 #假设输入一 ...