在线教育实习经验总结

 介绍一下的你实习做的项目吧?

主要就是服务于福建专升本及考研学生培训的微服务C端项目,主要分前台和后台,其中的黄金链路就是从用户登录到购买课程再到课程观看的流程。那在这个过程中还存在一些辅助模块来提高用户的使用体验,包括问答,点赞,热门榜,积分及优惠劵模块,我只要就是负责对辅助模块的开发。

介绍一下课程模块

课程模块我印象最深的就是用户购买课程加入课表的业务,课表表只要就是关联用户和课程的关系,并且是个一对多的关系。在用户就完成付款后就会调用回调函数发送购买课程的消息,消息的主要数据就是订单号,课程集合,用户id,我们的学习服务就会监听对应的消息,在得到消息后做批量插入的操作,因为在一个订单中可能会购买多个课程,在这个过程中难点就是我们需要消息消费的幂等性问题,我们需要关闭了消费者自动确认机制,在我们消费完消息后再发送消费者确认标识最终移除消息。

哦对了,在课程模块中因为有大量的即可会使用到课程的消息,最开始的时候我们主要就是重复的去远程调用获取课程的信息但是呢效率很低,就使用了redis做缓存效果还是很好的,但是呢,每次去访问redis需要网络开销效率还是跟不上,所以我们最终就搭建了二级缓存,主要就是基于Caffaine实现的,因为Caffaine是基于jvm的就不要考虑网络开销的问题,也正是因为这个特性,所以在做数据一致的时候,我们需要使用redis的发布与订阅模块来通知所有的节点中caffaine缓存的清除操作。

你这个合并写请求的实现介绍一下?(在项目中有没有遇到难点?)

在编写学习模块中,提交观看位置的业务的优化是比较难的。在业务需求上,我们需要保证用户的续播效果且误差要在30s之内 ,在播放视频的时候前端每隔15秒就会提交一次观看位置,用户只要也是进行观看视频这种视频的长度基本数在一个小时以上,上级反映同时观看视频的用户在3000左右,也就是说每秒的平均的tps(吞吐量)在三千,那这这时候直接打db明显是不合适的。因此就进行了合并写请求的优化。那我给您继续介绍一下实现流程你看行吗?

我们会发现同一个用户每次观看位置只有最后一次是有效的,那我们干脆就让最后一次的观看位置打db,使用redis的hash结构进行存储,大key存储课表id主要就是关联课程和用户,小key存储节id,value就是存放观看位置mount。在每次将数据先存储到redis中,在使用mq发送一个延迟20s消息主要就是基于死信队列实现的,也是该模块进行监听,主要作用就是将20s前的观看位置和当前redis中观看位置进行比较,如果发现相同,那就说明这20s没有进行观看了这时候就修改数据库中的观看位置。如果发现不相同的话,就不做操作即可。可以说移除了99%的打db操作。

问:那用户直接拉进度条也会视为已看完吗?

那在我们的项目中,就是规定主要用户进度条到达50%就认为其已看完。如果真的需要这个需求的话。我想想,因为前端每隔15秒提交一次请求,使用总时长除以15除2就可以计算总提交数。使用hash结构存储对应的视频的提交次数。大key存储课表id,小key存储节id,value存储提交次数,在每次提交位置的时候就会将value+1。观看位置50%时候判断hash中的提交数是否大于等于总提交数,当然可能存在用户拖动进度条的观看操作,所以我们可以设置一个因子控制总提交数,就比如0.5。这是我目前的写法。

介绍一下问答模块吧?

问答模块主要分为两个表,问题表和回答表。问答表中根据目标问题id和目标回答id又分为回答及讨论,前端展示的格式类是b站的评论区,一个问题中包含多个回答,一个回答中包含多个讨论。并且会展示对应的点赞数。这模块中我认为比较难的就是点赞功能的实现,我给您介绍一下点赞功能的实现吧?

最开始的时候我们每次点赞及取消赞的时候都直接打db,但是呢,在后续测试的时候发现当出现恶意的点赞或取消赞就会优酷db也就是同时出现大量的这种请求,直接走db明显是不合理的。我们就考虑能不能先将点赞的数据存储到redis中。因此就使用redis的set进行存储,key存储业务id,value存储userId集合,使用zset存储点赞总数,key存储业务类型,member存储业务id,scope存储总点赞数。在每次修改set中数据的时候会调用scard方法计算中点赞数,然后修改zset中的数据。通过xxl-job定时任务每30s取除所有的总点赞数,批量的修改数据中的对应业务的点赞数。

但是呢,点赞本来就是一个低频业务,在项目中也没有什么大咖引流。点赞的总数基本3000以内,所以直接打db也是可行的,再使用redis又需要一定的网络开销,所以还是要根据实际情况来考虑吧。热门模块的实现思路类似但是在实际db上还是区别比较大的,我给您介绍一下这个模块,您看行吗?

热门榜也是基于这种实现方案,热门榜主要的就是展示当月的热门课程的数据,使用set存储存储用户和课程的关系,使用zset结构存储热门片源的热度,在做定时任务上区别比较大,分为三个子任务,创建热门榜表,插入数据,清除缓存了。在数据库设计方面考虑的还是比较多的,如果将热门榜的数据全部存储到一张表上的话,这个数据量是非常庞大的,在后续查询的时候没有建立索引的话效率是非常低的,那我们就想进行水平分表,让每个月的热门榜都作为单独的表。在查询历史热门榜的时候也不会存在跨表的行为,我们并没又采用share-jdbc来做分表,这样太麻烦了。主要就是使用mybatis的insert标签做创建表的工作,并配合SPEL语句对表名字的拼接,这个SPEL也是现成的,表名字格式为hot_对应月信息。

因为缓存中数据还是比较庞大的,为了解决这种 海量任务的问题,我们对xxl-job搭建了集群使用分片广播的策略模式,当然我们会接收到类似于分页后的数据,每20条作为一页,通过取模的方式来确定执行该任务的节点。实现负载均衡的效果及提高执行任务的效率。(没在xxl-job类中向获取所有的缓存数据,)在清除缓存的数据包括set和zset的缓存。

问:那为什么要设计成三个子任务,你是怎么保证任务的顺序性的呢?
如果将三个任务和为一个大任务的话,在后续其中每个模块执行错误的时候,需要整个任务重新执行,而分为三个任务的话,只需要从失败的位置重新执行即可,当然前提需要保证任务的顺序性,效率上明是比较高的,在xxl-job的控制面板中新建任务的时候我们就可以设置子任务的id,从而控制任务的执行顺序。

介绍一下积分模块吧?

积分表主要的字段就是userId,积分量。我们的规则就是用户通过打卡,观看课程及评论。来获取积分,也就是就是签到来获取积分,可以提供积分来购买商品。每观看一节课+3积分,一条评论+1分,每天通过看课及评论最多可以获得20积分,普通打卡+1分,连续签到大于等于六天+2,连续签到大于13天+3分并且在月初的时候重置连续签到,签到没有限制积分的。

使用redis存储每天获取积分值,在每天最开始获取积分的时候就会将键值对并数值ttl,ttl就是24:00减当前时间,第二天0点重置。

在签到设计上是比较难的。我们主要就是使用redis的bitMap结构来实现的,使用二进制来每日的签到情况,主要就是通过redisTemplate.opsForValue().setBit("名字",位置, 值)。因为连续签到的话,它获取的积分是不一样的,我们就需要通过bitMap判断连续签到的天数。主要就是将获取的数据循环的与1做异或操作(&1)+ 右移一位的操作(>>>1)。这样就可以获取对应的天数,添加对应的积分给用户。

 介绍一下优惠劵模块吧?

我只参与了部分的优惠劵的开发,主要就是对代码的阅读。在领优惠劵的时候就会存在超领的问题。 我们不使用传统的版本号锁来解决,版本号锁每次只能又一个线程领卷成功,但是呢,在优惠卷吃充足的时候效率非常低,我们的解决方案就是去修改sql语句,主要就是修改条件语句当前领取卷数小于总优惠劵。但是呢,在后续测试的时候发现在相同用户并发抢卷的时候还是有超领的问题。那我就需要保证每次相同用户只能由一个领卷请求成功。因为是微服务项目,所以使用Synchronzied明显是不合适的,我们使用redisson的可重入锁实现分布式锁。

在后续我们可能会使用到分布式其他类型的锁,所以我们实现了动态获取锁及获取锁策略。

使用自定义注解+AOP+工厂模式+策略模式。

自定义注解主要就是为了配置用户需要的锁类型枚举及策略枚举。

   AOP主要就是控制上锁和解锁的时机。

  工厂模式主要就是一个enumMap,key存储锁类型的枚举,value就对应redisson实现锁的方法。

提供对应的枚举执行对应实现锁的方法。

  策略模式主要就是一个上锁的抽象方法,多个策略内部内都去实现该抽象方法。提供传入锁实例和策略的枚举实现上锁。主要的策略就包括: 不重试后快速失败,不重试后快速结束,有限重试后重试超时后失败,有限重试后超时后报错、等等策略。

  • 21
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android实训报告基于Android游戏开发全文共6页,当前为第1页。Android实训报告基于Android游戏开发全文共6页,当前为第1页。Android实训报告基于Android游戏开发 Android实训报告基于Android游戏开发全文共6页,当前为第1页。 Android实训报告基于Android游戏开发全文共6页,当前为第1页。 通信与电子信息专业实训报告项目名称:基于Android的游戏开发班级通信班姓名学号指导教师成绩实训时间:2013年X月17日—2013年X月28日目录一、实训目的及其意义31.1、目的及意义31.2、研究现状3二、实训主要任务、重点及难点42.1、任务42.2、重点内容及实现途径4三、实训具体内容及完成的主要工作53.1、认识基础开发63.2、了解数据存储63.3、总体实训过程7四、实际遇到的困难,解决问题的方法和措施8(一)、所遇问题8(二)、解决方法与措施9五、心得体会9一、实训目的及其意义1.1、目的及意义了解现阶段互联网发展主流,了解移动互联网,认识移动互联网的发展与展望,认识Android,了解基于Android的应用软件开发方法及其商业流程。把理论与实际结合,通过对理论知识的理解,领悟从而运用到生活实际巩固所学的知识,提高对实际生活的认识,积累经验。使学生在此期间能够初次体会到实际生产中的种种技能与经验,完成一项项目锻炼独立思考及团队合作能力。使学生们进一步加深对所学知识的理解,理论联系实际,巩固所学有关计算机基础理论知识和基本技能,学习有关计算机最新技术方面的应用,增强学生对计算机在社会生活,社会生产中应用的感性认识,深入了解计算机在各个领域中的应用状况。生产实习是学校教学的重要补充部分,是区别于普通学校教育的一个显著特征,是教育教学体系中的一个不可缺少的重要组成部分和不可替代的重要环节。它是与今后的职业生活最直接联系的,学生在生产实习过程中将完成学习到就业的过渡,因此生产实习是培养技能型人才,实现培养目标的主要途径。它不仅是校内教学的延续,而且是校内教学的总结。生产实习一方面巩固了书本上学到的理论知识,另一方面,可获得在书本上不易了解和不易学到的生产现场的实际知识,使我们在实践中得到提高实训环节对于提高学生的综合能力和全面素质具有重要意义。 1.2、研究现状Android是Google开发的基于Linux平台的开源手机操作系统。它包括操作系统、用户界面和应用程序——移动电话工作所需的全部软件,而且不存在任何以往阻碍移动产业创新的专有权障碍。Google与开放手机联盟合作开发了Android,这个联盟由包括中国移动、摩托罗拉、高通、宏达电和T-Mobile在内的30多家技术和无线应用的领军企业组成。Google通过与运营商、设备制造商、开发商和其他有关各方结成深层次的合作伙伴关系,希望借助建立标准化、开放式的移动电话软件平台,在移动产业内形成一个开放式的生态系统。 Android主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导Android实训报告基于Android游戏开发全文共6页,当前为第2页。Android实训报告基于Android游戏开发全文共6页,当前为第2页。及开发。尚未有统一中文名称,中国大陆地区较多人使用"安卓"或"安致"。Android操作系统最初由AndyRubin开发,主要支持手机。2005年8月由Google收购注资。2007年11月,Google与84家硬件制造商、软件开发商及电信营运商组建开放手机联盟共同研发改良Android系统。随后Google以Apache开源许可证的授权方式,发布了Android的源代码。第一部Android智能手机发布于2008年10月。Android逐渐扩展到平板电脑及其他领域上,如电视、数码相机、游戏机等。2011年第一季度,Android在全球的市场份额首次超过塞班系统,跃居全球第一。 Android实训报告基于Android游戏开发全文共6页,当前为第2页。 Android实训报告基于Android游戏开发全文共6页,当前为第2页。 2012年11月数据显示,Android占据全球智能手机操作系统市场76%的份额,中国市场占有率为90%。目前基于Android的移动终端上的软件应用开发很火热,Android平台的开发已越来越强大。 Android是一种以Linux为基础的开放源码操作系统,主要使用于便携设备。Android操作系统最初由AndyRubin创办,最初只支持手机。2005年由Google收购注资,并拉拢多家制造商组成开放手机联盟(OpenHandsetAlliance)开发改良,逐渐扩展到到平板电脑及其他领域上。 二、实训主要任务、重点及难点2.1、任务认识移动互联
学习计算机应用基础心得   当今社会,到处充满机遇与挑战。知识是我们面对这一切的筹码,而计算机知识则 更为重要。计算机行业是个飞速发展的行业,日新月异,因此,不断加强理论学习,拓展知 识领域,进行知识更新,是我们当前最为迫切的任务,在学习当中我总结了不少的经验,让 我在以后的学习当中受益匪浅。   一、感受与体会   1.基础很重要   实践证明,对文字、表格等的处理都是计算机课程的基础,需要一定的操作桌面的 知识和能力,需要一定的工具操作能力,学好这些是学习计算机的入门,所以尤为重要 !   2.循序渐进   整个学习过程应采用循序渐进的方式,先了解计算机的基本知识,如计算机的起源 、发展、windowsXX、xp的桌面操作、电子表格等,使自己能由浅入深,由简到繁地掌握 他们的使用技术。   3.学以致用   在学习时始终要与实际应用相结合,不要把主要精力花费在各个命令孤立地学习上 ;要把学以致用的原则贯穿整个学习过程,以让自己对命令能有深刻和形象的理解。   4.熟能生巧   word作为文字操作专家,它能使我们更加深入地理解、熟练文字操作的命令。要强 迫自己做几个综合实例,分别详细地进行文字编辑,使自己可以从全局的角度掌握整个 编辑过程,力争使自己学习完word之后就可以投身到实际的工作中去。   二、学习建议   1.常见问题要弄懂。   对于经常出现的问题,要及时解决。如果推脱,那么问题就越堆越多,不利于今后 的学习。   2.有比较,才有鉴别。   容易混淆的命令,要注意使自己弄清它们之间的区别。   3.养成良好习惯。 其次,学习了常用的办公软件,主要有WORD,EXCEL等,以及常用的几种软件的应用技巧 ,同时也学习了一些解决实际应用过程中经常出现的问题的方法,相信这次学习,会让我在 今后的工作中运用电脑时能够得心应手。   通过学习我真正体会到了计算机知识的更新是很快的,随着教育体制的改革和教育理 念的更新,以及信息技术的飞速发展,如何接受新的教育理念,转变我们传统的教育观念, 来充实我们的专业技能,已经成为我们每一个人必须要解决的第一个问题。只有不断地学 习,才能掌握最新的知识,才能在以后把工作做得更好。   经过这次学习计算机基础知识,我真真确确的感受到了计算机在我们生活中工作中 的运用,这些软件、程序能让我们提高工作的效率,更直观更便捷的切入主题。同实概 念清晰,简单易学、实用是适合企业管理人员、数据库管,对我工作后制表、创建查询 、数据分析和材料演示都有很大的作用,这样我们能更清楚的了解信息并进行分析。 现在我发现我对计算机有了新的认识,以前只知道玩游戏、娱乐和简单的应用。通过 这次的实训,我了解到,要真真正正的掌握计算机程序还不是一件简单容易的事儿,但 真正掌握后,它带个我的将是无穷的便捷与科技,我喜欢高端便捷的生活。    ----------------------- 2020国家开放大学计算机应用基础心得实训1全文共2页,当前为第1页。 2020国家开放大学计算机应用基础心得实训1全文共2页,当前为第2页。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值