2024面试题分享

一、技术类

1、你项目中的分布式系统如何保证请求的幂等性?

1)查询和删除不在幂等讨论范围,查询肯定没有幂等的说,删除:第一次删除成功后,后面来删
除直接返回0,也是返回成功。
2)建唯一索引:唯一索引或唯一组合索引来防止新增数据存在脏数据 (当表存在唯一索引,并发
时新增异常时,再查询一次就可以了,数据应该已经存在了,返回结果即可)。
3)token机制:由于重复点击或者网络重发,或者nginx重发等情况会导致数据被重复提交。前端
在数据提交前要向后端服务的申请token,token放到 Redis 或 JVM 内存,token有效时间。提交后
后台校验token,同时删除token,生成新的token返回。redis要用删除操作来判断token,删除成
功代表token校验通过,如果用select+delete来校验token,存在并发问题,不建议使用。
4)悲观锁
select id ,name from table_# where id='##' for update;
悲观锁使用时一般伴随事务一起使用,数据锁定时间可能会很长,根据实际情况选用(另外还要考
虑id是否为主键,如果id不是主键或者不是 InnoDB 存储引擎,那么就会出现锁全表)。
 
5)乐观锁,给数据库表增加一个version字段,可以通过这个字段来判断是否已经被修改了
update table_xxx set name=#name#,version=version+1 where version=#version#
6)分布式锁,比如 Redis 、 Zookeeper 的分布式锁。单号为key,然后给Key设置有效期(防止支
付失败后,锁一直不释放),来一个请求使用订单号生成一把锁,业务代码执行完成后再释放锁。
7)保底方案,先查询是否存在此单,不存在进行支付,存在就直接返回支付结果。

2、Nacos的服务注册发现原理是怎样的?服务注册表的结构是怎样的?注册一个服务的流程是怎样的?

1)服务注册:当一个微服务启动时,它会向Nac0s服务器发送一个注册请求,将自己的服务信息(如服务名、IP地址、端口号等)注册到Nacos服务器的服务注册中心。
2)服务发现:当一个微服务需要调用其他微服务时,它可以通过向Nac0s服务器发送一个服务发现请求,获取指定服务名的所有可用实例信息。Nacos服务器会从服务注册中心中查询到对应的服务实例列表,并返回给调用方。
3)服务健康检査:Nacos服务器会周期性地向微服务发送健康检査请求,以确定微服务是否可用。微服务可以根据收到的健康检查请求作出响应,同时也可以上报自身的健康状况给Nacs服务器,Nacos服务器会根据微服务的健康状况更新服务实例的可用状态,及时删除不可用的服务实例。
4)服务订阅与通知:当一个微服务需要订阅某个服务的变化(如新增或下线实例),它可以通过向Nacos服务器发送一个服务订阅请求来进行订阅。一旦有新的服务实例注册或下线,Nacos服务器会即时通知给订阅方,让其感知服务变化。订阅方可以根据收到的通知及时更新自己的服务实例列表。
综上所述,Nacos通过服务注册发现来实现微服务架构中的服务管理,提供了服务注册、服务发现、服务健康检查和服务订阅与通知等功能。这使得微服务之间的通信更加灵活和简化,同时也提高了整个系统的可靠性和可扩展性。

底层实现原理:https://blog.csdn.net/qq_45038038/article/details/134724228

3、Linux如何查询一个应用占用的磁盘和内存大小?

1)查询磁盘使用情况
使用 du 命令:

du -sh /path/to/application

这将显示应用目录的总大小。

使用 df 命令:

df -h /path/to/application

2)查询内存使用情况

使用 ps 命令结合 awk 和 sort:

ps aux --sort=-%mem | grep [your_application_name] | awk '{print $2, $4, $7}'

这将显示进程ID、内存使用率和进程的名称。

使用 top 或 htop 命令:

在 top 中,你可以按 %MEM 列来排序,找到你感兴趣的应用。
在 htop 中,你可以直接搜索应用名称,并查看其内存使用情况。

使用 /proc 文件系统:

cat /proc/[PID]/status | grep Mem | awk '{print $2, $4}'

将 [PID] 替换为你的应用进程ID。这将显示进程的RSS (Resident Set Size) 和共享内存大小。

3)查询特定进程的资源使用情况
如果你知道应用的进程ID (PID),你可以使用以下命令:

磁盘使用情况:

du -sh /proc/[PID]/fd/* | awk '{print $1}' | xargs du -h | sort -hr | head -n 10

内存使用情况:

cat /proc/[PID]/status | grep Mem | awk '{print $2, $4}'

将 [PID] 替换为你的应用进程ID。

4、SpringBean的生命周期?

SpringBean的生命周期是从Bean实例化之后,即通过反射创建出对象之后,到Bean成为一个完整对象,最终存储到单例池中,这个过程被称为Spring Bean的生命周期。

这个生命周期分为以下几个阶段:

1)实例化:Spring容器根据配置信息或注解创建Bean的实例。可以通过构造函数实例化,也可以通过工厂方法实例化。
2)属性赋值:在实例化后,Spring容器会将配置的属性值或注解中的属性值注入到Bean实例中。这个过程可以通过setter方法注入,也可以通过字段注入。
3)初始化:在属性赋值完成后,Spring容器会调用Bean的初始化方法。在这个阶段,可以进行一些初始化操作,如数据加载、资源准备等。
4)使用:在初始化完成后,Bean就可以被应用程序使用了。在这个阶段,Bean会被注入到其他Bean中,或者通过Spring容器获取并调用其方法。
5)销毁:当应用程序不再需要Bean时,Spring容器会负责销毁Bean。
以上内容仅供参考,更多详细信息可以咨询编程领域的专业人士或访问相关论坛。

 

5、Spring数据库事务的传播方式有几种,在A类里的M1方法里声明1个事务,然后再调用B类的M2带事务的方法,它们在事务链上是怎样保存的?REQUERY传播 的M2事务回滚后,M1事务会怎样?

总共有7种,分别是:

PROPAGATION_REQUIRED: 这是默认值。如果当前存在事务,那么就使用当前事务。如果没有事务,就新建一个事务。
PROPAGATION_SUPPORTS: 如果当前存在事务,则支持当前事务。如果没有事务,就以非事务的方式继续运行。
PROPAGATION_MANDATORY: 如果当前存在事务,则使用当前事务。如果没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW: 总是新建一个事务。如果当前存在事务,则挂起当前事务。
PROPAGATION_NOT_SUPPORTED: 运行非事务。如果当前存在事务,则挂起当前事务。
PROPAGATION_NEVER: 非事务地运行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED: 如果当前存在事务,则嵌套事务作为一个子事务运行。如果当前没有事务,则此行为等价于PROPAGATION_REQUIRED。

M1事务会怎样的详细试验代码:

https://zhuanlan.zhihu.com/p/436332667

总结在注解事务的方法内部捕获了异常则不会触发回滚,否则会进行回滚

6、项目引用了第三方包里的一个服务,这个服务里有一个S1方法有问题,如何查找出项目中哪些方法调用了S1方法?

在不修改第三方包代码的情况下,如何调整S1方法的代码?

7、业务架构、技术架构、部署架构,这三者的关系是怎样的?

8、让你创建一个租户规模1000万的SAAS应用,技术架构应该怎么做?

9、做项目的时候如何保证开发质量?

 

二、软实力

1、入职后接手一个旧项目开发,如果文档很少、没有人能帮助你了解,你应该怎么做呢?

 

  • 理解项目的目标与功能:首先,你需要深入了解项目的目标和主要功能。这可能需要对代码进行阅读,以及在可能的情况下与项目的早期开发人员交流。
  • 审查代码:代码是理解项目结构和功能的关键。从头到尾阅读代码可能是一项庞大的任务,但这是非常重要的。寻找项目的入口点,例如主函数或类,然后逐步深入。
  • 查看项目文件:检查项目的文档、邮件、会议记录和其他相关文件,以了解项目的开发背景和决策过程。
  • 尝试运行项目:尽可能频繁地运行项目,以便更好地理解其行为。当遇到错误时,尝试理解其背后的原因,这有助于理解代码的逻辑。
  • 与团队成员交流:尽管可能没有专人负责协助你,但与团队其他成员的交流仍然非常有价值。他们可能已经对这个项目有一定的了解,或者至少可以提供关于项目的一些线索。
  • 编写文档:一旦你对项目的结构和功能有了更好的理解,开始编写文档是个好主意。这不仅可以帮助你巩固理解,还可以为未来的开发工作提供便利。
  • 持续学习和探索:软件开发是一个持续学习的过程。随着你对项目的理解加深,你可能需要进一步学习新的概念和工具。
  • 请教导师或专业人士:如果有可能,找到一个经验丰富的开发者或导师,向他们请教和学习。这可以帮助你更快地适应新项目。
  • 保持积极的心态:接手一个没有充分文档化的项目可能会让人感到沮丧,但请记住,这是一个学习和成长的机会。通过解决挑战,你可以提升自己的技能和知识。
  • 定期回顾和计划:为自己设定里程碑和检查点,确保你在项目中取得进展。同时,为未来的工作制定计划,以便更有效地推进项目。

 

面对这种情况时,请保持耐心和开放的心态。通过不断的努力和学习,你将逐渐掌握这个项目的方方面面。

 

2、如果手头有很多工作,你如何确定先处理哪些事?     

当面临多件工作时,首先要确定优先级,以确保时间和资源得到最有效的利用。以下是一些建议来确定先处理哪些事情:

  • 紧急且重要的事项:首先处理那些既紧急又重要的事项。这些任务通常需要立即关注,因为它们对项目的进展或组织的成功有直接的影响。
  • 重要的事项:接下来处理重要但非紧急的事项。这些任务虽然不要求立即完成,但它们对组织的长期目标或项目的最终结果有关键影响。
  • 紧急的事项:如果存在一些紧急事项,但它们不直接对组织的成功或项目的最终结果产生影响,可以将其排在其他优先级较低的任务之前完成。
  • 优先级低的任务:最后处理优先级低的任务。这些任务通常是一些较小的、不重要的或可推迟的工作。
  • 评估和重新评估:在处理完紧急和重要的任务之后,重新评估剩余的任务,以确保合理安排时间和资源来完成其他任务。
  • 委托或寻求帮助:如果某些任务超出了你的能力范围或优先级,考虑将其委托给其他团队成员或寻求外部专家的帮助。
  • 计划和组织:使用项目管理工具、日程安排程序或其他组织工具来帮助跟踪任务、设置截止日期和提醒,以确保工作按计划进行。
  • 保持灵活性:在处理多个任务时,要保持灵活性,随时准备调整优先级或应对突发情况。

通过以上方法,可以更有效地管理多项任务,提高工作效率和质量。

3、项目需要加班,但是有人却不愿意加班,作为项目负责人你该怎么做?

作为项目负责人,面对有人不愿意加班的情况,首先要明确项目目标和期限,然后采取以下措施:

  • 沟通理解:了解他们不愿意加班的原因,是因为家庭、健康、其他工作等,还是对加班的看法有所保留。理解他们的立场,为他们提供支持和解决方案。例如,提供调休、支付额外工资或安排合理的工作时间。
  • 说明重要性:尽可能详细地说明项目的重要性,解释项目成功带来的益处。这可以激发团队成员的责任感和使命感,促使他们愿意为项目加班。
  • 合理安排加班:确保加班是必要的,并且尽可能控制在合理范围内。合理安排加班时间,避免过度劳累,确保团队成员在工作之余也有足够的休息和娱乐时间。
  • 提供激励:为了鼓励团队成员加班,可以提供一些激励措施,如额外的项目奖金、表扬或晋升机会等。
  • 求助上级:如果仍然无法解决问题,可以向上级领导求助。通过与上级沟通,寻求他们的支持和协助,共同解决团队成员不愿意加班的问题。
  • 考虑备选方案:如果有人持续不愿意加班,可能需要考虑其他备选方案。例如,寻找其他愿意加班的团队成员、外包或寻找其他合作伙伴来完成项目。

总的来说,需要理解、尊重团队成员的意愿和感受,同时也要确保项目的顺利进行。以上建议仅供参考,具体方法还需根据实际情况灵活调整。

题目的回答仅供参考,如果你觉得有更好的答案,欢迎在评论区留言、讨论                                                                                           

posted @ 2024-01-18 18:52  赛博朋克水管工  阅读(68)  评论(0)    收藏  举报