黑马头条面试问题 汇总

1、项目介绍

ps:面试官让你做项目介绍,如下的 所有 内容都可以 说。如果让你做简单的介绍,那么 只要说 前3个 即可。

这是一个什么类型的项目(或产品)?产品主要面向哪方面用户?

这是一个新闻资讯类的APP,平台主推 类型的资讯文章,主要面向 类型的用户群体。

平台会有自营自媒体号、自由自媒体人、签约自媒体人。

PS:1、需要结合自身情况,选择一个市面上存在的APP,根据选择的产品做适应性回答

PS:2、具体是外部项目还是公司自主项目,需要结合自身工作经历做适应性回答

项目是如何盈利的?

1、平台会有具体的商业模块,比如:广告、软文、内容经济、打赏、排名推广等;(PS:需要结合自己选择的产品

2、平台也会长远角度思考:留存用户保发展,用户即价值、用户数据及资本,有了用户,分析出用户偏好习惯,就可以转化非常大的商业价值;

大体有哪几个系统?

主要分为(三大系统):

  • 自媒体端(PC端的后台)
  • 平台后台管理端(PC端的后台)
  • 用户APP端( 安卓 & IOS (PS:结合产品))

具体服务:

平台admin、自媒体、文章、页面静态化服务、商业、评论、搜索、推送、实时计算、智能分析、爬虫、分布式任务调度xxl-job-admin、各系统网关服务、配置中心注册中心nacos、 skywalking、告警服务等。(PS:描述是一回事,自己负责的模块又是另外一回事,所以尽管说

介绍一下核心功能?

自媒体端:发布文章、管理文章、素材库、粉丝管理、处理留言、资产模块、个人资料模块、评论管理模块、商业操作 模块等;

平台后台:自媒体资质审核、实名认证管理、资讯审核、商业广告管理、网站数据、频道、敏感词等;

用户APP端:搜索文章、查看详情、广告栏、打赏、点赞、评论文章、关注、推荐栏、实名认证等;

项目的技术架构是什么样的?

SpringCloud 微服务架构,Mybatis plus 数据层访问技术,有用到 微服务网关、nacos注册配置中心、xxljob 分布式定时任务、Kafka及KafkaStream消息队列跟实时流计算、全文搜索技术ES、缓存Redis技术、MySQL、MongoDB等。

多少人开发?开发了多久?

PS:关于这个问题,外包跟公司自己产品开发 完全是两码事。(结合项目适应性回答

时间周期:

外包:

  1. 传统的开发方式,会有具体的项目开始跟结束节点,就算分多期,每期也会有具体的时间节点。
  2. 可分3期:一期核心功能开发、二期附加功能开发、三期调整优化、迭代需求。
  3. 每期大致2个月时间(包含开发、测试、上线)。

自己公司产品:

  1. 敏捷开发,快速迭代,不断优化产品,调整市场方向,调整商业策略。
  2. 如果你们公司没有其他产品并行产出,那么当前这个产品的开发周期就是你任职的时间。

开发人员:

  1. 外包:技术团队15人(开发7-9、测试1-2、运维1、项目经理1、产品+设计1-2)以内(产品肯定是**一个不那么大**的工程)。
  2. 前端(PCAPP(安卓 ios)、官网):后端(计算、推荐、数据库、微服务) = 1:1

自己公司产品:(产品肯定是一个稍具规模的工程)。

  1. 技术团队人数(**看具体产品**)建议值:25人以内(**自己公司产品初创型团队**),产品+设计2-4人,运维1-2人、测试2-3人,技术总监兼架构1人,其余开发
  2. 前端(PCAPP(安卓 ios)、官网):后端(计算、推荐、数据库、微服务) = 1:1

你负责了哪些模块?

核心模块:

1、自媒体端文章保存-审核-自动发布流程

自媒体人保存文章并发布 -> kafka 消息 -> 异步进入自动审核流程 -> 幂等校验是否已经审核,是否需要再审核,如果不需要则直接确认消息 -> 平台端敏感词匹配(DFA算法需要了解,敏感词库需要加载到程序内存map缓存) -> 阿里云 云盾 服务(图片检测、文本检测)-> 通过、不通过(记录原因驳回)、review(转人工再审) -> 若通过则进入发布流程 -> 是否到达发布时间 -> 如若未到达,则结合 xxl-job 做定时发布(1分钟一次扫描审核通过待发布并且已经到达发布时间的文章)-> 进入发布流程细节 -> kafka异步消息 ->1、 搜索服务,增量索引文章数据到ES(文章标题、封面图、作者信息、发布时间);2、用户端文章服务,将文章数据从自媒体端同步过来;3、页面静态化服务,将文章详情数据跟文章详情HTML模板执行页面静态化程序生成完整的文章详情html文件保存到文件服务器(可以参考,课程中是直接查询的数据库未使用页面静态化)。

2、ES文章搜索

ES搜索功能是二期上线的功能,考虑到一期有已经上架的留存文章,所以在es搜索服务上线后,先用一次性脚本,对MySQL用户端已发布上架的文章做一次全量同步,索引文档到资讯文章索引库。主要字段:文章标题、封面图片、作者信息、发布时间。然后在文章发布阶段,会对具体发布的文章做增量同步索引。具体搜索,会用ES QueryString 根据用户输入关键字分词匹配 文章标题及作者,根据匹配度得分,分页输出匹配到的结果列表。然后在列表点击文章就可根据文章id找到对应的静态化html文件,展示文章详情,还会调用一些动态数据接口,获取文章点赞、评论、或侧边栏推荐、广告等数据。

3、热点文章计算

主要分为两个具体流程

  1. 利用xxl-job 每天凌晨1点对前5天发布的文章按批量计算。计算文章热度得分,排序,取热点文章存Redis
    具体:查询出各个频道(已开放频道)下前5天发布的文章数据,利用多线程技术(线程池),根据该文章对应的用户行为数,按不同的权值得分(一次点赞5分、一次收藏10分…)分别计算每篇文章的得分数(用单线程挨个计算耗时较久,这里用线程池),利用CountdownLatch等待所有得分计算完成,由于需要按计算出的得分排序,所以需要实现 Comparable接口重写compareTo方法,用文章的 热度得分 进行 比较。然后将 每个频道下的文章进行排序,取前50条,存储到Redis Zset结构中。

    1. 利用kafka stream 根据 用户对文章产生的 实时行为数据做实时流计算。计算文章热度得分,比较Redis最低得分,更新Redis热点文章。

具体:用户对于文章的行为操作数据,会利用kafka消息队列,发送消息(1001,1(1代表点赞、2代表收藏…)) 传递到 实时流处理器,处理器接收到 数据后,会开启 10s的时间聚合窗口,每10s一次聚合,然后将kv合并成新key后进行分组统计,会得到(1001,{type:1,num:3})— 文章1001在这10s内被点赞了3次这样的聚合后数据,然后下游会根据聚合结果按不同的权值进行计算,累加当前文章的当前热度得分,然后跟所在频道下的redis zset中最小的得分进行比较,如果大于最小得分,则替换掉。(如果已经存在则更新得分即可),然后 类实时 更新 当前文章的 被点赞次数、被收藏次数…

还有做其它模块吗? —— 如何回答?

还做了许多其它的后台模块,如 平台后台端 频道管理、敏感词管理、用户管理、用户审核、文章人工审核、网站数据、爬虫文章库管理等,基本上都是一些业务不是特别复杂的CRUD操作,大量的搬砖工作,没有太多技术含量,较简单,对于这些模块,自己可以独立分析需求独立定义接口实现具体业务开发。

2、项目模块实现相关问题

分布式事务问题

实名认证审核通过,更改审核状态,同步创建用户端文章作者信息,创建自媒体人账户信息。需要考虑多数据源的事务问题。项目中用的是alibaba seata解决分布式事务的问题,@GlobalTransactional 事务注解,配置 seata使用相关配置文件及Java配置类。由于seata AT模式全局事务一阶段数据库本地事务已经提交, 使用seata还需考虑全局事务是否会引起其它业务访问数据的脏读脏写问题,需要使用seata全局锁,具体使用 是 解决脏读,在查询时 + for update代理,并在具体的业务方法上使用 @GlobalLock+@Transactional事务注解,解决脏写,则是直接在具体的业务方法上加@GlobalTransactional全局事务注解。

用户认证JWT问题

优点:分布式环境的认证解决方案的一种,无需考虑session共享问题;服务端无需存储用户认证后的信息,全部交由jwt返回客户端,让客户端每次请求携带;有签名机制,同样可以保证相对安全,用户身份信息无法被恶意篡改。

缺点:客户端每次请求都需要携带,会占用一些网络资源;由于全权交由客户端,那么一旦颁发很难收回,比如用户退出登录(注销),只能从客户端操作移除或不再携带jwt,或者只能等待它超时过期。由于服务端未记录用户认证信息,无法判断用户是不是多个客户端同时登录,可能出现多客户端同时登录同一账号的场景。(解决方案,服务端Redis存储认证后的信息并跟用户id、设备识别号、ip地址绑定,用于判断用户是否是多客户端登录,也可以做到有效提醒用户是否存在密码泄露的风险 )

https://www.jianshu.com/p/061aa65d9943

其它内容点结合课程 自行补充…

3、项目业务技术点挖掘

1、联想(热搜)词,异步收集保存用户搜索记录,异步利用kafka stream进行热搜词计算,联想词 基于搜索树(hash搜索树)实现;

2、采集用户行为数据,结合智能分类算法,推送用户感兴趣的资讯内容(每个用户不一样),需要对用户分类、画像、然后需要使用推送、队列存储等技术;

ps:(了解并存在这个功能,不是我做的具体推荐,我这边负责采集用户行为数据,发送消息数据)

3、平台端 定时任务 结合 爬虫程序 爬取 其它平台咨询内容,平台端自媒体自营号会使用爬去内容,编辑、重排等操作实现 咨询内容 人工转化 或 自动转化;

4、项目开发部署相关

ps:检测你是否真正有过开发经验

  • 项目开发流程

    需求评审会议 -> 各小组认领任务 -> 任务拆解 -> 排期 -> 创建任务卡片 -> 认领任务(或分配)-> 前后端拆分接口、定义接口文档 ->

前后端并行开发 -> 自测 -> 联调(过冒烟测试用例)-> 提测 -> 协助测试修复Bug -> 上线部署(协助上线)-> 线上监测(存在问题会及时处理,暂时无法处理及时回滚)。

  • 项目管理工具

    禅道敏捷开发任务看板Leangoo、Teambition、ONES 等(需求管理、任务管理、Bug管理),代码托管工具 Git(公司自建gitlab 或 alibaba 代码托管平台或码云)。

其它工具:

API接口文档 swagger 、knife4j、YApi、rap2接口管理平台等。

公司内容共享平台:wiki(多人协作的写作系统)

  1. confluence——https://blog.csdn.net/m0_37499059/article/details/81220649、
  2. amWiki轻文库——[http://amwiki.org/doc](http://amwiki.org/doc)
  • 项目如何部署

    该项目是 springcloud 微服务架构,采用 jenkins 持续集成方案,整合 git、maven、docker等组件,基于dockerfile 构建docker镜像,利用jenkins总控实现项目部署。

  • 服务如何监控及告警

    skywalking

基于 java agent 实现 ,字节码层面做织入增强,对代码开发透明无侵入。

可以查看 服务调用情况、接口耗时情况、数据库访问情况、服务调用网络拓扑图、配置告警策略。有告警服务接收告警信息,发送告警邮件。

SpringBoot Admin 结合 SpringBoot actuator 对 具体 SpringBoot 服务做 JVM 及 线程层面的详细监控。

  • 你们测试是如何测试的

    写测试脚本,自动化测试(python);

产品功能测试;(人工手动)

性能测试、压力测试 Jmeter —— https://www.cnblogs.com/monjeo/p/9330464.html

5、项目开发过程中碰到了哪些问题如何解决的?

(先扣扣脑袋…)

1、在使用seata的过程中,由于数据库某个字段 用的 是 TINYINT(1)然后Java类中用的是short类型,被seata误判为 boolean类型,导致 分布式事务 全局回滚时 就 当前这个 服务对应的数据库事务 未成功回滚。解决方案,将状态字段 从TINYINT 改成INT后生效。

(然后,还有….再扣扣脑袋)

2、Long类型字段响应前端后,js端Long类型精度丢失。解决方案:修改json序列化机制,将long、Long类型序列化为字符串响应前端。

3、其它的,还有很多,一时想不起来了。比如 MySQL生成环境RC跟开发环境RR的区别,会导致间隙锁失效,某些场景有并发问题。比如Spring方法嵌套调用时可能导致声明式@Transactional事务失效(代理增强失效),可以改用编程式事务。比如JVM相关的调优问题,服务宕机解决方案、大量time_wait解决方案。

希望大家灵活处世,外圆内方,博学多才,厚积薄发。切勿死板硬套!