微博一面:RPC怎么做零呼损?

发布时间 2023-09-13 08:44:05作者: 疯狂创客圈

文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 :

免费赠送 :《尼恩Java面试宝典》 持续更新+ 史上最全 + 面试必备 2000页+ 面试必备 + 大厂必备 +涨薪必备
免费赠送 :《尼恩技术圣经+高并发系列PDF》 ,帮你 实现技术自由,完成职业升级, 薪酬猛涨!加尼恩免费领
免费赠送 经典图书:《Java高并发核心编程(卷1)加强版》 面试必备 + 大厂必备 +涨薪必备 加尼恩免费领
免费赠送 经典图书:《Java高并发核心编程(卷2)加强版》 面试必备 + 大厂必备 +涨薪必备 加尼恩免费领
免费赠送 经典图书:《Java高并发核心编程(卷3)加强版》 面试必备 + 大厂必备 +涨薪必备 加尼恩免费领

免费赠送 资源宝库: Java 必备 百度网盘资源大合集 价值>10000元 加尼恩领取


微博一面:RPC怎么做零呼损?

说在前面

在40岁老架构师 尼恩的读者交流群(50+)中,最近有小伙伴拿到了一线互联网企业如微博、阿里、汽车之家、极兔、有赞、希音、百度、网易、滴滴的面试资格,遇到一几个很重要的面试题:

  • RPC怎么做无损升级?

  • 微服务发布的时候,RPC怎么做零呼损?

与之类似的、其他小伙伴遇到过的问题还有:

  • 微服务升级时,RPC里怎么避免调用方业务受损呢?

所以,这里尼恩给大家做一下系统化、体系化的梳理,使得大家可以充分展示一下大家雄厚的 “技术肌肉”,让面试官爱到 “不能自已、口水直流”

也一并把这个题目以及参考答案,收入咱们的 《尼恩Java面试宝典PDF》V108版本,供后面的小伙伴参考,提升大家的 3高 架构、设计、开发水平。

注:本文以 PDF 持续更新,最新尼恩 架构笔记、面试题 的PDF文件,请从公众号 【技术自由圈】获取。

本文目录

场景分析

微服务架构中,线上跑着几十个,甚至上百的微服务。

服务实例之间,有着错综复杂的RPC调用关系。

这些服务实例,归属到不同的小分队进行开发、设计、维护。

问题是:

在其中部分服务实例重启、升级的过程中, 怎么做到让微服务RPC调用方系统不出问题呢?

确保RPC零呼损的维度

如果要确保RPC零呼损, 至少可以从以下两个维度进行规避:

  • 维度一: rpc client 维度
  • 维度一: rpc server 维度

rpc client 维度零呼损的有效措施是:重试

rpc server 维度零呼损的有效措施是:优雅启停

rpc client 维度的零呼损:重试

rpc client 在发生错误的时候,可以进行 服务实例的 重试。

常见的rpc框架如 OpenFeign 框架就有重试几次、重试间隔这样的参数。

当然,如果希望通过重试的机制,让RPC零呼损,那么要保证升级的时候,还有健康的实例可用。

不能所有的微服务实例都同时升级,从而同时不可以使用,这样的话,重试也没有意义。

所以,重试措施最好配套对应的线上滚动升级/滚动发布、或灰度升级/灰度发布等类似的策略。

rpc server 维度的零呼损:优雅启停

优雅启停包括:

  • 优雅启动
  • 优雅停止/优雅下线

优雅启动

优雅启动,当微服务实例真正完成启动,甚至完成预热之后,真正具备处理rpc请求能力的时候,再将实例自己注册到注册中心。

为啥要优雅启动呢?核心原因是: 避免了RPC请求发进来,没有完成启动流程的微服务实例却无法处理。

优雅启动的流程,还包含JVM预热的流程,有关JVM预热的方案,请查看尼恩的上一篇文章:

微博一面:JVM预热,你的方案是啥?

优雅停止/优雅下线

在服务下线前,先通过“某种方式”把要下线的实例从调用方维护的“健康列表”里面删除就可以了,这样负载均衡就选不到这个节点

这个操作,一般来说,都是依赖注册中心完成的。

当服务提供方关闭前,先通知注册中心进行下线,然后通过注册中心告诉调用方进行节点摘除 。

如上图所示,整个关闭过程中依赖了两次 RPC 调用:

  • 一次是服务提供方通知注册中心下线操作
  • 一次是注册中心通知服务调用方下线节点操作。

需要注意的是: 两次通知都是异步的,只保证最终一致性,并不保证强一致性。

这个中间,有一定的时间周期,所以,如果要做到应用无损升级, 需要在发出通知之后,隔一段时间,再把服务实例正式关闭。

优雅停止/优雅下线的简单流程

  1. 下线实例在注册中心进行注销,注销该实例元数据信息;
  2. 注册中心节点元数据更新周期为15s,调用方在感知注册中心实例变更后,更新本地缓存服务地址,不再将流量路由到下线实例,期间保障业务无中断;
  3. 下线实例等待30s(2个心跳周期)后,进行实际下线操作;

优雅停止的总结:优雅停止是当微服务快要下线的时候,先从注册中心进行去注销,然后把接收到的RPC调用消息,处理完毕后,再彻底关闭。 通过优雅停机,可以有效地防止升级期间,发送到老节点的呼损。 需要注意发送下线通知,到正式下线之间的时间间隔。

确保RPC零呼损的维度

如果要确保RPC零呼损, 至少可以从以下两个维度进行规避:

  • 维度一: rpc client 维度
  • 维度一: rpc server 维度

rpc client 维度 的核心策略是重试

rpc server 维度 的核心策略是 优雅启停

两个维度都不可或缺,都需要实现。

说在最后

RPC 相关面试题,是非常常见的面试题。

以上的内容,如果大家能对答如流,如数家珍,基本上 面试官会被你 震惊到、吸引到。

在面试之前,建议大家系统化的刷一波 5000页《尼恩Java面试宝典PDF》,并且在刷题过程中,如果有啥问题,大家可以来 找 40岁老架构师尼恩交流。

最终,让面试官爱到 “不能自已、口水直流”。offer, 也就来了。

参考文献

https://blog.csdn.net/Weixiaohuai/article/details/125391957

https://www.cnblogs.com/daoqidelv/p/7043696.html

清华大学出版社《Java高并发核心编程 卷2 加强版

技术自由的实现路径:

实现你的 架构自由:

吃透8图1模板,人人可以做架构

10Wqps评论中台,如何架构?B站是这么做的!!!

阿里二面:千万级、亿级数据,如何性能优化? 教科书级 答案来了

峰值21WQps、亿级DAU,小游戏《羊了个羊》是怎么架构的?

100亿级订单怎么调度,来一个大厂的极品方案

2个大厂 100亿级 超大流量 红包 架构方案

… 更多架构文章,正在添加中

实现你的 响应式 自由:

响应式圣经:10W字,实现Spring响应式编程自由

这是老版本 《Flux、Mono、Reactor 实战(史上最全)

实现你的 spring cloud 自由:

Spring cloud Alibaba 学习圣经》 PDF

分库分表 Sharding-JDBC 底层原理、核心实战(史上最全)

一文搞定:SpringBoot、SLF4j、Log4j、Logback、Netty之间混乱关系(史上最全)

实现你的 linux 自由:

Linux命令大全:2W多字,一次实现Linux自由

实现你的 网络 自由:

TCP协议详解 (史上最全)

网络三张表:ARP表, MAC表, 路由表,实现你的网络自由!!

实现你的 分布式锁 自由:

Redis分布式锁(图解 - 秒懂 - 史上最全)

Zookeeper 分布式锁 - 图解 - 秒懂

实现你的 王者组件 自由:

队列之王: Disruptor 原理、架构、源码 一文穿透

缓存之王:Caffeine 源码、架构、原理(史上最全,10W字 超级长文)

缓存之王:Caffeine 的使用(史上最全)

Java Agent 探针、字节码增强 ByteBuddy(史上最全)

实现你的 面试题 自由:

4800页《尼恩Java面试宝典 》 40个专题

免费获取11个技术圣经PDF: