isMusic项目

1 项目概述

项目的背景与目的

背景与目的:音乐是人类文化的重要组成部分,而随着互联网的发展和普及,音乐分享平台也成为人们分享、发现和交流音乐的主要渠道之一。我们的音乐分享平台以提供高质量、社区氛围良好的音乐分享服务为目标,致力于打造一个用户体验优秀、功能丰富、性能稳定的音乐分享平台。我们使用 SpringBoot 和 Vue 作为开发框架,实现了丰富的音乐资源管理、搜索、播放功能,同时也具备良好的安全性、稳定性和用户体验。

项目的主要部分

  1. 需求分析阶段:收集周边同学对类似平台的需求与痛点,并对需求进行分析,设计方案,确定项目的功能需求、性能需求等等。
  2. 总体设计与详细设计阶段:初期根据需求分析确定了项目的主要功能与设计方案,绘制了层次图、模块功能的流程图、使用UML建模工具来更好地呈现项目的结构和设计,同时为模块制定详细的接口文档,以确保团队成员之间的沟通和协作。
  3. 前端开发和后端开发阶段:通过Vue框架,使用HTML、CSS和JavaScript等技术实现平台的前端页面和交互功能。使用 SpringBoot 框架,使用Java语言实现平台的后端逻辑和接口功能,同时实现与数据库的交互,使用版本控制工具(如Git)来管理代码,更好地跟踪更改和回滚问题。
  4. 测试和调试:编写测试用例来测试项目的各个方面,并使用自动化测试工具来加速测试过程。您也可以使用日志工具来记录运行时的问题和错误。

项目的流程

项目流程的具体步骤可以根据项目的具体要求来定义,但一般来说,项目流程可以分为以下几个步骤:

1.定义项目:确定项目的目标、范围、投入资源、预期成果、风险等,制定项目计划。

2.组建项目团队:根据项目的需要,组织相关的专业人员组成项目团队,明确责任分工。

3.管理项目:制定项目管理规范,对项目进行实施和控制,以确保项目按照计划进行。

4.实施项目:根据项目计划,按时完成项目的各项工作。

5.评估项目:结合项目实施过程,评估项目的效果,追踪项目的变化,并及时做出调整。

6.结束项目:归档项目文件,完成项目报告,发表项目成果,做出总结和反思。

2 项目设计

2.1 如何进行项目的总体设计

项目的总体设计可以大致分为两个方面:系统设计阶段和结构设计阶段

对于系统设计阶段,团队成员互相讨论研究适合的设计方案,基于各个成员的所学技术栈将项目定为后端基于 SpringBoot 框架开发,前端基于 Vue 框架开发设计。

  1. 对于结构设计阶段,首先我们根据之前绘制的数据流图将系统需要实现的功能分解,对数据流图进行进一步的细化,讨论细化后每一个功能涉及的算法。
  2. 紧接着就是设计软件结构,用一个模块去完成一个功能,并将各个模块组织成良好的层次系统,绘制系统层次图
  3. 根据需求分析阶段所确定的系统数据需求设计数据库

2.2 负责的模块如何进行详细设计

3 项目难点与解决措施

难点一、数据同步

在本项目中使用Mysql作为主数据库,Redis作为缓存中间件,ElasticSearch作为搜索中间件,各个组件之间的数据同步对于我来说就成为了一个问题。

Redis 与 Mysql 的数据同步

项目初期:我们团队使用的策略是通过代码直接实现 Redis 与 Mysql 的同步增删改,修改 Mysql 中的数据后将最新的数据同步到 Redis中,虽然数据一致性得到保证,但是这种同步策略会导致系统性能受到影响,将操作 Mysql 与 Redis 的代码放入一个模块,代码的耦合度也会更高。

目前进展:数据的操作只涉及增删改查,对于增改操作只需要修改 Redis 中的数据,这样查询操作仍然能够查询到最新的数据。而对于删除操作,就优先删除 Mysql 中的数据,随后删除 Redis 的数据。但这样还只是实现了软同步,我们的项目使用了 SpringBoot Schedule 数据包来实现一个定时器,定时在数据访问量较小的时间段将 Redis 中被修改的数据存入硬盘实现硬同步。

未来展望:虽然对于现阶段的同步策略对于业务处理速度很快,但由于采用定时器方式数据同步的实时性还是会受影响,在查阅资料后发现,目前主流的同步策略是借助 MySQL 日志 binlog 来实现同步,该同步方式采用异步同步方式,在 MySQL 主库上进行数据变更操作时,并不需要等待同步完成,因此不会对主库的性能造成直接的影响。未来我也将会学习这种同步方法,将该方法运用到项目之中。谢谢老师,我的回答完毕。

难点二、团队协作

作为本项目小组的负责人,我深感团队协作不易。

  • 人员管理困难:我们的小组包括我共有 7 名成员,团队成员的工作效率、技能水平、合作能力层次不齐。部分组员之前没有接触过某些模块开发工作,对于学习新技术的热情不高,或者是有其他学业上的压力,不愿意投入太多时间等等,这些都对项目的开发进度产生影响。
  • 项目进度控制困难:我们小组后端开发成员占多数,前端页面开发工作进度缓慢,以至于后端开发完毕后,后端开发小组一同设计前端。
  • 项目合作困难:部分成员对 Git 版本控制工具的使用不熟练,代码合并时惹出了不必要的麻烦。

4 项目开发过程

4.1 测试工作如何展开

在我们的项目中,测试工作主要分为三个阶段:单元测试、集成测试和系统测试

首先,后端组员在编写代码的过程中就会进行单元测试,保证代码的正确性和可维护性。我们使用JUnit框架进行单元测试,测试时使用白盒测试。

其次,我们在集成阶段进行集成测试。在这个阶段,我们会将各个模块进行集成,并进行**接口测试性能测试**。我们使用Postman进行接口测试,并使用 JMeter 进行性能测试。

最后,在系统测试阶段,我们会对整个系统进行测试,模拟用户的使用场景进行了页面测试,并使用 JMeter 对整个系统进行压力测试

总的来说,我们的测试工作覆盖了各个阶段,测试工作中出现的问题,测试人员会记录到一个缺陷文档中,文档中会记下测试用例和返回结果,后端开发成员修改过后测试成员执行回环测试,减少项目出错的可能。

性能测试(Performance Testing):是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。负载测试和压力测试都属于性能测试。通过负载测试,确定在各种工作负载下的系统的性能,目标是测试当负载逐渐增加时,系统各项性能指标的变化情况。压力测试是通过确定一个系统的瓶颈或者不能接受的性能点,来获得系统能提供的最大服务级别的测试。

负载测试(Load Testing):是模拟实际软件所承受的负载条件的系统负荷,通过不断加载(如逐渐增加模拟用户的数量)或其他加载方式来观察不同负载下系统的响应时间和数据吞吐量、系统占用的资源(CPU、内存等),以检验系统的行为和特性,以发现系统可能存在的性能瓶颈,内存泄漏,不能实时同步等问题,负载测试更多的体现了一种方法或一种技术。

压力测试(Stress Testing):在强负载(大数据量、大量并发用户等)下的测试,查看应用系统在峰值使用情况下的操作行为,从而有效地发现系统的某项功能隐患,系统是否具有良好的容错能力和可恢复能力。压力测试可分为高负载下的长时间(如24小时以上)的稳定性压力测试和极限负载情况下导致系统奔溃的破坏性压力测试。

三者的区别: 从测试的目的出发,从用户的需求出发,就比较容易区分性能测试、负载测试和压力测试了。性能测试是为了获得系统在某种特定的条件下(包括特定的负载条件下)的性能指标数据,而负载测试、压力测试是为了发现软件系统中所存在的问题,包括性能瓶颈、内存泄漏等。通过负载测试,也是为了获得系统正常工作时所能承受的最大负载,这时的负载测试就成为了容量测试。通过压力测试,可以知道在什么极限情况下系统会奔溃、系统是否具有自我恢复性等,但更多的是为了确定系统的稳定性。

4.2 项目亮点

本次项目中,合理利用了不同中间件的功能,

  • Redis缓存:
  • 使用了高性能ElasticSearch搜索引擎:

4.3 如何搭建消息队列,用消息队列做了什么

在本次项目中使用了 RabbitMQ 充当消息队列,目的是为了实现流量消峰,同时在用户模块与搜索模块之间搭建消息队列,实现应用解耦,通常还可以进行异步处理、应用解耦等功能。

4.4 如何解决团队协作问题

  • 确定责任:明确各个成员的职责和任务,保证每个人都清楚自己的工作内容和要求。

  • 定期会议:定期召开会议,讨论项目的进展和问题,并分配任务;

  • 及时反馈:在遇到问题时及时向团队成员求助,反馈进展情况;

  • 理解差异:不同成员有不同的技能、背景和意见,应尊重差异,并在此基础上建立共识;

My_BLOG 项目

想法

1、使用关键字匹配md文档小标题

2、上传的文章勾选图片压缩存储