resume-3
52.dubbo
rpc框架和soa框架
rpc:支持各种传输协议,底层采用netty长连接进行传输
作为soa具有服务治理功能,提供服务注册与发现,使用zk作为注册中心
1.p启动时注册,2.c启动时订阅,3.变更时注册中心推送服务地址列表,4.根据路由策略选择一个地址进行调用,5.后台monitor定时采集调用信息。
53.描述一个服务从发布到备消费的详细过程
54.分布式系统怎么做服务治理
服务降级、服务流控、服务动态扩展、超时控制、优先级调度、负载均衡策略调整、分组调整
55.幂等
对接口的调用无论执行多少次,产生的效果和返回的结果都是一样
56.消息中间件如何解决消息丢失问题
-
producer
1.同步发送,2.事务消息
-
broker
高可靠,一主多从,同步刷盘和异步刷盘结合使用
-
consumer
ack确认,消息重试
57.分布式事务
-
2pc,tm,rm
-
事务消息+最终一致性
-
tcc
-
at/sega
58.如何实现负载均衡
负载均衡的分类有二层负载(mac地址),三层负载均衡(ip),四层负载均衡(tcp:ip+port),七层负载均衡(http)
实现四层负载均衡的软件有:
F5:硬件负载均衡器,功能很好,但是成本很高。 lvs:重量级的四层负载软件 nginx:轻量级的四层负载软件,带缓存功能,正则表达式较灵活 haproxy:模拟四层转发,较灵活
算法实现: 轮询、随机、加权轮询、hash、一致性hash
59.zk
文件系统+通知机制
60.分布式集群下唯一序列号
- 数据库 业务名称、最小值、最大值、当前值 select for update update 当前值=当前值+step
- uuid
- zk
- redis
- 雪花算法
61.乐观锁
- 数据库乐观锁 版本号
- redis 自旋 setnx getset key:userId
- 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
频繁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.类的实例化顺序
- 父类静态成员和静态初始化块
- 子类静态成员和静态初始化块
- 父类实例成员和实例初始化块
- 父类构造方法
- 子类实例成员和实例初始化块
- 子类构造方法