疯狂创客圈 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后台 开源项目实战的更多相关文章

  1. Netty Redis 亿级流量 高并发 实战 (长文 修正版)

    目录 疯狂创客圈 Java 分布式聊天室[ 亿级流量]实战系列之 -30[ 博客园 总入口 ] 写在前面 1.1. 快速的能力提升,巨大的应用价值 1.1.1. 飞速提升能力,并且满足实际开发要求 1 ...

  2. 万级TPS亿级流水-中台账户系统架构设计

    万级TPS亿级流水-中台账户系统架构设计 标签:高并发 万级TPS 亿级流水 账户系统 背景 业务模型 应用层设计 数据层设计 日切对账 背景 我们需要给所有前台业务提供统一的账户系统,用来支撑所有前 ...

  3. 浅谈千万级PV/IP规模高性能高并发网站架构(转自老男孩)

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://oldboy.blog.51cto.com/2561410/736710 如果把来 ...

  4. (转)浅谈千万级PV/IP规模高性能高并发网站架构

    浅谈千万级PV/IP规模高性能高并发网站架构 原文:http://blog.51cto.com/oldboy/736710 文章架构简图:   高并发访问的核心原则其实就一句话“把所有的用户访问请求都 ...

  5. php面试题二--解决网站大流量高并发方案(从url到硬盘来解决高并发方案总结)

    php面试题二--解决网站大流量高并发方案(从url到硬盘来解决高并发方案总结) 一.总结 从外到内解决网站大流量高并发问题---从提交一个url开始(从用户按下搜索栏回车键开始) url最开始会到d ...

  6. Netty 100万级高并发服务器配置

    前言 每一种该语言在某些极限情况下的表现一般都不太一样,那么我常用的Java语言,在达到100万个并发连接情况下,会怎么样呢,有些好奇,更有些期盼. 这次使用经常使用的顺手的netty NIO框架(n ...

  7. 浅谈千万级PV/IP规模高性能高并发网站架构

    高并发访问的核心原则其实就一句话“把所有的用户访问请求都尽量往前推”. 如果把来访用户比作来犯的"敌人",我们一定要把他们挡在800里地以外,即不能让他们的请求一下打到我们的指挥部 ...

  8. Netty+MUI从零打造一个仿微信的高性能聊天项目,兼容iPhone/iPad/安卓

    要说到微信,我相信是个人都应该知道,几乎人人都会安装这款社交APP吧,它已经成为了我们生活中不可缺少的一份子. 我记得我上大学那会刚接触Java,做的第一个小项目就是基于J2SE的聊天室,使用Java ...

  9. PHP解决网站高流量高并发问题

    首先,确认服务器硬件是否足够支持当前的流量. 普通的P4服务器一般最多能支持每天10万独立IP,如果访问量比这个还要大, 那么必须首先配置一台更高性能的专用服务器才能解决问题 ,否则怎么优化都不可能彻 ...

随机推荐

  1. STL 源码分析 (SGI版本, 侯捷著)

    前言 源码之前,了无秘密 algorithm的重要性 效率的重要性 采用Cygnus C++ 2.91 for windows cygwin-b20.1-full2.exe 下载地址:http://d ...

  2. [Functional Programming] Define Discrete State Transitions using the State ADT

    We build our first state transactions as two discrete transactions, each working on a specific porti ...

  3. native method与so中function的关联

    在Android中,可以通过JNI的方式来调用和访问用C/C++实现的代码,这些代码以SharedLibrary的方式存在于so中.从Java Code到Native Code的一般使用过程为: 在J ...

  4. 关于angularjs dom渲染结束再执行的问题

    情景 当我点击了button, div才能显示.并且我想知道这个div的高度. 问题 当我点击这个button以后这个.chrome就然告诉我这个div高度是0.这不是睁着眼睛说瞎话吗?怎么能如此欺骗 ...

  5. MSSQL站库分离情况的渗透思路

    本文转自:http://bbs.blackbap.org/thread-6203-1-2.html 1. 服务器属内网环境,站库分离,通过web.config找到数据库服务库SA帐号密码,成功添加用户 ...

  6. Android学习(十二) ContentProvider

    一.ContentProvider简介       当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据.虽然使用其他方法也可以对外共享数据, ...

  7. iOS项目开发实战——使用同步请求获取网页源码

    网络请求一般分为同步请求和异步请求,同步请求假设訪问时间过长,会造成界面卡死状态,用户体验不是非常好.可是请求速度较快的话,也能够考虑使用同步訪问.如今先来学习同步訪问. (1)在viewDidLoa ...

  8. Java学习从入门到精通(1) [转载]

    Java Learning Path (一).工具篇 一. JDK (Java Development Kit) JDK是整个Java的核心,包括了Java运行环境(Java Runtime Envi ...

  9. karma + phantom + mocha + sion + chai + nightwatch + selenium2(webdriver) 测试框架学习

    第三方的教程传送门 https://segmentfault.com/a/1190000004558796 karma # github https://github.com/karma-runner ...

  10. webuploader插件使用中的一点东西

    本人绝对菜鸟,高手勿喷 菜鸟开发中的解决方法,高手勿喷 1.针对同一应用中不同的类别,存放不同的路径 在页面中添加,hidden属性的标记,如:    type="hidden" ...