今天接着来看商业实战项目推推的第一个模块——小说详情模块的开发文档设计。我们上节课看了产品经理给出来的产品功能要求以及一些关键的重难点。这个也是能力提升的一部分,也是校招简历、面试提问的难点。在正式的商业开发中,不管是实习还是正式工作,产品的思路以及开发文档的设计都很重要。
本期除了这种默认的小说详情模型,还有些标题,封皮等等,另外最主要的还是在小说每天更新时间点的页面访问压力处理。这个对后端特别是接口最核心的一个部分很重要,如果后端挂了,那整个业务就挂掉了。
我们来一起来看一下文档的部分,文档主要包括两部分,一部分是数据库的设计,一部分是接口的设计,但接口设计我们在下节课再讲。首先,文档的写法不用特别在意,因为在任何的公司里,只要是正常的业务,它一定会有自己的文档模板。但是一般情况下,在大型的互联网公司,因为时间有限大家基本上是把难点描述清楚,不管是给开发指导开发工作,还是等到过了很久以后,再进行这个项目维护或者更新的时候,能通过文档去明白每个点是怎么去做的。
本身接口如果是正常的话,只提供一个页面查询接口,但是考虑到在更新前后访问压力比较大而且需要更新数据,这个时候缓存数据就无效了。所以考虑在读取压力、并发压力比较大的情况下增加了另外一个接口叫更新状态查询接口,接口具体是什么,我们下节课再讲,今天主要是谈文档的设计。
订阅功能,因为这块有个订阅和非订阅,但这个实际上没有什么难度,对于后端来说就是一个简单的模块,所以这种没有难度的模块放在简历上写其实没有什么用处。它就是一个已读和未读,面试官不会去问你这个关注和取消关注是怎么实现的,因为它没有什么提问点。大家平时做项目并发压力不是很大,除非说项目的并发压力会很大就像这个比较特殊的推推项目,它的访问压力全部集中在更新的前后是大很的流量,所以整体就重新塑造了一个页面流程,这个是前端流程为主,但是也会影响到我们后端的开发逻辑。开始用户去打开一个小说的详情页面,这个时候前端是加载整个页面,也需要我们后端给他整个页面的信息,包括书籍的基本模型、介绍、姓名、类别、作者。但是因为我们的核心功能是提供给用户小说更新的最新内容,所以说这个时候前端页面打开之后,每过十秒钟他要不断的去后端调用接口,判断一下有没有更新,但如果这个时候还是反复调这个数据查询接口的话,那么性能就会出问题,因为这个更新它本身就是一个新的东西,整个页面信息放在缓存里面是失效的,因为缓存信息可能已经更新了,但是你的缓存信息是错的,那么这个时候呢,我们为了性能压力,在设计的时候就不能去拉整个页面,一是数据量比较大,二是它的并发量会很大,所以我们就提供了一个短接口,这个短接口不提供信息,它只提供一个概念,就是数据有没有更新,比如说每十秒钟或者每60秒钟前端调用。它自己会做一个轮询,那么后端只提供一个短接口,短链接就是更新状态接口,这个接口不返回什么数据,就返回true和false,有没有更新,如果有更新,那相当于说我们就把这个缓存的数据给更新掉了,这样让让用户来触发这个逻辑,而不是由我们自己来触发这个逻辑。这样的话,一个链接它的访问数量级,这个访问时间为什么叫短链接呢?因为它可能在毫秒级别,10毫秒或者20毫秒就完成了一个访问,也不用传输数据。这样的话,页面上如果没有更新页面就不用去调一个更新详情接口,一个全面的数据拉取,所以它就会有一个比较清楚的概念,这个流程清楚之后,我们的难点就出来了,后端怎么做两个接口的设计,怎么去做性能上的一个改变,而且,如果没更新的话就一直循环,更新的话页面打开是一个死页面,那用户可能在等,这个时候明明更新了,但是他一直看不到,这也是不好看的。如果已经更新的话,就不会调用我们的这个状态接口了,相当于到这个时候就页面就不调我们的后端接口了。
所以呢,我们就发现问题了,开发文档就是要设计我们会怎么做。更新信息会存储到里面,然后以这个为主职位,最后更新章节,这是最简单的一个方式。因为你每次更新最后章节,如果当前是18章,你会发现现在是第19章,那说明就更新了,所以这个更新信息反而可以放在缓存里面,因为它是每十秒钟或者每一分钟才更新的,它可以更短期的放在缓存里面,十秒钟放在缓存里面也就意味着十秒钟我的数据库只查一次就好了。但是发现十秒钟之后再调个真实的接口,发现数据是更新了,那整个逻辑就重新更新一下就好了。
重点来看一下数据库的设计,很多同学尤其参加我们在线实习的同学,对数据库的设计大家都是一知半解,哪怕你是计算机专业出身,但是学校老师不会讲数据库设计的规范是什么,所以很多同学做的数据库设计是能完成逻辑,但不是很标准。当然这个不是很大的问题,大家以后去公司之后,公司都会有人去跟你讲公司的逻辑是怎么样的,但是你如果能尽快的去知道设计的一些规范,那么你的校招,你的简历,你的面试的问答就会更好一些。
接下来看这个表,因为它是一个详情表,就作为一个主表来看,引擎我们用InnoDB,为什么用InnoDB,这个就是考点,大家一定要注意。我们项目部分不太去展开考点的部分。我们用的是utf8的一个编码,然后我们一般说一个商业设计一般有四个默认字段,一个是id,id是自增的,自增主键,一般来说是有这么一个字段。另外一个字段叫status,这个字段一般来说它至少有两种类型,0是说明这个数据这一行你加的这个数据是非法的,非法的意思就代表比如说删除,在查询的时候加一个status不等于0,但是你还可能有1是正常状态,可能还有234,但是不加不等于0的时候,这个数据就查询不出来,有同学说那我不要加个专门字段的数据标志,有没有删除?没有用,因为没有必要,已经有个字段可以专门做这个事儿了,如果你每次查询要加两个字段delete and status怎么怎么样,那就是多此一举。而且一定要注意,我们在接口里面不太可能会提供真实的删除数据接口,就有很多同学现在学了一点redis风格的这个思维,他就特别喜欢用delete,get,push那套思维,但这个在开发里面用的不是特别多,那只是一个设计理念,不是一个开发理念。在正常的数据库里面,一般来说数据库层级,比如说我们Java的这个map层级不太可能会提供delete的数据库操作,因为数据对互联网来说是最核心,最有效的东西,哪怕是删除数据也是可以分析很多东西的。另外两个字段,一个叫addtime,一个叫update time。add time的意思是什么?就是这条数据的插入时间,所以就不用去改它,它是个统计意义,它跟id是同维的,另外是update time,就是数据有些需要更新的数量等,那么这个更新的时候就会加上去,数据库就打通了。
这样写完之后,数据接口就必然会有一个load by id,update等的接口。id主键长度是1,然后类型是int类型,这是很多同学会奇怪问要不要用类型,一定要注意一个单表的长度大概多少,int类型长度long是多少,其实超出int之后单表就解决不了了,所以这个是架构的一部分,在任何的商业开发里面大家是不会用到long以后的东西,除非是说这个项目已经不是一个表可以做到的,这样的项目大家在实习或者是自己做的项目里面都是接触不到的。
比如分库分表,底层逻辑,这个都不属于正常的校招项目亮点,因为你不会真实的遇到这种项目,所以这个项目在简历上的合理性是有问题的,第二个是这种项目你是没办法真实理解的,可能看了个课程后你觉得懂了,但是要注意这种课程讲解可能都有问题,因为分库分表和秒杀一样,它是有业务场景的,你光这么去讲,面试官一问深了,你就会发现答不上来,给自己挖坑了。另外有同学说我喜欢用马鞍型,有同学说我喜欢用下划线的方式分割,这个都是可以的。但是在spring体系里面,我们更喜欢用的是马鞍型的大小写的方式,为什么呢?因为这样的话,做实体类NTT的时候,就不用去加很多注解。很多同学喜欢加注解,spring有很多注解,其实它本身是有性能影响的,如果能不用就不用。还有的同学不知道有很多注解,其实正常编程的时候能正常的实现那就不用加注解,注解是辅助你在实现不了的情况下再去加。然后作者名称,状态,因为他现在状态只有两个,是01,我们就加tinyint就好了,type是说类型,有同学说这个是不是有六个状态?实际上是不是,我们说要用枚举类型,因为它是固定的,在正常的数据库的存储里面,包括前后端接口里面,能不用字符串形式就不用字符串形式。因为字符串形式太容易通过我们的输入输出被弄错。建议把它变成枚举值,因为它是固定的长度,而且数量很少,那么枚举值就传的是012345,这个数字是不会有问题的。
Cover封皮,有同学说封皮不是一个图片吗?图片应该怎么存?要注意图片是不太可能会直接存到数据库里面去的,一个图片一兆或者是十兆,那么一下有100个人一起访问的话这个数据库就挂了,因为带宽,特别是数据库的带宽是现在性能上最大的一个瓶颈。我们这个项目的腾讯云文件存储系统cos,后面会跟大家一起用一下,那么用了这个存储之后,我们数据库实际上只用记它的路径或者名称就行,如果我们的路径是通用的,那数据库就不用记路径,只用最后记它的名称就好了。
页面上要展示最后更新的时间和章节,有时候我们要考虑更远一点,我们去抓取数据的时候,能不能把这个章节数和章节名称分开,因为最后要保证它稳定,我们不可能只抓一个网站,最后挂了是吧。我们也不可能只抓起点,因为抓起点的话那个内容是抓不出来的,现在很多热门小说都有防盗是吧。那我们就要做个设计,把章节号暂时就认为它是一个字段,因为我们的重点是在更新的上面。那这样的话,为了能够增加一个短接口,又把这个LastChapterID,每天这个小说更新了几章会有个列表,有个定时任务。这个不是这期的任务,我们后面会不断往上扩展。
我们一个模块一个模块做,因为在公司做事情也是这样,一周任务给你布置下去,下个周任务给你布置下去,商业项目是很难一步做完的,比如像美团的外卖业务,它的开发团队这么多人,做了这么多年,还在不断往下去开发。商业项目和做课程体系的不一样,所以我们去公司实习也好,或者我们平时的工作内容也好,都是说这个要做哪些模块,哪些功能,这个才是我们简历上要写的一些亮点和你的真实的业务点。
有些同学说为什么用这个datetime不用timestep,这个也是一个很重要的一个面试题。什么时候用date time?一般数量不是很大的时候可以用它,因为这个我们可以直接去看后台,我们就可以看昨天有哪些人关注,我们可以很直接的看到这个时间,但你写time step用了一个时间戳,你会发现你就看不懂了,所以数量比较大的情况下就需要额外开发个后台。一般情况下,我们在用户量没那么大的情况下,我们就是用int,就是用datetime,道理都很简单,要讲道理,而不是说现在大部分课程因为他们也不懂,那些培训班出身的讲师,其实他们没有经过大数据量的项目的过程,所以他们也讲不清楚是为什么,但是实际上道理很简单。
再看看第二块,这个枚举值有五个,加个其他就有六种类型,那我应该做成枚举。很多同学可能上学的时候学过单枚举,但是在工作中喜欢用的是双枚举,或者是用这个ID值来做传输,有同学会说那为什么不放在数据库里面做个自典表?其实也可以,这两个的区别是自典表是说它也是长期不动的,但是它的数量比较大,你可以放在数据库里面,但是如果数量比较小的时候,也是很长时间不动的话那当然放在代码里面是最好的,因为这样你就不用再额外去读取数据库浪费性能了,这是最好的一个方式,所以我们会采用的这个这个方案。
我们下节课再去专门去看看这个接口的设计,参数是什么,返回值是什么,参数是什么等。
大家如果需要本节课的开发文档,可以去加入我们校招VIP的项目大群来获得。大家也可以走我们的在线实习模式,比如说推电影,推推,或者是押金班约起来,对于动手能力的锻炼跟课程还是有区别的,大家可以去关注校招VIP的小程序,去看看其他的项目,那么今天的课程就到这里,我们下节课再见。
标签:这个,Java,数据库,接口,VIP,更新,校招,我们,页面 From: https://www.cnblogs.com/rdaxue/p/17047391.html