天眼查-面试题

一面

1.项目中的难点

  1. orgagent的线程隔离
  2. 机构的流程配置化

2.MySQL

  1. MySQL的索引结构?

    B+树

  2. B树和B+树的区别

    • B树的每个结点都存储了key和data,B+树的data存储在叶子节点上

      节点不存储data,这样一个节点就可以存储更多的key。可以使得树更矮,所以IO操作次数更少

    • 树的所有叶结点构成一个有序链表,可以按照关键码排序的次序遍历全部记录

      由于数据顺序排列并且相连,所以便于区间查找和搜索。而B树则需要进行每一层的递归遍历。相邻的元素可能在内存中不相邻,所以缓存命中性没有B+树好

  3. 描述下可重复读和不可能重复读

    同一个事务中发起多次查询,每次读取到的数据相

    同的,无论其他事务有没有对数据进行修改,当不影响当前事务的读取

  4. 描述下MVCC

    MVCC是多版本并发控制,是为了解决InnoDB中的不可重复读现象

    通过把undo log,将所有事务的修改串联成一个版本链,当读取数据时根据read view来判断哪个版本的数据是自己可以读取的

3.GC

  1. 项目中使用的垃圾回收器

    CMS + ParNew

  2. CMS的四个阶段

    • 初始标记(STW)
    • 并发标记
    • 重新标记(STW)
    • 并发清除

4.Redis

  1. redis在项目中的应用
  2. 分布式锁是如何实现的
  3. setnx 为什么要设置超时时间

5.RPC

  1. RPC中都有哪些组件

    基础功能

    通信协议:协议头、协议体、可变协议

    序列化:JDK、JSON、Hession、Protobuf

    网络IO模型:阻塞IO、IO多路复用

    动态代理:JDK动态代理、CGLIB

    服务相关

    服务发现:服务注册、服务发现

    健康检查:检查服务状态、心跳机制、客户端请求成功率

    路由策略:做灰度、全链路灰度等

    服务分组:服务之间进行隔离,彼此不影响

    负载均衡:随机权重、轮询权重

    异常重试:客户端根据指定的异常进行充实

    优雅起停:停止由外到内,启动由内到外

    熔断限流:服务端限流、降级,客户端熔断

    高级优化

    异步RPC:压榨服务的吞吐量

    链路追踪:全局链路跟踪

    动态分组:

    泛化调用:

6.TCP

滑动窗口

7.算法

1
2
3
4
5
6
7
[3,3,4,4,5,5,7,1,1,2,2]

1、数字都是两个两个出现,相等的数一定在相邻的位置
2、有且仅有一个数字落单
3、不会出现三个及三个以上的数相等

写一个算法,定位出落单数的下标

二面

1.API机构线程隔离

  • 机构间Http互相影响

2.API机构差异配置

  • 流程配置
  • 组件配置

3.MySQL

  • redo log
  • bin log

4.Redis

  • 热key的发现与处理
  • 大量key过期导致redis服务卡顿

5.JMM

  • 并发问题的产生原因

6.Java

  • 线程池创建核心线程的流程
  • 项目中线程池的配置,拒绝策略使用什么

7.JVM

  • 用的什么收集器
  • 卡表
  • JVM层级的监控有没有(老年代比例、GC次数等参数监控)

8.限流算法

  • 漏斗
  • 令牌桶(实现简单的令牌桶)

三面

1.实现一个服务治理框架,初期的选型工作都要做哪些?

2.使用的框架出现了难题,找不到好的解决方案怎么办?

3.Kakfa

  • 如何做到高吞吐量
    • 顺序写
      • SSD还有必要顺序写吗
    • 零拷贝
      • mmap和sendfile
    • 批量发送
      • 客户端如何做到批量发送
    • Reactor
  • 如何做到低延迟

4.Redis

  • key过期策略
    • 25%是静态参数,还是动态调整的
  • redis主从切换
    • 主从切换的过程
    • 客观下线和主观下线的区别

5.如何保证服务稳定性,四九9,一个5,SLA

  • 资源监控
  • 服务监控
  • 业务监控

6.十个人十把椅子

有1-10号椅子,1-10号人,第N个人坐第N把椅子的概率是多少