RPC 实战与核心原理
何小锋
京东云混合云首席架构师
40244 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 29 讲
RPC 实战与核心原理
15
15
1.0x
00:00/00:00
登录|注册

20 | 详解时钟轮在RPC中的应用

单线程扫描方式
多线程方式
应用场景
使用时需要注意的问题
时钟轮的实现机制
定时心跳
调用端与服务端启动超时处理
调用端请求超时处理
时钟轮的运行机制
时间槽和时钟轮的概念
模拟生活中的时钟跳动原理
定时任务实现方式
处理超时请求
异步调用
课后思考
总结
时钟轮在RPC中的应用
什么是时钟轮?
定时任务带来了什么问题?
详解时钟轮在RPC中的应用

该思维导图由 AI 生成,仅供参考

你好,我是何小锋。上一讲我们学习了在分布式环境下如何快速定位问题,简单回顾下重点。在分布式环境下,RPC 框架自身以及服务提供方的业务逻辑实现,都应该对异常进行合理地封装,让使用方可以根据异常快速地定位问题;而在依赖关系复杂且涉及多个部门合作的分布式系统中,我们也可以借助分布式链路跟踪系统,快速定位问题。
现在,切换到咱们今天的主题,一起看看时钟轮在 RPC 中的应用。

定时任务带来了什么问题?

在讲解时钟轮之前,我们先来聊聊定时任务。相信你在开发的过程中,很多场景都会使用到定时任务,在 RPC 框架中也有很多地方会使用到它。就以调用端请求超时的处理逻辑为例,下面我们看一下 RPC 框架是如果处理超时请求的。
回顾下[第 17 讲],我讲解 Future 的时候说过:无论是同步调用还是异步调用,调用端内部实行的都是异步,而调用端在向服务端发送消息之前会创建一个 Future,并存储这个消息标识与这个 Future 的映射,当服务端收到消息并且处理完毕后向调用端发送响应消息,调用端在接收到消息后会根据消息的唯一标识找到这个 Future,并将结果注入给这个 Future。
那在这个过程中,如果服务端没有及时响应消息给调用端呢?调用端该如何处理超时的请求?
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

时钟轮在RPC中的应用是一种高效的定时任务执行机制。它通过将任务放入时间槽中,并在固定的单位时间内进行跳动和执行,有效减少了额外的扫描操作,解决了CPU浪费的问题。在RPC框架中,时钟轮可以处理请求超时、启动超时和定时心跳等功能,提高系统性能和稳定性。时钟轮的使用需要注意时间槽位的单位时间和槽位数量,以及根据具体业务场景设置周期和时间槽数。除了调用端的超时处理和定时心跳,RPC框架中还有其他功能可以应用时钟轮,这种机制为系统的定时任务提供了高效的执行方式。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《RPC 实战与核心原理》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(19)

  • 最新
  • 精选
  • 雨霖铃声声慢
    时钟轮可以实现延时消息的功能,比如让一个任务几分钟之后发送一条消息出去。在比如可以实现订单过期功能,用户下单10分钟没付款,就取消订单,可以通过时钟轮实现。

    作者回复: 是的,真棒

    2020-04-06
    8
    41
  • 忆水寒
    在java里面和Netty框架里面有这个类,TimeWheel时钟轮模型。

    作者回复: 是的,netty里面有实现

    2020-04-06
    28
  • qinsi
    时钟轮存取任务的时间复杂度是O(1),相比之下优先队列的时间复杂度是O(logN)

    作者回复: 👍

    2020-04-06
    5
    16
  • 高源
    时钟轮这个我头一次听到,老师如果并发线程比较多,单位时间是不是划分很细啊,但是我有个疑问例如我同时有5个线程几乎之间间隔3到5毫秒,又有3个线程10到100毫秒的,我时钟轮也得调整具体怎么划分的,这么短时间内如何保证时钟轮准确性,老师哪有参考代码学习一下

    作者回复: 一般都是统一划分,时间轮主要解决是长时间没有触发的问题,不解决实时性

    2020-04-06
    3
    10
  • 719
    提高扫描定时任务效率还有一种方法是所有定时任务放入按照时间排序的优先队列,每次只扫描队首节点。从性能上看,哪种方法好一些?

    作者回复: 应该是不同场景吧

    2020-05-06
    2
    1
  • 定时任务相关解决方案: 1:线程休眠,可能需要N多线程 2:定时轮询,可能会空耗许多CPU轮询 3:时间轮,和时钟原理相似,规避1/2的缺陷 只有涉及到定时任务,就可以使用时钟轮来解决,比如: 调用端超时处理、调用端和服务端的启动超时处理、定时心跳检测、延迟消息队列的延迟消息发送等。 netty框架中就有时钟轮的实现,可以研究一下。
    2020-05-16
    1
    10
  • 🐠
    请问老师,为什么说多层时间轮中的任务会被重复扫描呢?就上面例子的任务C来说,它处于下一层的第1个槽位,那么经过1s后,它被分布到当前的时间轮中,然后经过600ms后跳动到当前时间轮的第6个槽位,此时才会触发任务C。重复扫描的意思就是说在下一层的第1个槽位被扫描过一次,然后在当前时间轮的第6个槽位又被扫描过一次吗?
    2021-06-17
    2
    3
  • 张申傲
    调用方的异常重试也可以考虑使用时间轮。感触:软件设计的本质都是生活~
    2021-02-05
    2
  • renpeng
    技术的思想很多都是源于生活
    2020-05-31
    1
  • 鸠摩智
    redis中的key的超时是不是也用时钟轮实现的?
    2020-05-11
    8
    1
收起评论
显示
设置
留言
19
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部