码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 微博一面:RPC怎么做零呼损?


    说在前面

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

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

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

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

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

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

    《尼恩 架构笔记》《尼恩高并发三部曲》《尼恩Java面试宝典》的PDF,请到公号【技术自由圈】获取

    文章目录

      • 说在前面
      • 场景分析
      • 确保RPC零呼损的维度
      • rpc client 维度的零呼损:重试
      • rpc server 维度的零呼损:优雅启停
        • 优雅启动
        • 优雅停止/优雅下线
        • 优雅停止/优雅下线的简单流程
      • 确保RPC零呼损的维度
      • 说在最后
      • 参考文献
      • 推荐阅读

    场景分析

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

    服务实例之间,有着错综复杂的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 加强版》

    推荐阅读

    《百亿级访问量,如何做缓存架构设计》

    《多级缓存 架构设计》

    《消息推送 架构设计》

    《阿里2面:你们部署多少节点?1000W并发,当如何部署?》

    《美团2面:5个9高可用99.999%,如何实现?》

    《网易一面:单节点2000Wtps,Kafka怎么做的?》

    《字节一面:事务补偿和事务重试,关系是什么?》

    《网易一面:25Wqps高吞吐写Mysql,100W数据4秒写完,如何实现?》

    《亿级短视频,如何架构?》

    《炸裂,靠“吹牛”过京东一面,月薪40K》

    《太猛了,靠“吹牛”过顺丰一面,月薪30K》

    《炸裂了…京东一面索命40问,过了就50W+》

    《问麻了…阿里一面索命27问,过了就60W+》

    《百度狂问3小时,大厂offer到手,小伙真狠!》

    《饿了么太狠:面个高级Java,抖这多硬活、狠活》

    《字节狂问一小时,小伙offer到手,太狠了!》

    《收个滴滴Offer:从小伙三面经历,看看需要学点啥?》

    《尼恩 架构笔记》《尼恩高并发三部曲》《尼恩Java面试宝典》PDF,请到下面公号【技术自由圈】取↓↓↓

  • 相关阅读:
    【*E】leetcode-118. 杨辉三角
    信号(1.信号概念 2.信号的处理方式 3.信号阶段 用户态,内核态)
    三层神经网络的训练模型,深度神经网络如何训练
    go微服务框架Kratos笔记「链路追踪实战」
    凌晨!腾讯云终于发布了2023年度双十一优惠活动!
    MySQL -- 库和表的操作
    【分享】“微信小商店“在集简云平台集成应用的常见问题与解决方案
    Linux之进度条
    Python中setdefault()通过键查找字典中对应的值
    goctp 委托追单
  • 原文地址:https://blog.csdn.net/crazymakercircle/article/details/132836352
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号