IM系统完结了,那简历该怎么写?(含简历项目描述)

作者:冰河
星球:http://m6z.cn/6aeFbs
博客:https://binghe.gitcode.host
文章汇总:https://binghe.gitcode.host/md/all/all.html
星球项目地址:https://binghe.gitcode.host/md/zsxq/introduce.html

沉淀,成长,突破,帮助他人,成就自我。

大家好,我是冰河~~

分布式IM即时通讯系统本质上就是对线上聊天和用户的管理,针对聊天本身来说,最核心的需求就是:发送文字、表情、图片、文件、语音、视频、消息缓存、消息存储、消息未读、已读、撤回,离线消息、历史消息、单聊、群聊,多端同步,对接OpenAI大模型,以及其他一些需求。

对用户管理来说,存在的需求包含:添加好友、查看还有列表、删除好友、查看好友信息、创建群聊、加入群聊、查看群成员信息、@群成员、退出群聊、修改群昵称、拉人进群、踢人出群、解散群聊、填写群公告、修改群备注以及其他用户相关的需求等。

注:拿小本子记录下,后续可以写到简历上的整合了OpenAI大模型的分布式IM即时通讯系统,从此,简历上又多了一个可以拿的出手的高并发、高性能、高可用、可监控、可预警、可伸缩,支持无限扩展的真实业务场景项目。

一、前言

为了能够让小伙伴们更好的理解分布式IM即时通讯系统的设计,我们站在架构师的角度,在充分了解系统需求,业务流程和技术流程后,从全局视角为系统设定方案目标,对技术方案进行选型,对系统进行总体架构设计和分层架构设计,并梳理清楚发送消息的交互链路、单聊和群聊的交互链路。以方便各位小伙伴将分布式IM即时通讯系统写到自己的简历中,增强自己的竞争力。

二、方案目标

在进行技术选型与总体架构设计之前,需要明确一个事项,就是系统无论采用哪种方案,采用哪种架构设计都需要明确这种方案的业务目标、技术目标和架构目标,并在研发过程中不断评估系统的总体性能表现,发现系统瓶颈并不断进行优化。

总体上,我们搭建和开发的分布式IM即时通讯系统,需要满足如下方案目标。

  • 业务目标:满足需求设计篇章中的各类需求场景。
  • 技术目标:支持无限扩容,百万用户同时在线聊天。
  • 架构目标:高并发、高性能、高可用、可监控、可预警、可伸缩,支持无限扩展。

三、技术选型

在技术选型上,除了采用SpringBoot等基础框架外,也会采用容器化方案。同时,考虑到为了尽量降低技术门槛,在整个分布式IM即时通讯系统的技术选型中,主要采用市面上比较流行的技术框架和方案,具体选型如下所示。

  • 开发框架:SpringBoot、SpringCloud、SpringCloud Alibaba、Dubbo。
  • 缓存:Redis分布式缓存+Guava本地缓存。
  • 数据库:MySQL、TiDB、HBase。
  • 流量网关:OpenResty+Lua。
  • 业务网关:SpringCloud Gateway + Sentinel。
  • 持久层框架:MyBatis、Mybatis-Plus。
  • 服务配置、服务注册与发现:Nacos。
  • 消息中间件:RocketMQ。
  • 网络通信:Netty。
  • 文件存储:Minio。
  • 日志可视化治理:ELK。
  • 容器化管理:Swarm、Portainer。
  • 监控:Prometheus、Grafana。
  • 前端:Vue。
  • 单元测试:Junit。
  • 基准测试:JMH。
  • 压力测试:JMeter。

四、系统初步架构设计

对于IM即时通讯系统来说,涵盖了即时通讯后端服务、大后端平台、SDK接入服务、OpenAI接入服务、大前端UI,我相信不少小伙伴多多少少能够画出IM即时通讯系统的架构图,大致如图1-1所示。

在这里插入图片描述

其实,这种这种架构设计也比较常见,在这种架构设计中,Kong/Openresty/Nginx只做负载均衡和反向代理,研发人员更多的是关业务层和基础层的开发,流量比较小时,这种架构设计一般不会有什么问题。但是一旦流量比较大,用户调用后端平台的接口发送消息时,即时通讯SDK同步调用即时通讯服务的接口就会出现性能问题。

因为每个终端同时只能与一个IM即时通讯服务实例建立连接,如果大量的用户终端恰好都与一个IM即时通讯服务建立连接,那即时通讯SDK频繁同步调用同一个IM即时通讯服务的接口就会出现性能瓶颈。此时,出现性能瓶颈时,不仅仅会影响到IM即时通讯服务,也会对后端平台接收请求的业务造成一定的影响。

五、系统架构设计优化

既然图1-1所示的架构设计存在性能瓶颈,那我们如何进行优化呢?为此我们在如1-1的基础上进行了优化,优化后的架构如图1-2所示。

在这里插入图片描述

对比图1-1和图1-2可以看出,在屏蔽掉技术实现细节的前提下,我们将对业务的校验和流量管控进行前置化,放大Kong/OpenResty/Nginx的职责,使得这些软件不仅具备反向代理和负载均衡的功能,还能实现限流、黑白名单、流量管控、业务校验等功能。

也就是说,在这种架构模式下,我们充分发挥了整个分布式IM即时通讯系统的入口职责,充分利用Kong/OpenResty/Nginx的高并发、高吞吐量的能力,尽量将大部分无效请求挡在整个系统之外。例如,用户在没登录系统的前提下,就尝试调用发送消息、添加好友、添加群组等等接口。这样会大大减轻后台平台的业务压力。

除了在Kong/OpenResty/Nginx中实现限流、黑白名单、流量管控、业务校验等功能外,我们还引入了业务网关集群,实现限流、降级、熔断、流控、校验、鉴权等功能,进一步保证下游系统的稳定性和安全。

为了解决大量用户终端恰好连接到同一个IM即时通讯服务实例,IM即时通讯SDK频繁调用同一个IM即时通讯服务实例的接口造成的性能问题。我们在IM即时通讯服务SDK与IM即时通讯服务之间引入了RocketMQ集群。

IM即时通讯服务集群中的每一个IM即时通讯服务实例在集群中都有一个唯一的ID,并且每个IM即时通讯服务实例在启动后,只会监听RocketMQ中与自身ID相关的Topic。这样每个IM即时通讯服务只会收到与自身ID相关的Topic中的消息,不会接收所有的消息。

当用户登录系统后,就会与IM即时通讯服务建立长连接,并且会以用户ID和终端为Key,以IM即时通讯服务的ID为value,将其存储到分布式缓存中。同时,会以用户ID和终端为Key,以用户终端与IM即时通讯服务建立的长连接为value,将其存储到IM即时通讯服务本地内存中。

当用户调用后端平台的接口发消息时,会带上目标用户的ID,并且在IM即时通讯SDK中会指定用户登录的终端设备,最终会通过IM即时通讯SDK向RocketMQ发送消息,此时IM即时通讯SDK会根据目标用户ID和终端从分布式缓存中获取目标用户连接的IM即时通讯服务的ID,并向此ID相关的Topic发送消息。此时与目标用户建立长连接的IM即时通讯服务就会接收到RocketMQ中的消息,随后根据用户ID和终端从本地缓存中获取到与用户终端建立的长连接,并基于此长连接向用户推送消息。

那么问题来了:这种架构设计还有进一步优化的空间吗?

六、容器化架构设计

为进一步增强分布式IM即时通讯系统的性能、可用性和弹性伸缩能力,我们可以对分布式IM即时通讯系统进行容器化架构设计,如图1-3所示。

在这里插入图片描述

可以看到,我们对分布式IM即时通讯系统的架构设计进行了进一步优化,采用了容器化架构设计。在原有架构的基础上,我们进行了如下改进和优化。

(1)基础支撑服务

基础支撑服务会由各种基础中间件、数据存储服务、以及监控服务实现,包含:MySQL数据库、TiDB数据库、HBase、Redis缓存、RocketMQ消息队列、Prometheus监控和Portainer容器管理等基础中间件实现,基础支撑服务会对整个分布式IM即时通讯系统提供最基础的数据、传输、监控和容器管理等服务。

(2)容器化

在容器化层面,会通过Docker、Swarm和Portainer实现,其中,会基于Swarm和Portainer对容器化进行管理。

(3)其他基础性功能实现

除了上述分层架构外,对于建设分布式IM即时通讯系统来说,还要考虑异常监控、服务注册与发现、可视化、服务降级与兜底数据、服务限流、服务容灾、容量规划与扩缩容和全链路压测等。

七、DDD分层业务架构设计

在分布式IM即时通讯系统中,不管是大后端平台,还是IM即时通讯服务,我们都会对业务层的代码采用分层业务架构,这里,可以借鉴DDD的分层架构思想,将代码总体上分成展示层、应用层、领域层和基础设施层四个层次,但是,考虑到分布式IM即时通讯系统的特殊性,又不会严格按照DDD的原则来设计代码分层,具体按照如图1-4所示。

在这里插入图片描述

可以看到,分布式IM即时通讯系统会借鉴DDD的设计思想,但是不会完全按照DDD的方式进行设计。

(1)展示层

展示层,也叫做用户UI层,是DDD设计的最上层,对外提供API接口,接收客户端请求,解析参数,返回结果数据,并对异常进行处理。

(2)应用层

应用层,也叫做Application层,应用层主要处理容易变化的业务场景,可对相关的事件、调度和其他聚合操作进行相关的处理。

(3)领域层

领域层,也叫做Domain层,领域层可以说是DDD设计的精髓所在,它是将业务系统中相对不变的部分抽象出来封装成领域模型。

在分布式IM即时通讯系统的设计中,领域层基本不会依赖其他层,也不会依赖基础设施层,这里是与DDD设计存在区别的地方。

(4)基础设施层

基础设施层,也叫做Infrastructure层,基础设施层会对其他各层提供通用的基础能力,在分布式IM即时通讯系统中,就包括了缓存、通用工具类、消息、系统的持久化机制等。

八、发送消息交互链路

在分布式IM即时通讯系统中,我们忽略掉其他一些细节信息,重点关注下发送消息的交互链路逻辑。不管是单聊还是群聊,最终都需要通过IM即时通讯服务将消息推送给用户的终端。此时发送消息的流程如图1-5所示。

在这里插入图片描述

可以看到,用户在分布式IM即时通讯系统发送消息时,不管是单聊还是群聊,最终的消息都会推送到用户登录的终端设备上。假设此时用户A给用户B发送消息,或者用户A和用户B在同一个群组,用户A向群组发送消息,用户B接收消息的主要流程如下。

(1)用户A调用后端平台的接口向用户B发送消息,并且发送的消息中会带有用户B的ID以及终端信息。

(2)后端平台将消息缓存起来,并且会将消息异步写入消息库。

(3)后端平台从Redis中获取用户B连接的IM即时通讯服务的ID。

(4)后端平台获取到用户B连接的IM即时通讯服务的ID后,会向RocketMQ中用户B连接的IM即时通讯服务ID对应的Topic发送消息。

(5)IM即时通讯服务会监听自身服务ID对应的RocketMQ中Topic的消息,此时,用户B连接的IM即时通讯服务会接收到消息。

(6)IM即时通讯服务接收到消息后,会根据用户B的ID以及终端信息从缓存中获取用户B与IM即时通讯服务建立的连接,并且通过这个连接向用户B推送消息。

要实现如上发送消息的流程,前提是要满足如下条件。

(1)后端平台满足分布式条件,可随时横向扩展。

(2)IM即时通讯服务满足分布式条件,可随时横向扩展。

(3)每个启动的IM即时通讯服务实例在集群中都有一个唯一的ID。

(4)每个IM即时通讯服务,都只监听自身ID对应的RocketMQ中Topic的消息。

(4)用户登录分布式IM即时通讯系统后,会与IM即时通讯服务建立长连接,并且会根据用户ID和所在的终端缓存长连接,同时会根据用户ID和所在的终端将连接的IM即时通讯服务的ID缓存到Redis。

(6)用户发送消息时,会根据目标用户的ID和终端从Redis中获取IM即时通讯服务的ID,进而向当前IM即时通讯服务的ID对应的RocketMQ的Topic发送消息。

(7)对应的IM即时通讯服务监听并接收到RocketMQ消息后,会根据目标用户的ID和终端从缓存中获取到用户的连接信息,向目标用户推送消息。

九、单聊交互链路

单聊就是在分布式IM即时通讯系统中,一个用户直接与另外一个用户聊天,也就是一对一的聊天。在这种场景下,很有可能单聊的两个用户中,出现用户不在线的情况。例如,用户A给用户B发送消息时,用户B可能不在线。此时,我们就需要将用户A向用户B发送的消息存储起来。其实,在我们实现的分布式IM即时通讯系统中,无论把用户B是否在线,都会存储消息记录。当用户B登录系统后,将消息同步给用户B,如图1-6所示。

在这里插入图片描述

可以看到,用户A向用户B发送消息时,如果用户B在线,就可以按照发送消息的交互链路向用户B发送消息了。如果用户B不在线,此时就无法向用户B正常推送消息。当用户B登录分布式IM即时通讯系统后,就会调用后端平台的接口拉取所有未读消息,并通过用户B在线流程向用户B推送消息。

十、群聊交互链路

群聊就是在分布式IM即时通讯系统中,多个用户在同一个群组中进行聊天,此时在发送消息时,我们可以通过群组ID找出群内所有在线的用户,将消息即时发送给在线的用户。那些未在线的用户就按照单聊未在线的用户进行处理,如图1-7所示。

在这里插入图片描述

可以看到,群聊的交互链路流程如下所示。

(1)用户调用后端平台的接口向群组发送消息。

(2)后端平台将消息缓存并异步写入消息库。

(3)由于是向群组发送消息,群里有多个用户,此时就会从Redis中获取所有用户连接的IM即时通讯服务ID列表。

(4)对用户按照服务ID分组,将相同服务ID下的用户分在同一个逻辑分组里,方便后续推送消息,并且会记录未在线的用户列表。

(5)循环向每个服务ID对应的RocketMQ中的Topic发送消息。

(6)广播处理未在线用户的未读消息ID。

(7)IM即时通讯服务会监听自身服务ID对应的Topic,会随时接收推送到自身服务的消息。

(8)当IM即时通讯服务接收到消息后,此时用户掉线,或者用户不在线,向用户推送消息就会失败,或者未查询到用户与IM即时通讯服务建立的连接,就不会向用户推送消息。

(9)当用户登录分布式IM即时通讯系统后,会从后端平台拉取历史(离线)消息,并通过用户在线的流程,向用户推送消息。

好了,看到这里,你明白如何设计一个高度可扩展的分布式IM即时通讯系统了吗?赶紧拿本子记录下你学到的知识,将其整理到简历上吧!

十一、如何写简历描述

大部分简历上都会有项目描述部分,也就是要求写你所经历的项目,对于某个具体的项目来说,一般可以从项目描述、所使用的技术以及你在项目中的职责三个方面进行介绍。

项目描述

分布式IM即时通讯系统是为一个而完全自主研发的分布式IM即时通讯平台,在架构设计和实现上后端服务整体包含:大后端平台、即时通讯后端服务、IM即时通讯SDK、OpenAI大模型接入服务:PC端、H5和小程序

主要实现的功能包含:单聊、群聊,发送文本、图片、文件、语音、视频,支持群聊@功能、离线消息、历史消息、消息已读、未读、添加好友、删除好友、创建群、加群、拉人入群、退出群、踢人出群、查看群成员、群公告、修改群备注等一系列完整的功能,后续为了扩展支持对接OpenAI大模型,专门设计和开发了对接多个OpenAI大模型的OpenAI接入服务。

所使用的技术

见技术选型部分

工作职责

1.负责整个分布式IM即时通讯系统的架构设计和扩展性设计,接口规范化设计。

2.负责整体消息通讯的架构设计与核心代码编写。

3.负责数据库优化设计、系统与子系统之间的缓存共享设计。

4.负责大后端平台与即时通讯后端服务的交互设计与实现。

5.负责大后端平台与即时通讯服务分布式扩展设计与实现。

6.负责OpenAI大模型SDK的通用化设计与实现。

7.负责核心代码的编写,负责技术攻关。

8.组织项目的版本发布、对部门其他人员的代码进行审查。

9.全面跟进项目的整体进度、把控项目风险。期间,多次攻破了分布式IM即时通讯系统的难点与痛点。

部分技术亮点如下:

1、采用高性能的OpenResty+Lua脚本充当分布式IM即时通讯系统的流量网关,实现了负载均衡,多种限流与防刷策略,涵盖:基于条件机制限流的防刷策略、基于Token编排机制的防刷策略和基于黑白名单机制的防刷策略,并且在流量网关处可以直接读取本地缓存和分布式缓存中的数据进行校验,校验不通过则直接返回结果,真正做到了校验前置化,避免了无效流量进入大后端平台。

2、同样以流量网关实现高并发流量的第一道防线,业务网关实现高并发流量的第二道防线,本地缓存实现高并发流量的第三道防线,分布式缓存实现高并发流量的第四道防线,尽最大程度保证后端服务的稳定与安全。

3、实现了流量隔离,采用责任链模式实现了初步的风控模型,具备多重风控检验功能,提供风控扩展点接口,内部初步实现了账户风控、IP风控、设备风控、限流风控和自定义风控、消息敏感词风控、关键词风控等。

4、整体设计上采用用户管理与消息通讯分离的设计,大后端平台主要负责用户的管理,包含用户基本信息管理、好友关系管理、群组管理等。即时通讯后端服务主要负责消息收发。大后端平台通过引入即时通讯SDK即可与即时通讯服务进行数据交互,极大的提高了每个服务的扩展性。

5、大后端平台和即时通讯服务各自都支持集群与分布式部署,支持随时横向扩展,提高了整体服务的稳定性和可靠性。

6、即时通讯服务在启动时会生成唯一的服务ID,并将其注册到注册中心,以此来标识自身在即时通讯服务集群中的唯一身份。用户终端通过长连接的形式连接即时通讯服务成功时,会将用户id+终端标识作为Key,即时通讯服务的身份ID作为Value,存储到分布式缓存,以此来确定用户终端与集群中哪个即时通讯服务建立了连接。同时,在即时通讯服务内部会以用户ID+终端标识作为Key,用户终端与即时通讯服务建立的长连接对象作为Value,缓存到即时通讯服务本地缓存。

这样,不仅实现了大后端平台和即时通讯服务的集群与分布式部署,保证其能够随时横向扩展,对与其他业务系统来说,也实现了只需要简单的引入即时通讯SDK,不必过多关注消息交互的细节,即可快速引入即时通讯功能。

7、独立设计即时通讯SDK,在SDK内部封装业务系统对接即时通讯功能的具体逻辑,其他业务系统不必过多关注消息的收发细节,只需要简单的引入即时通讯SDK,便可以快速实现即时通讯功能,极大的降低了团队的对接成本。

8、在消息的设计上,每条消息都会设计一个全局时间有序的、可反解的ID,以此来实现发送消息的顺序性,尽最大程度保证消息收发的顺序性,避免消息出现错乱的问题。并且设计可反解的ID,也能够追溯到收发消息的用户与IM即时通讯服务,方便出现问题时跟踪、排查和解决问题。

9、实现了用户离线消息的缓存与存储,当用户上线后,可拉取未读消息,随后即可进行正常聊天互动。实现了历史消息存储,用户可查看与自己相关的单聊和群聊的历史消息。

10、自主设计和研发了对接多个OpenAI大模型的SDK,系统通过引入OpenAI大模型SDK,经过简单的配置即可对接OpenAI大模型,例如ChatGPT、ChatGLM等。

最后需要注意的是:每个人的具体情况不同,不能照抄照搬,需要结合自身实际情况适当调整,更重要的要吃透《分布式IM即时通讯系统》专栏,这样出去面试才会更有底气,否则,简历写的再漂亮,面试一问三不知,那充其量也是“纸上谈兵”而已。

好了,今天就到这儿吧,我是冰河,我们下期见~~

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

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

相关文章

开放式耳机排行榜前十名?分享四款高性价比的开放式蓝牙耳机

开放式耳机并不一定要选价格贵的才好,而是应该按照个人需求来选择合适的开放式耳机产品,适合自己的才是最好。而且开放式耳机的价格区间也很广,从几十元到上千元不等,在每个价位区间里都有属于每个价位区间的高性价比耳机。选择耳…

RusTitW:大规模语言视觉文本识别数据集(猫脸码客 第190期)

RusTitW: Russian Language Visual Text Recognition 一、引言 在信息爆炸的现代社会,文本作为信息传递的重要载体,扮演着不可或缺的角色。随着计算机视觉与模式识别技术的飞速发展,自动化文本识别(OCR, Optical Character Reco…

【LabVIEW学习篇 - 25】:JKI状态机

文章目录 JKI状态机JKI状态机安装JKI状态机的基本了解状态机的运行原理示例 JKI状态机 JKI状态机的核心就是队列消息状态机用户事件处理器模式,JKI状态机采用指定格式的字符串来描述状态。 JKI状态机并没有采用队列而是采用指定的字符串进行存储,它封装…

用EA和SysML一步步建模(07)蒸馏器系统上下文图01

用EA和SysML一步步建模的操作指南(01) 用EA和SysML一步步建模(02)导入ISO-80000 用EA和SysML一步步建模(03)创建包图和包的关系 用EA和SysML一步步建模(04)创建“需求组织”包图 …

【ACM出版】第三届人工智能与智能信息处理国际学术会议(AIIIP 2024,10月25-27)

第三届人工智能与智能信息处理国际学术会议(AIIIP 2024) 2024 3rd International Conference on Artificial Intelligence and Intelligent Information Processing 中国-天津 | 2024年10月25-27日 | 会议官网:www.aiiip.net 官方信息 会议…

flask项目初始化

1、初始环境 python3.8 2、flask文档地址:https://flask.palletsprojects.com/en/latest/installation/#install-flask 3、初始化项目 $ mkdir myproject $ cd myproject $ python3 -m venv .venv $ . .venv/bin/activate $ pip install Flask4、打开项目mypr…

如何关闭前端Chrome的debugger反调试

1、禁用浏览器断点 2. 把控制台独立一个窗口

Java数据结构(十一)——归并排序、计数排序

文章目录 归并排序算法介绍代码实现非递归实现复杂度和稳定性 计数排序算法介绍代码实现复杂度和稳定性 归并排序 算法介绍 归并排序是一种分而治之的排序算法。基本思想是: 将一个数组分成两半,对每半部分递归地应用归并排序先进行分解,然…

Linux基础---11优化系统

一.优化SSH连接速度 1)修改配置文件 cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak#备份vi /etc/ssh/sshd_config将79行和115行的yes修改为no,最后:wq保存退出(79gg和115gg可直接跳至本行) 79 行:GSSAPIAuthentication no…

fiddler抓包02_安装

① 访问官网:https://www.telerik.com/fiddler ② 点击“try for free”,选择经典版。 ③ 选择任意用途,输入邮箱,选择地区china,确定下载。 ④ 双击安装包进行安装。 安装后为英文界面:

iOS 18 新功能:控制中心大變身!控制項目自由選配

蘋果於 Apple iOS 18 中為控制中心帶來大改變,變得更具有擴充性,而且將支援第三方應用的控制按鈕,中心內的組件大小也可調節。如今 iOS 18 正式上線,我們就可以試試控制中心不同項目自由選配帶來的效果。 組件可在三尺寸之間調整 …

分页 101012

地址拆分: 10-10-12 假设虚拟地址:0x12345678 0001 0010 0011 0100 0101 0110 0111 10000001 0010 00 -> 0x48 (PDE) 11 0100 0101 -> 0x345 (PTE) 0110 0111 1000 -> 0x678 (物理页偏移)

文字loading加载

效果 1. 导入库 import sys from PyQt5.QtCore import QTimer, Qt, QThread, pyqtSignal from PyQt5.QtGui import QPainter, QFont, QColor, QBrush from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton, QProgressBar, QLabel 代码首先导入了P…

【Linux】初识信号与信号产生

目录 一、认识信号 1 .什么是信号 2 .哪些情况会产生信号 3 . 查看信号 4 . 信号处理 二、产生信号 1 .通过终端按键产生信号 2 .调用系统函数向进程发信号 3 . 由软件条件产生信号 4 . 由硬件异常产生信号 一、认识信号 1 .什么是信号 你在网上买了很多件商品,再…

JS数组筛选

1、筛选大于10的 要求&#xff1a;将数组[2,0,6,1,77,0,52,0,25,7]中大于等于 10的元素选出来&#xff0c;放入新数组 <script>let arr [2, 0, 6, 1, 77, 0, 52, 0, 25, 7]//声明一个空数组&#xff0c;用来接受数据let newarr []//利用for循环依次判断for (let i 0…

alias 后门从入门到应急响应

目录 1. alias 后门介绍 2. alias 后门注入方式 2.1 方式一(以函数的方式执行) 2.2 方式二(执行python脚本) 3.应急响应 3.1 查看所有连接 3.2 通过PID查看异常连接的进程&#xff0c;以及该进程正在执行的命令行命令 3.3 查看别名 3.4 其他情况 3.5 那么检查这些…

基于SSM的社区爱心捐赠管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSSMVueMySQL的社区爱…

【软考】哈密尔顿回路(Hamiltion)

目录 1. 说明2. c代码实例3. 邻接矩阵截图4. 结果截图 1. 说明 1.一个无向连通图G点上的哈密尔顿&#xff08;Hamiltion&#xff09;回路是指从图G上的某个顶点出发&#xff0c;经过图上所有其他顶点一次且仅一次&#xff0c;最后回到该顶点的路径。 2. c代码实例 #include …

系统架构-面向对象

有对象和没对象一样&#xff0c;鉴于今天中秋节 所以明天姐姐我就恢复单身了&#xff0c;忍这几个小时也没关系&#xff0c;一点不重要了

C++——哈希的应用(位图、布隆)

目录 前言 一、位图、布隆是什么&#xff1f; 二、位图 1.面试题 2.位运算 3 位图的应用 三、布隆过滤器 1、代码实现 2、 布隆过滤器的查找 3、 布隆过滤器删除 4、 布隆过滤器优点 5、 布隆过滤器缺陷 总结 前言 我们学习了哈希算法&#xff0c;我们知道存储数据可以构建一…