12.13面试题整理

1.Nginx的热部署
Ngnix中的进程分为两类,一类是master进程,一类是worker进程。   
其中master进程使用来管理监控控制其下边的worker进程的主进程,这个进程由root发起。其中原因是http这个服务需要启用80端口,而只有root才有权限启用80端口。
而顾名思义,worker进程才是真正working的进程,才是真正处理请求的进程。这些进程全部都是master进程的子进程。这些进程是以普通用户的身份进行运行的,这样就可以极大增加程序的安全性。就算是万一有一个进程被劫持,那也不会有管理员权限。
为什么nginx支持热部署,这和其并发模型有着密不可分的关系。说白了,就是因为master进程的关系。当通知ngnix重读配置文件的时候,master进程会进行语法错误的判断。如果存在语法错误的话,返回错误,不进行装载。    如果配置文件没有语法错误,那么ngnix也不会将新的配置调整到所有worker中。而是,先不改变已经建立连接的worker,等待worker将所有请求结束之后,将原先在旧的配置下启动的worker杀死,然后使用新的配置创建新的worker。
2.Redis和Mysql如何实现数据同步
队列同步,变跟数据2份,使用消息队列,一份给Redis消费,一份给Mysq消费。
后台定时任务,定时刷新Redis中箱格信息到数据库。
3.RabbitMq如何确保消息的发送和接受成功
发送方确认模式:
将信道设置成confirm模式(发送方确认模式),则所有在信道上发布的消息都会被指派一个唯一的ID。
一旦消息被投递到目的队列后,或者消息被写入磁盘后(可持久化的消息),信道会发送一个确认给生产者(包含消息唯一ID)。
如果RabbitMQ发生内部错误从而导致消息丢失,会发送一条nack(not acknowledged,未确认)消息。
发送方确认模式是异步的,生产者应用程序在等待确认的同时,可以继续发送消息。当确认消息到达生产者应用程序,生产者应用程序的回调方法就会被触发来处理确认消息。

接收方确认机制
接收方消息确认机制:消费者接收每一条消息后都必须进行确认(消息接收和消息确认是两个不同操作)。只有消费者确认了消息,RabbitMQ才能安全地把消息从队列中删除。
这里并没有用到超时机制,RabbitMQ仅通过Consumer的连接中断来确认是否需要重新发送消息。也就是说,只要连接不中断,RabbitMQ给了Consumer足够长的时间来处理消息。保证数据的最终一致性;
下面罗列几种特殊情况:
如果消费者接收到消息,在确认之前断开了连接或取消订阅,RabbitMQ会认为消息没有被分发,然后重新分发给下一个订阅的消费者。(可能存在消息重复消费的隐患,需要去重)
如果消费者接收到消息却没有确认消息,连接也未断开,则RabbitMQ认为该消费者繁忙,将不会给该消费者分发更多的消息。

4.讲一讲JVM(GC,执行过程顺序)
GC的工作流程主要分为如下几个步骤:
1、标记(Mark)2、计划(Plan)3、清理(Sweep)4、引用更新(Relocate)5、压缩(Compact)
编辑源码、编译生成class文件、(加载class文件、运行class字节码文件),其中后两个步骤都是在jvm虚拟机上执行的。
5.使用过线程池吗?在哪里用了
redis中把用户订单那些搬回真实数据库-用的是缓存线程池
请求削峰-当时下游服务 定量处理队列中请求 为了高效率 不也是用线程池并发处理的吗?
6.HashMap的底层原理
哈希表
数组+链表+红黑树
JDK1.7表头和JDK1.8表尾是不一样的
7.什么是ZooKeeper
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务
是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件
8.TCP的三次握手和四次挥手
三次握手
(1)建立连接
(2)服务器收到请求后,确认数据包
(3)客户端收到数据包,连接成功
四次挥手
(1)客户端关闭
(2) 服务器收到客户端关闭
(3) 服务器关闭
(4) 客户端收到服务端关闭
9.SpringCloud以及相关子项目
SpringCloud分布式微服务一站式解决方案
Eureka服务注册于发现
Ribbon客户端负载均衡工具
Feign 更加面向对象的负载均衡
SpringCloud Bus 消息总线
SpringCloud Config 统一配置文件中心
Hsytrix 断路器
10.讲一讲Mysql的优化
分析:sql慢的原因
1.并发量大
缓存,考虑有的访问能不能不从数据库中剔除掉,热点数据用redis缓存
ElasticSearch搜索引擎没有有效期
连接数过多,我们选择搭建集群,MyCat数据库中间件,读写分离,分表分片规则
2.数据量大
sql语句的优化
数据类型
索引优化
读写分离
分片
落地:
准备大量数据 insert into select
实施优化方案,
1.使用慢查询,筛选需要优化的sql语句
2.索引,提高查询速度
3.分片
4.分离,将经常查询的数据存储到缓存中间件中
5,总结
11.FastDFS怎么用
分布式文件服务器
12.讲一下Object类中的常用方法?
Equals()
HashCode()
Wait()
Notify()
getClass()
toString()
13.什么时候回出现栈溢出
栈溢出抛出java.lang.StackOverflowError错误,出现此种情况是因为方法运行的时候,请求新建栈帧时,栈所剩空间小于战帧所需空间
例如,通过递归调用方法,不停的产生栈帧,一直把栈空间堆满,直到抛出异常
14.Maven项目中的install和package的区别
所以package 只是打包到target下, install是打包安装到我的本地maven仓库。deploy: 打包到私服

猜你喜欢

转载自blog.csdn.net/qq_42629110/article/details/84995913