目录

resume-3

52.dubbo

rpc框架和soa框架

rpc:支持各种传输协议,底层采用netty长连接进行传输

作为soa具有服务治理功能,提供服务注册与发现,使用zk作为注册中心

1.p启动时注册,2.c启动时订阅,3.变更时注册中心推送服务地址列表,4.根据路由策略选择一个地址进行调用,5.后台monitor定时采集调用信息。

53.描述一个服务从发布到备消费的详细过程

https://gitee.com/lienhui68/picStore/raw/master/null/20200902004924.png

54.分布式系统怎么做服务治理

服务降级、服务流控、服务动态扩展、超时控制、优先级调度、负载均衡策略调整、分组调整

55.幂等

对接口的调用无论执行多少次,产生的效果和返回的结果都是一样

56.消息中间件如何解决消息丢失问题

  • producer

    1.同步发送,2.事务消息

  • broker

    高可靠,一主多从,同步刷盘和异步刷盘结合使用

  • consumer

    ack确认,消息重试

57.分布式事务

  • 2pc,tm,rm

  • 事务消息+最终一致性

    http://img.cana.space/picStore/20210416170631.png

  • tcc

  • at/sega

58.如何实现负载均衡

负载均衡的分类有二层负载(mac地址),三层负载均衡(ip),四层负载均衡(tcp:ip+port),七层负载均衡(http)

实现四层负载均衡的软件有:

F5:硬件负载均衡器,功能很好,但是成本很高。 lvs:重量级的四层负载软件 nginx:轻量级的四层负载软件,带缓存功能,正则表达式较灵活 haproxy:模拟四层转发,较灵活

算法实现: 轮询、随机、加权轮询、hash、一致性hash

59.zk

文件系统+通知机制

60.分布式集群下唯一序列号

  1. 数据库 业务名称、最小值、最大值、当前值 select for update update 当前值=当前值+step
  2. uuid
  3. zk
  4. redis
  5. 雪花算法

61.乐观锁

  1. 数据库乐观锁 版本号
  2. redis 自旋 setnx getset key:userId
  3. zk 利用节点名称的唯一性来实现独占锁

62.mq

63.秒杀

https://www.jianshu.com/p/29030f0c71b4

后端如何解决

方案:本地标记+redis预处理+RabbitMQ异步下单+客户端轮询。

实现:

在秒杀阶段使用本地标记对用户秒杀过的商品做标记,若被标记过直接返回重复秒杀,未被标记才查询redis,通过本地标记来减少对redis的访问。

抢购开始前,将商品和库存数据同步到redis中,所有的抢购操作都在redis中进行处理,通过Redis预减少库存减少数据库访问。

为了保护系统不受高流量的冲击而导致系统崩溃的问题,使用RabbitMQ用异步队列处理下单,实际做了一层缓冲保护,做了一个窗口模型,窗口模型会实时的刷新用户秒杀的状态。

client端用js轮询一个接口,用来获取处理状态。

64.JVM 年轻代到年老代的晋升过程的判断条件

部分对象会在From和To区域中复制来复制去,如此交换15次(由JVM参数MaxTenuringThreshold决定,这个参数默认是15),最终如果还是存活,就存入到老年代。 如果对象的大小大于Eden的二分之一会直接分配在old,如果old也分配不下,会做一次majorGC,如果小于eden的一半但是没有足够的空间,就进行minorgc也就是新生代GC。 minor gc后,survivor仍然放不下,则放到老年代 动态年龄判断 ,大于等于某个年龄的对象超过了survivor空间一半 ,大于等于某个年龄的对象直接进入老年代

65.排查fullgc频繁

参考

首先查看gc日志,需要开启gc日志功能,看看回收率怎样

其次拉dump文件使用jmap,之后对dump文件分析,可以使用mat、jprofile等工具,查看是否有大对象,以及大对象是否合理,不合理则调整。

如果是一次fullgc后剩余对象不多,那么说明eden区设置太小;如果是一次fullgc后,old区回收率不大,那么说明old区太小。

1.业务上考虑,是否是流量变大

2.是否创建了比平时更多的对象

解决:

增加jvm的堆内存;增加perm或者metaspace内存;增加更多的jvm实例

65.1 线程dump

jstack和线程dump分析

频繁GC问题或内存溢出问题 一、使用jps查看线程ID 二、使用jstat -gc 3331 250 20 查看gc情况,一般比较关注PERM区的情况,查看GC的增长情况。 三、使用jstat -gccause:额外输出上次GC原因 四、使用jmap -dump:format=b,file=heapDump 3331生成堆转储文件 五、使用jhat或者可视化工具(Eclipse Memory Analyzer 、IBM HeapAnalyzer)分析堆情况。 六、结合代码解决内存溢出或泄露问题。

死锁问题、cpu使用率过高 一、使用jps查看线程ID 二、使用jstack 3331:查看线程情况

66.类的实例化顺序

  1. 父类静态成员和静态初始化块
  2. 子类静态成员和静态初始化块
  3. 父类实例成员和实例初始化块
  4. 父类构造方法
  5. 子类实例成员和实例初始化块
  6. 子类构造方法