发展规划--IM系统

news2024/11/16 16:30:15

1、时代背景

5G应用,多终端应用,物联网应用,小程序,工业互联,大数据应用等等大前端时代的到来,程序员不能只关注crud,因为以后的服务并发量只会越来越多。

高并发架构师、大数据架构师或者说java高级工程师现在才能找到一份好工作。

Netty(T-io),Redis、zookeeper、高性能http组件(Nginx)、java并发编程组件(JUC包)工作两年以后,必须熟练掌握。

2、netty框架

Netty是Jboss提供的一个Java开源网络编程框架,基于NIO的客户端、服务端编程框架,既能快速开发高并发、高可用、高可靠的网络服务器,也能开发客户端程序。

Kafka,RocketMQ,es搜索引擎,大数据处理Hadoop框架,还有RPC框架Dubbo都是用了Netty框架。

Netty火热的原因:提供了异步的、事件驱动的网络应用程序框架和工具。Netty的所有IO操作都是异步非阻塞的。和JDK提供的NIO相比,Netty提供了更加丰富的api。

1,api简单,开发门槛低

2,功能强大,支持很多主流协议和自定义协议

3,性能高,和其他主流的NIO框架比,Netty性能更高

4,成熟,生态好,社区活跃,并且修复了JDK当中Nio中所有已发现的bug

5,面试加分(巨加分),几乎所有的中间件的高性能通信与传输都和Netty有关。

3,高并发im项目

  • 学习价值:高并发的im系统具有相当大的挑战性,对于传统的web开发者(Springboot)来说,相当于进入了一个全新的天地。一个企业级的web的qps可能在1000以内,大厂在上万,而且基本上按照常用的调优思路(多线程,加缓存,解耦,优化sql)就可以搞定(秒杀场景除外),而且大部分都是在干crud,没啥意思。
  • 一个分布式的。高并发的IM系统的面临的QPS峰值可能在十万,百万,千万甚至上亿级别。如何规划项目架构,如何规划服务器资源,如果规划版本迭代,如果设置操作系统参数来能够容纳更多的socket连接,都非常考验程序员的基础知识。

4,IO读写的基本原理

一个原则:操作系统将内存划分为两部分:一个是内核空间,一个是用户空间。在linux操作系统中,内核模块运行在内核空间,相应的进程处在内核态;用户程序运行在用户态,对应的进程处于用户态。

内核态的进程可以访问内核空间,也可以访问硬件设备(磁盘,网卡等)调用系统的一切资源,用户态的进程没有这样的权限,也不能直接调用内核代码定义的函数。并且每个用户态的进程都有一个单独的用户空间,他要想拿到内存或磁盘中的数据,只有将进程切换到内核态然后向内核发出指令,完成调用系统资源之类的操作。

用户态的进程进行系统调用后,也不是直接就从硬件里把这些数据读出来了。从硬件里读数据是由操作系统来干的。

缓冲区的概念:两个缓冲区,内核缓冲区,应用程序缓冲区。缓冲区的目的就是为了减少硬件之间频繁的物理交换。操作系统会对内核缓冲区进行监控,等待缓冲区达到一定大小后,再进行实际的物理设备的交换(实际的io处理)

io操作其实就是两个缓冲区之间的复制。

5,io模型

服务端高并发IO编程往往要求的性能都非常高,一般情况下需要选用高性能的IO模型。

四种io模型:

同步阻塞io:默认情况下,在Java应用程序进程中所有对socket连接进行的IO操作都是同步阻塞IO。

简单的说就是在内核缓冲区获取数据的这个时间,用户态进程得阻塞着,什么也干不了。

在即时通讯项目里,不会采用这种模型,因为一般情况下,是一个socket连接对应一个独立的线程,如果用这种模型,在高并发项目中,需要很多的线程来维护大量的socet连接,内存,线程之间的切换开销会很大,性能很低。

优点:应用程序开发简单,在阻塞等待数据的区间,用户线程挂起,基本不会占用太多的cpu资源。

同步非阻塞io

(1)在内核数据没有准备好的阶段,用户线程发起IO请求时立即返回。所以,为了读取最终的数据,用户进程(或者线程)需要不断地发起IO系统调用

(2)内核数据到达后,用户进程(或者线程)发起系统调用,用户进程(或者线程)阻塞。内核开始复制数据,它会将数据从内核缓冲区复制到用户缓冲区,然后内核返回结果

(3)用户进程(或者线程)读到数据后,才会解除阻塞状态,重新运行起来。也就是说,用户空间需要经过多次尝试才能保证最终真正读到数据,而后继续执行。

同步非阻塞IO的优点是每次发起的IO系统调用在内核等待数据过程中可以立即返回,用户线程不会阻塞,实时性较好。

同步非阻塞IO的缺点是不断地轮询内核,并且还会不断的进行用户态和系统态之间的切换,这将占用大量的CPU时间,效率低下。总体来说,在高并发应用场景中,同步非阻塞IO是性能很低的,也是基本不可用的,一般Web服务器都不使用这种IO模型。在Java的实际开发中,不会涉及这种IO模型,但是此模型还是有价值的,其作用在于其他IO模型中可以使用非阻塞IO模型作为基础,以实现其高性能。

IO多路复用

(1)选择器注册。首先,将需要read操作的目标文件描述符(socket连接)提前注册到Linux的select/epoll选择器中,在Java中所对应的选择器类是Selector类。然后,开启整个IO多路复用模型的轮询流程。

(2)就绪状态的轮询。通过选择器的查询方法,查询所有提前注册过的目标文件描述符(socket连接)的IO就绪状态。通过查询的系统调用,内核会返回一个就绪的socket列表。当任何一个注册过的socket中的数据准备好或者就绪了就说明内核缓冲区有数据了,内核将该socket加入就绪的列表中,并且返回就绪事件。

(3)用户线程获得了就绪状态的列表后,根据其中的socket连接发起read系统调用,用户线程阻塞。内核开始复制数据,将数据从内核缓冲区复制到用户缓冲区。

(4)复制完成后,内核返回结果,用户线程才会解除阻塞的状态,用户线程读取到了数据,继续执行。

IO多路复用模型的优点是一个选择器查询线程可以同时处理成千上万的网络连接,所以用户程序不必创建大量的线程,也不必维护这些线程,从而大大减少了系统的开销。与一个线程维护一个连接的阻塞IO模式相比,这一点是IO多路复用模型的最大优势。

异步io

增加了一个回调操作,但是因为出现的晚,jdk对于他的支持并不完善,所以用的不多。

异步io模型是性能最高的一个模型。

目前高并发网络应用程序都是采用的io多路复用。

6,即时通讯程序可能遇到的问题

1,操作系统的限制

linux操作系统对文件的句柄数有限制,是1024,也就是说一个线程最多处理1024个socket连接,这是远远不够的

2,socket虽然是长链接,但是他能一直保持连接吗?

理论上是,但是实际上不是,所以我们在架构设计的时候就要考虑这种情况。

比如说服务器防火墙会关闭不活跃的连接(最常见),比如说由于网络丢包或者网络波动等等都可能造成socket的不正常关闭。

理论上讲,关闭socket连接会有一个按钮,比如说下线,这个是正常关闭socket连接,但是也百分之99的人不会点下线,而是直接关闭整个app,这个时候socket就是不正常关闭了,不正常关闭会造成什么问题呢?

socket不正常关闭会造成网络连接假死。

网络连接假死:

如果底层的socket已经断开,但是服务端并没有正常关闭,服务端认为这条TCP连接仍然是存在的,则该连接处于“假死”状态。连接假死的会造成什么问题:

服务端长时间运行后会面临大量假死连接得不到正常释放的情况。由于每个连接都会耗费CPU和内存资源,因此大量假死的连接会逐渐耗光服务器的资源,使得服务器越来越慢,IO处理效率越来越低,最终导致服务器崩溃。

怎么解决呢:客户端定时发送心跳检测、服务端定时进行空闲检测。

3,分布式IM系统会有哪些问题

4,IM系统部署建议使用传统的jar包部署

5,用户将客户端进程关闭,还怎么实现消息推送

方法1:流氓做法(几年前的方案)

ios系统(假后台)因为有自己的推送中心,所以socket服务器直接像苹果推送平台推消息就行了,但是安卓没有(国内给禁了),前几年基本上都是采用的流氓的做法:后台偷偷唤醒app进程,或者别的app启动时唤醒其他app的进程。

方法2:采用推送平台:比如说极光推送,对接统一推送联盟

chatService架构

注意:正常的socket服务的序列化协议应该采用Protobuf,Protobuf是最高效的二进制序列化协议,但是学习阶段先用json。json是最紧凑的文本协议。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1543034.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis入门到实战-第六弹

Redis实战热身Lists篇 完整命令参考官网 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一定100%复现, 还要以官方信息为准 https://redis.io/Redis概述 Redis是一个开源的(采用BSD许可证),用作数据库、缓存、消息代理和流…

【基于HTML5的网页设计及应用】——随机验证码

🎃个人专栏: 🐬 算法设计与分析:算法设计与分析_IT闫的博客-CSDN博客 🐳Java基础:Java基础_IT闫的博客-CSDN博客 🐋c语言:c语言_IT闫的博客-CSDN博客 🐟MySQL&#xff1a…

WPF---1.入门学习

学习来源 布局 wpf布局原则 一个窗口中只能包含一个元素 不应显示设置元素尺寸 不应使用坐标设置元素的位置 可以嵌套布局容器 StackPanel-->表单条件查找布局 DataGrid wpf布局容器 StackPanel: 水平或垂直排列元素,Orientation属性分别: Horizontal / Vertic…

查询正在运行的Top SQL的脚本(建议收藏)

这篇文章提供了一些现成的SQL脚本,通过查询V$SQLSTATS视图找到正在运行的TOP SQL,用于后续的优化。建议大家收藏,需要查询TOP SQL时直接复制和粘贴即可。 之前的一篇文章解释了为什么要使用V$SQLSTATS视图。 当数据库表现出各种不同的性能问…

Linux/WifineticTwo

WifineticTwo Enumeration nmap 经过使用 nmap 对常见的 1000 个端口进行扫描,并加入禁止 ping 的参数,长时间的扫描结果显示,仅有 22 和 8080 两个端口处于开放状态 ┌──(kali㉿kali)-[~/vegetable/HTB/WifineticTwo] └─$ nmap 10.10…

渗压计测量:VW-102A与WM-103型读数仪的应用与优势

在当代工程测量领域,准确监测地下水压力变化对于确保建筑结构的安全和稳定至关重要。渗压计作为一种专业的测量工具,能够精确地监测和记录地下水的压力变化,是水利工程、地下建筑、坝体安全监测等领域不可或缺的仪器。今天主要给大家介绍下读…

make menuconfig

本文不是分析Linux的make menuconfig,而是如何将Linux这套机制适配到自己的项目里。 Linux内核配置工具会使用到menuconfig。menuconfig会用到mconf、conf两个命令。这两个命令是编译内核自动生成的。网上有开源的实现,我们下载下来自己编译&#xff1a…

SQLiteC/C++接口详细介绍sqlite3_stmt类(七)

返回:SQLite—系列文章目录 上一篇:SQLiteC/C接口详细介绍sqlite3_stmt类(六) 下一篇: 无 22、sqlite3_column_database_name 用于返回结果集中指定列的数据库名称。如果结果集是由多个Join操作产生的,…

公域流量和私域流量该如何选择?

很多客户在做品牌推广的时候,都会犹豫应该把精力投放到公域流量还是做自己的私域流量。特别是现在流量为王的时代,大部分客户都在布局做公域流量,砸钱推广,直播带货各种形式进行曝光。 在无论是线上还是线下的公共领域&#xff0…

Microsoft Remote Desktop:无缝连接,高效远程工作的首选工具

随着科技的发展,远程工作已经成为了越来越多人的选择。在这样的背景下,一款高效、稳定且安全的远程桌面工具显得尤为重要。Microsoft Remote Desktop正是这样一款能够满足用户需求的远程桌面软件。 Microsoft Remote Desktop是微软开发的一款专为远程连…

38张最全计算机网络基础思维导图,值得一看!

你们好,我的网工朋友。 计算机网络基础知识点多且杂,想要系统地学习,思维导图肯定是必不可少的。 今天我给你找全了38张思维导图,帮助你轻松理清思路,快速掌握关键内容。 建议你收藏起来慢慢看,在看过之…

宋仕强说金航标kinghelm萨科微slkor都是网红品牌

宋仕强说金航标kinghelm萨科微slkor都是网红品牌,和宋仕强先生研究的“华强北”大ip一起,相互支持相互驱动,与金航标网站(www.kinghelm.com.cn)、萨科微网站(www.slkormicro.com)组合成为宣传矩…

2024/3/24--爬虫库

1.常用的爬虫库 (1)在setting的project里面点击Python Interpreter (2)常用的爬虫库有 import requests //用途:用于发送HTTP请求。from bs4 import BeautifulSoup //用于从HTML或XML文档中提取数据。import scrapy //一个功能强大的爬虫框架&#xf…

基于Java的流浪动物收容与领养网站

基于Java的流浪动物收容与领养网站的设计与实现 摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和遍及使得各种信息系统的开发成为一定。 流浪动物收容与领养管理系统,主要的模块包括首页、个人中心、用户管理、员工…

.NET分布式Orleans - 2 - Grain的通信原理与定义

Grain 是 Orleans 框架中的基本单元,代表了应用程序中的一个实体或者一个计算单元。 每个Silo都是一个独立的进程,Silo负责加载、管理和执行Grain实例,并处理来自客户端的请求以及与其他Silo之间的通信。 通信原理 在相同的Silo中&#xff0…

Vue动态设置控制表格列表展现列

最近遇到一个需求,表格列表默认不展示某一列,当我设置后可以展示该列,也可以展示和隐藏别的列,起到可以对整个表格列展示隐藏控制的效果,如下示例,默认不展示“单位名称”这一列,在我点击设置齿轮后可以看到,有“单位名称”这一列,但未打钩: 当我勾中“单位名称”,…

【解决】Unity Profiler | Sempaphore.WaitForSignal

开发平台:Unity 2022 版本以上 开发语言:CSharp 6.0 编程平台:Visual Studio 2022 关键词:Sempaphore.WaitForSignal   问题背景 开发过程中出现 Waiting to excute code… 长时间阻碍运行。使用 逐对象排查法 确认影响无法运行…

mineadmin前端安装启动

在上一篇文章中, 我们已经搭建好了后端环境并启动 mineadmin 快速安装部署(docker环境) 一、下载前端项目 1、在搭建后端时候,使用php bin/hyperf.php mine:install 的时候,有一个步骤是安装前端项目的。安装目录为&a…

Altair Compose® 数学运算、编程、数据分析及可视化

Altair Compose 数学运算、编程、数据分析及可视化 分析数据、开发算法或创建模型 - Altair Compose 旨在将你的想法付诸实施。 Altair Compose 是一个用于数学计算、数据操作和可视化、编程和调试脚本的环境,对重复运算和流程自动化非常有用。Altair Compose 让用…

Chrome 插件打包发布

插件打包发布 一、打包成 zip 包 最简单方便的一种其实就是打包成 zip 包,通过下载链接进行下载,在包里面通过设置版本号和数据库的版本号对比来提醒用户进行新包的下载。 二、发布到 Chrome 应用商店 1. 注册成为开发者 在发布到 chrome 应用商店之…