发展规划--IM系统

news/2024/4/27 16:55:49/文章来源:https://blog.csdn.net/m0_64537997/article/details/136992643

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.luyixian.cn/news_show_1026645.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Git篇】复习git

文章目录 🍔什么是git⭐git和svn的区别 🍔搭建本地仓库🍔克隆远程仓库🛸git常用命令 🍔什么是git Git是一种分布式版本控制系统,它可以追踪文件的变化、协调多人在同一个项目上的工作、恢复文件的旧版本等…

椋鸟数据结构笔记#2:复杂度

萌新的学习笔记,写错了恳请斧正。 目录 复杂度 时间复杂度 空间复杂度 通过复杂度衡量算法好坏 复杂度 复杂度是衡量算法好坏的一种方式。一般分为时间复杂度和空间复杂度,分别用于衡量一个算法在运行时间长短和占据内存空间多少两方面的优劣。 一…

elasticsearch 6.8.x 索引别名、动态索引扩展、滚动索引

文章目录 引言索引别名(alias)创建索引别名查询索引别名删除索引别名重命名索引别名 动态索引(index template,动态匹配生成索引)新建索引模板新建索引并插入数据索引sys-log-202402索引sys-log-202403索引sys-log-202…

C语言例4-3:复合语句,输出a,b的值

代码如下&#xff1a; //复合语句&#xff0c;输出a,b的值 #include<stdio.h> int main(void) {int a 10;printf("a %d\n",a);{int b20; //复合语句printf("b %d\n",b); //复合语句中的数据定义语句放在其他语句的前面}return …

uniapp实现单选组件覆盖选中样式

uniapp实现单选组件覆盖选中样式 完整代码&#xff1a; <!-- 是否选择组件: trueOfFalseChooseBtn --> <template><view class"is-true-body"><view class"btn-con" :class"isTrue ? btn-con-active : " click"clic…

42 ajax 下载文件未配置 responseType blob 导致的文件异常

前言 这是一个最近的关于文件下载碰到的一个问题 主要的情况是, 基于 xhr 发送请求, 获取下载的文件 然后 之后 xhr 这边拿到 字节序列之后, 封装 blob 来进行下载 然后 最开始我们这边没有配置 responseType 为 blob, arraybuffer, 然后 导致下载出来的 文件大小超过了…

前端Web移动端学习day05

移动 Web 第五天 响应式布局方案 媒体查询Bootstrap框架 响应式网页指的是一套代码适配多端&#xff0c;一套代码适配各种大小的屏幕。 共有两种方案可以实现响应式网页&#xff0c;一种是媒体查询&#xff0c;另一种是使用bootstrap框架。 01-媒体查询 基本写法 max-wid…

如何优化财务管理?中小型外贸企业实用指南

在当今全球化的商业环境中&#xff0c;越来越多的中小企业涉足外贸领域&#xff0c;以寻求更广阔的市场和发展空间。在这一过程中&#xff0c;财务管理的重要性尤为凸显&#xff0c;需关注外汇风险、税务合规性、现金流等多个方面的问题。 一、中小企业外贸财务管理难题 币种核…

Python入门练习 - 学生管理系统

Python 实现读书管理系统 """ 实现一个命令行版的读书管理系统 """ import os.path import sys# 使用这个全局变量&#xff0c;来管理所有的学生信息 # 这个列表的每个元素都是一个‘字典’&#xff0c;每 个 字典就分别表示了一个同学students …

argocd cli工具使用

一、前言 ragocd除了使用web界面操作之外&#xff0c;也可以通过argocd cli工具进行操作&#xff0c;关于集群创建、gitlab仓库创建、app创建都是可以通过yaml 文件去操作&#xff0c;使用web界面创建的操作也需要使用argocd cli工具进行备份 二、使用 在argocd部署的章节已经…

阿里云4核16G服务器优惠价格26元1个月、149元半年

阿里云4核16G服务器优惠价格26.52元1个月、79.56元3个月、149.00元半年。2024年腾讯云服务器优惠价格表&#xff0c;一张表整理阿里云服务器最新报价&#xff0c;阿里云服务器网整理云服务器ECS和轻量应用服务器详细CPU内存、公网带宽和系统盘详细配置报价单&#xff0c;大家也…

MySQL数据库高级语句

文章目录 MySQL高级语句older by 排序区间判断查询或与且&#xff08;or 与and&#xff09;嵌套查询&#xff08;多条件&#xff09;查询不重复记录distinctcount 计数限制结果条目limit别名as常用通配符嵌套查询&#xff08;子查询&#xff09;同表不同表嵌套查询还能用于删除…

Python基础教程:基本数据类型

基本数据类型 不可变数据(3 个):Number(数字)、String(字符串)、Tuple(元组) 可变数据(3 个):List(列表)、Dictionary(字典)、Set(集合) Numbers(数字) 数字数据类型用于存储数值。 他们是不可改变的数据类型,这意味着改变数字数据类型会分配一个新的对…

【正点原子FreeRTOS学习笔记】————(12)信号量

这里写目录标题 一、信号量的简介&#xff08;了解&#xff09;二、二值信号量&#xff08;熟悉&#xff09;三、二值信号量实验&#xff08;掌握&#xff09;四、计数型信号量&#xff08;熟悉&#xff09;五、计数型信号量实验&#xff08;掌握&#xff09;六、优先级翻转简介…

腾讯云GPU云服务器_GPU云计算_异构计算_弹性计算

腾讯云GPU服务器是提供GPU算力的弹性计算服务&#xff0c;腾讯云GPU服务器具有超强的并行计算能力&#xff0c;可用于深度学习训练、科学计算、图形图像处理、视频编解码等场景&#xff0c;腾讯云百科txybk.com整理腾讯云GPU服务器租用价格表、GPU实例优势、GPU解决方案、GPU软…

LinkedIn 互联网架构扩展简史

LinkedIn成立于 2003 年&#xff0c;其目标是连接到您的网络以获得更好的工作机会。第一周只有 2,700 名会员。时间快进了很多年&#xff0c;LinkedIn 的产品组合、会员基础和服务器负载都取得了巨大的增长。 如今&#xff0c;LinkedIn 在全球运营&#xff0c;拥有超过 3.5 亿会…

R使用netmeta程序包实现生存数据的频率学网状meta分析

之前的推文系统的介绍了使用netmeta包实现对二分类变量、连续型变量和罕见事件的网状meta分析。今天的文章介绍如何使用netmeta程序包实现生存数据的频率学网状meta分析&#xff0c;用来评估6种免疫疗法&#xff08; Camrelizumab、Tislelzumab、Toripalimab、Sintilimab、Pemb…

(二)windows配置JDK环境

1、安装包下载地址&#xff0c;官网&#xff1a;Java Archive | Oracle 长期稳定支持版本8、11、17、21 选择一个需要下载的连接点进去&#xff1a; 在下载列表中根据操作系统选择不同的下载包&#xff1a; 注意&#xff1a;部分版本下载需要先登录后才可以下载。 安装包附件…

Canal解决Redis缓存与Mysql数据库的一致性问题

1、什么是Canal&#xff1f; 如何解决Redis缓存与Mysql数据库的一致性问题&#xff1f;我们常用数据双删缓存超时设置去解决。这样最差的情况&#xff0c;就是在超时时间内&#xff0c;数据存在不一致。 canal&#xff0c;译为管道&#xff0c;主要用途是基于 MySQL 数据库增…

(1) 易经与命运_学习笔记

个人笔记&#xff0c;斟酌阅读 占卦的原理 三个铜板&#xff0c;正面是3&#xff0c;反面2&#xff0c;三个一起转&#xff0c;得出6,7,8,9 数字象6老阴7少阳8少阴9老阳 生数和成数 生数和成数应该说出自《河图》。其中一二三四五为生数&#xff0c;六七八九十为成数。 生…