[关闭]
@boothsun 2018-05-01T10:41:39.000000Z 字数 1603 阅读 1400

日常场景面试准备

面试题


RPC框架

远程调用,往往是伴随着微服务化改造的过程产生的。

RPC框架原理

image.png-40.9kB
image.png-70.1kB

简单RPC框架用到的技术:

  1. 动态代理:本地方法调用,其实是走到了代理类对象中。代理类对象中invoke方法屏蔽了网络通信细节。
  2. 网络通信:TCP连接 框架:Netty
  3. 线程池:服务端接收到RPC请求后,可以包装成一个Thread,交由线程池处理。
  4. 反射:服务端接收到远程调用的接口全限定名,然后找到其具体的实现类,然后反射调用指定方法。
  5. 序列化 反序列化:参数与返回值的序列化与反序列化。

ZK注册中心在RPC框架中的作用

服务端在启动时 可以按照指定格式在ZK上创建节点临时节点,连接断开后,节点自动删除。

客户端在方法调用时,可以先从本地缓存中查询服务端IP和端口,查找失败,即向ZK注册中心查找。查找到时,可以对该目录节点建立一个watcher监听 监听删除或者新增事件。 监听到删除事件时将 该节点从可用列表中清除。监听到新增事件时,去注册中心再拉取一次最新服务提供者列表信息。

流控

分流、降级、限流

分流

负载均衡算法,英文名称为 Load Balance,通过某种负载分担技术,将外部发送过来的请求均匀分配到对称结构中的某一台服务器上,而接收到请求的服务器独立地响应客户端。

  1. 轮询法:挨个调用。服务器编号,变量递增依次取出可用服务器列表。
  2. 随机法:系统随机函数,随着调用量的增大,其实际效果越来越近乎平均流量分配。
  3. 哈希法:获取客户端的IP地址值,通过哈希函数计算得到一个数值,用该数值对服务器列表的大小进行取模计算,得到的结果便是要访问的服务器序号。
  4. 加权轮询。
  5. 加权随机。
  6. 最小连接数法:

限流

  1. 前端Nginx限流或tomcat配置限流
  2. Guava的 Rate Limit限流:令牌算法(匀速生产)、漏桶算法(匀速消费) 流量整型 突增流量
  3. JDK 自带的 Semphore限流。
  4. Redis + LUA 脚本
  5. 线程池

应用级限流:
1. 限流总并发或连接数
2. 限流总资源数:线程池。
3. 限流某个接口的总并发数或请求数。:AtomicInteger Semphore
4. 限流某个接口的时间窗口请求数:过期清除(redis java 定时线程池 guava的本地缓存)
5. 平滑限流:Guava的令牌算法和漏桶算法。SmoothBursty:平滑限流 令牌算法 和平滑预热限流(SmoothWarmingUp 流速是梯形递增的 冷启动时会以一个比较大的速率慢慢达到平均速率,然后趋于平均速率 梯形下降到平均速率)实现。
6. 分布式限流:redis + LUA 或 Nginx + LUA

降级

自动降级:
1. 超时或者接口故障降级:不展示 或者 展示默认数据 缓存数据 或者同步改异步(下单 黑名单校验,服务异常,改由后台异步校验黑名单,在做补偿)
2. 统计失败次数降级:收银台三方支付渠道,那个服务失败次数多,就把他往下隐藏。
3. 限流降级:排队等待页面、错误页等。
4. 读写降级:读兜底数据 默认数据,或者不读 直接进入错误页 或者页面静态化。
5. 写服务降级:写DB,再写Redis,假如Redis 性能故障,还有异步写Redis。MQ 定时JOB等,最终数据一致性,
6. Hystrix 熔断,健康度统计。

人工降级:
1. 配置中心 打开降级开关。
2. 摘除集群。

MQ

  1. 乱序:消息编排、丢弃旧消息。
  2. 去重:messageId、业务唯一标识、业务方传入一个唯一ID

分库分表(已完成)

蓄水池抽样。(已完成)

  1. 抽样对账
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注