项目经验面试题总结

12/12/2023

[toc]

# 项目经验面试题总结

# 当发现服务器的CPU占用过高怎么办?

这道面试题主要是部署运维方面的。

问题要点:

  1. 如何查询Linux服务器的CPU占比情况?
  2. 如何定位到产生问题的Java代码所在线程是什么?
  3. 如何判断出当前问题线程到底在执行什么方法?

① 通过TOP命令找到占用CPU高的Java进程

java_20231212140704.png

② 通过jps -lv命令可以查询所有的java进程和所属的java服务。

jps -lv
1

③ 通过top -H -p 进程号命令可以查询进程中线程的使用情况。

# 可以查询出进程中占用CPU高的线程
top -H -p 8432
1
2

由于Java是多线程程序。可以通过这个命令,找出CPU占用过高的java线程。

④ 通过jstack命令,打印出线程具体信息。

## 输出线程ID为8432的信息,到info.log文件中
jstack 8432 >> info.log
1
2

⑤ 打开刚刚生成的日志文件info.log。并在日志文件中,通过16进制的线程ID号。来定位线程正在执行的方法是什么。

## 先通过下面的命令,将线程ID号转换为16进制。
printf "%x\n" 8432

## 然后打开日志文件。在日志文件中根据16进制的线程ID号,来搜索。
1
2
3
4

# 项目技术使用方面

# 你在面试开发中遇到的最难的问题是什么?

我觉得我自己在开发中遇到最难的问题是上手。如果你中途接手一个项目,由于你不熟练,那么最难的就是交接。特别是没有文档,或者文档不全的情况下。你要接手项目就需要大量的测试,或者问别人。

# 你项目中的redis的怎么用的?

在门户子系统中,有多个地方都用到redis。

  • 例如即时消息模块中,我们用list类型数据缓存用户之间的聊天记录到redis中,并针对redis进行持久化。
  • 在工作台模块中,会把用户收藏的菜单,代办事项等数据缓存到redis,并持久化。
  • 在用户模块中,会把用户的基本消息,用户所属角色信息,用户可访问菜单信息缓存到redis,并持久化。
  • 在权限模块中,会全表查询一遍,子系统信息,组织机构信息,菜单信息,都缓存到redis中。
  • 对于各种分页数据,我们可以把这些分页数据也缓存到redis中,可以用zset类型数据缓存分页数据。其中key名为:user:page:{pageNum},表格数据的id作为分数用于排序。

分页表格数据的redis缓存方案

查询分页数据,然后user:{id}的形式缓存到redis中,再次查询分页数据的时候,计算出要查询的是哪些,然后再从redis中取出来。如果某个数据更新了,那就单独再redis中删除这条数据。下次再查询,就追加到redis缓存中。

如果保持缓存与数据库的数据一致性?

推荐的方案:先更新数据库,再删除缓存的方案,并配合消息队列的方式。

  • 读请求首先读缓存,如果缓存中不存在,再从数据库中读取,并更新到缓存。
  • 写请求只写数据库。修改数据后,删除对应的缓存。
  • 写入缓存中的数据,根据不同的缓存数据,设置不同的过期时间。

# 你项目中是怎么用RocketMq的?

在文件模块中,如果文件发送成功,会会发送一条单向消息去通知接收方。 在xx子系统中,当办理业务的时候,会进行业务的办理日志。此时可以通过mq来把业务办理消息发送到mq中,提供给日志中心进行消费。日志中心会把业务办理记录存储到数据库中。

# 如何保障接口幂等性问题?

接口幂等性是指多次执行同一操作的结果与单次执行该操作的接口相同。简而言之就是如何防止接口被多次重复调用的问题。

  • 对于需要保障幂等性的接口,调接口时传入唯一请求ID。
  • 在后端接口中增加请求ID校验逻辑。确保接口不会重复调用。可以通过redis存储已调用的请求ID。
Last Updated: 4/9/2024, 12:00:09 AM