作者引言

很高兴啊,我们来到了IceRPC之"请求"生命线意义非凡,号称“死亡时间”的追命线,颤抖吧!

"请求"生命线之意义非凡

本文将深入探讨将截止时间纳入RPCs的重要性, 以开发更强大的分布式应用程序。

概述

RPC(远程过程调用)系统中发送请求,通常会带来不确定性:无法保证,何时会收到回复,或请求需要多长时间,才能到达目的地。 由于各种原因,请求可能会被延迟:

  • 目标服务可能会不堪重负,无法及时响应
  • 网络拥堵可能会减慢流量
  • 或者技术问题可能根本无法阻止目标服务处理请求(同步阻塞、假死等)

这些场景强调了分布式应用程序设计,准备处理延迟调用,或无法完成的调用的重要性

我们将探讨使用截止时间,是如何帮助构建更强大的分布式应用程序的。

但首先,让我们先了解如果不使用截止时间,会产生什么后果呢?

截止时间如何影响分布式系统

想象一下,前端服务依赖于一系列后端服务,来完成其任务的场景。假设这些基本后端服务之一,发生故障并且无法处理请求。我们的前端服务,继续处理客户的请求。并且每次都需要使用,有故障的后端服务来完成请求,请求都会被卡住,无限期地,等待从未到达的响应。

因此,满足请求所需的资源仍然无限期地被占用。在这种情况下,由于请求无法完成,前端的资源利用率将稳步提高。

最糟糕表现之一:是发生在同步进行远程调用时,导致线程在等待响应时被阻止. 迟早,所有可用的线程都可能被卡住,等待永远无法完成的请求. 幸运的是,IceRPC的设计,从源头上是异步的,可以防止落入这个陷阱。

然而,请求所需的其他资源(例如内存和文件句柄)无法释放,这进一步削弱了系统处理新请求的能力。

在其他场景中,应用程序可能需要快速返回响应。如果当前调用,不再需要,没有释放被占用,会浪费重要的服务器资源。

什么是请求截止时间?

要了解请求截止时间,我们必须首先掌握超时的情况。超时是指调用者愿意等待,调用完成多长时间的时间间隔。在 C# 中,该持续时间由 System.TimeSpan 类型表示。

截止时间可以被视为"绝对超时",由调用者认为可以接受,等待调用完成的时间点表示。在 C# 中,截止时间由 System.DateTime 类型表示。

截止时间提供了一种简单的机制,有助于在调用者不再有兴趣,等待其完成后取消调用和发送。

使用超过超时的截止时间的优点是,它们可以使用请求字段请求一起传输,使目标服务能够在截止时间过去时取消调度,并在从调度完成的嵌套调用中使用截止时间。而在请求字段中传输超时是无效的,因为目标服务无法确定调用的确切开始时间或超时何时到期。

在进行远程程序时(RPC),加入截止时间至关重要。 一般通常会选择超时,并根据该超时计算截止时间。为特定操作选择最佳超时,可能需要一些反复试验。如果超时设置得太低,可能会遇到不必要的故障。相反,如果设置得太高,错误检测可能会被延迟。所以,为正常情况下的操作,提供足够的时间;并为不同负载条件下可能出现的小延迟,留出一些空间。

IceRPC(C#)中的截止时间

从 IceRPC 成立以来,很明显,支持截止时间的机制至关重要。此外, IceRPC 决定利用标准中间件和拦截器在 IceRPC 核心之外实现此功能。

这种方法不仅允许用户集成自己的实现,还可以证明 IceRPC 核心的灵活性。它展示了核心通过独立拦截器和中间件容纳此类机制的能力。

IceRpc.Deadline NuGet包,包括拦截器和中间件,可以在调用和调度管道中使用截止时间

在最简单的场景中,可以在调用管道invocation pipeline中使用截止时间拦截器并设置默认调用超时,从中计算截止时间:


// Create an invocation pipeline with the deadline interceptor and a default timeout of 500 ms.
Pipeline pipeline = new Pipeline()
.UseDeadline(defaultTimeout: TimeSpan.FromMilliseconds(500))
.Into(connection);

处理请求时,截止时间拦截器执行以下几个操作:

  • 如果请求没有关联的截止时间,它会使用默认超时生成一个截止时间
  • 它建立了一个取消令牌源,一旦到达截止时间,该源就会取消调用
  • 它在传出请求字段中添加了截止时间字段
  • 如果由于截止时间过去而取消调用,则会抛出超时异常TimeoutException
  • 对于单向请求,拦截器无法取消调度,因为单向请求通常在调度开始之前完成。

并非所有请求都需要相同的截止时间设置,IDeadlineFeature 允许自定义截止时间:


// Customize the invocation deadline for a specific request to ensure it isn't canceled prematurely.
var features = new FeatureCollection();
features.Set<IDeadlineFeature>(DeadlineFeature.FromTimeout(TimeSpan.FromSeconds(10)));

值得注意的是,截止时间代表了一个确切的时间时刻。因此,应该在进行调用之前设置它。

icerpc协议的一个显着特点是,它支持通过线路取消请求,截止时间拦截器有效地利用了这一点。当到达截止时间并且截止时间拦截器取消调用取消令牌时,它会触发底层RPC流的重置。此操作反过来取消发送,过程运行与目标服务的调度管道,与是否包括截止时间中间件无关。

在接收端,调度管道可以采用截止时间中间件,将截止时间字段解码为相应的功能并独立于客户端强制执行截止时间。 这依赖于调用者通过某些外部机制(例如 NTP(网络时间协议))同步他们的系统时钟。


// Add the deadline middleware to the dispatch pipeline.
Router router = new Router()
.UseDeadline();
.Map<...>(...);

如果由于截止时间过期,而在截止时间中间件之前取消发送,则它会返回状态代码status code等于StatusCode.DeadlineExceeded的传出响应.

此外,截止时间中间件使用解码截止时间初始化 'IDeadlineFeature' 。这允许从调度管道完成的嵌套调用,遵守相同的截止时间约束。


public async ValueTask<string> GreetAsync(
string name,
IFeatureCollection features,
CancellationToken cancellationToken)
{
// By adding the deadline middleware features contains the deadline feature
// created from the decoded deadline field.

结论

截止时间是开发更强大的分布式应用程序的重要机制,在进行远程调用时,始终包含截止时间,因为这可以确保应用程序不会陷入,等待永远不会到达的响应的困境,即使出了问题,也能够及时响应。

作者结语

  • 一直做,不停做,才能提升速度
  • 翻译的不好,请手下留情,谢谢
  • 如果对我有点小兴趣,如可加我哦,一起探讨人生,探讨道的世界
  • 觉得还不错的话,点个

.Net 8.0 下的新RPC,IceRPC之"请求"生命线意义非凡的更多相关文章

  1. Ubuntu18.04和OpenWrt 18.06.0 下使用aria2和BaiduExport处理百度盘下载

    Ubuntu下没有可用的百度盘客户端, 下载大文件如果通过浏览器就会特别不可靠. 可以使用Chrome插件 BaiduExport 得到下载链接和参数后, 通过aria2进行下载. Aria2安装 直 ...

  2. Ubuntu14.0下安装Zend Framework 2

    Ubuntu14.0下安装Zend Framework 2为了安装这个东西,忙活了快一天了,参考中文博客一直没有安装成功,有些博客的时间也是已经很早了,后来google看英文版的才安装成功,这里记录一 ...

  3. 有史来最大改变 Android 5.0十大新特性

    有史来最大改变 Android 5.0十大新特性 2014.10.16 14:51:31 来源:腾讯数码作者:腾讯数码 ( 0 条评论 )   距离Android系统上一次重大更新不到一年的时间,谷歌 ...

  4. Android下添加新的自定义键值和按键处理流程

            Android下添加新的自定义键值和按键处理流程     说出来不怕大家笑话,我写这篇博客的原因在于前几天去一个小公司面试Android系统工程师,然后在面试的时候对方的技术总监问了我 ...

  5. .NET Framework4.0 下的多线程

    一.简介 在4.0之前,多线程只能用Thread或者ThreadPool,而4.0下提供了功能强大的Task处理方式,这样免去了程序员自己维护线程池,而且可以申请取消线程等...所以本文主要描述Tas ...

  6. NodeJS - Express 3.0下ejs模板使用 partial展现 片段视图

    如果你也在看Node.js开发指南,如果你也在一步一步实现 microBlog 项目!也许你会遇到本文提到的问题,如果你用的是Express 3.0 本书实例背景是 Express 2.0 而如今升级 ...

  7. 【CNMP系列】CentOS7.0下安装PHP5.6.30服务

    上一节我们讲过了如何在CentOS7.0下安装MySql服务,如果没有看到欢迎页面的朋友,可以加我的个人微信详聊:litao514148204 附上一节地址:http://www.cnblogs.co ...

  8. 【CNMP系列】CentOS7.0下安装Nginx服务

    话步前言,CNMP之路,系统起步:http://www.cnblogs.com/riverdubu/p/6425028.html 这回我来讲解下CentOS7.0下如何安装和配置Nginx服务 Ngi ...

  9. 【Linux】CentOS7.0下安装JDK环境

    写在前面:此次试验是在CentOS7上面安装的,亲测成功. 所需工具:JDK1.8安装包,xftp 具体步骤: 1,首先使用xftp连接到自己的虚拟机,然后查看是否有"/usr/java/j ...

  10. Spring Boot 2.0正式发布,新特性解读

    作者|翟永超 Spring Boot 2.0 来啦,有哪些新特性?升级吗? 写在前面 北京时间 3 月 1 日,经过漫长的等待之后,Spring Boot 2.0 正式发布.作为 Spring 生态中 ...

随机推荐

  1. 【面试】将 95% 求职者拒之门外的BAT大数据面试题-附解题方法(文末有福利)

    写在前面 最近不少读者找我要大数据面试题,我整理了很久,筛选出这10道容易出错的大数据面试题,希望对大家有所帮助.题目与解答整理自互联网,感谢分享这些面经的技术大牛们! 题目概览 如何从大量的 URL ...

  2. C++中std::function常见用法

    C++标准库中的std::function是一个通用的函数封装,可以用来存储.复制.调用任何可调用对象(函数.函数指针.成员函数指针.lambda表达式等).以下是std::function的一些常见 ...

  3. 2022福州大学MEM复试英语口语准备

    一.自我介绍 Dear professors, it's my honor to be here for my interview. My name is ,I finished my undergr ...

  4. DNS的各种记录类型的应用解析

    可能很多人平时工作中不会遇到DNS配置相关的问题, 但如果偶尔遇到不同类型DNS记录的配置, 在没有搞清楚它们都是干啥的情况下, 会眼花缭乱, 还记得很多年前实验室配置DNS不太对导致只能访问www. ...

  5. #整体二分,树状数组#洛谷 3332 [ZJOI2013]K大数查询

    题目 分析 虽然树套树也可以做,这里考虑整体二分, 对于二分的答案\(mid\),1操作实际上就是如果\(c>mid\)就给区间整体加1, 2操作即询问区间和是否超过\(k\),如果超过\(k\ ...

  6. #Tarjan,SPFA,差分约束系统#BZOJ 2330 AcWing 368 银河

    题目 分析 首先这明显是一道差分约束题,但是无解的情况确实比较恶心, 考虑它的边权为0或1,无解当且仅当某个强连通分量内的边至少一条边边权为1, 那么用有向图的Tarjan缩点后跑SPFA就可以了 代 ...

  7. Python 潮流周刊第 45 期(摘要)+ 赠书 5 本《Python语言及其应用(第2版)》

    本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...

  8. 小师妹学JavaIO之:try with和它的底层原理

    目录 简介 IO关闭的问题 使用try with resource try with resource的原理 自定义resource 总结 简介 小师妹是个java初学者,最近正在学习使用java I ...

  9. 一文告诉你如何使用java调用http接口

    程序如下: 添加apache相关maven依赖: 1 <dependency> 2 <groupId>org.apache.commons</groupId> 3 ...

  10. mybatis复习(一)

    原始连接数据库步骤: 1.导入JDBC驱动包 Class.forName("com.mysql.jdbc.Driver"); 2.获取连接对象(连接目标数据库) Connectio ...