作者引言

很高兴啊,我们来到了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. Babel解决ES6不能被所有浏览器解析问题

    一.简介 1.ES6的某些高级语法在浏览器环境甚至是Node.js环境中无法执行. 2.Babel是一个广泛使用的转码器,可以将ES6代码转为ES5代码,从而在现有环境执行执行. 二.安装Babel ...

  2. 基于rv1126 rkmeida 一路多出 原理

    基于rv1126 rkmeida 一路多出的坑 首先说要的是介绍一下rkmedia 相关内容 ​ RKMedia提供了一种媒体处理方案,可支持应用软件快速开发.RKMedia在各模块基础API上做进一 ...

  3. #线段树#洛谷 2221 [HAOI2012]高速公路

    题目 分析 首先把收费站之间化为点,那这样即是区间加和区间查询, 考虑求的应该是 \[\frac{\sum a[i]*(r-i+1)*(i-l+1)}{C(r-l+2,2)} \] 分子可以拆成 \[ ...

  4. C语言简易万年历带注释

    同学问的课后作业,顺便加了写注释. #include<stdio.h> /* * 注意 每周的第一天是星期天 */ int main() { int day_per_mo[12] = { ...

  5. 深入了解 Golang 条件语句:if、else、else if 和嵌套 if 的实用示例

    条件语句 用于根据不同的条件执行不同的操作.Go中的条件可以是真或假.Go支持数学中常见的比较运算符: 小于 < 小于等于 <= 大于 > 大于等于 >= 等于 == 不等于 ...

  6. RabbitMQ 03 直连模式-可视化界面

    这里先演示最简单的模型:直连模式.其结构图为: 一个生产者 -> 消息队列 -> 一个消费者 生产者只需要将数据丢进消息队列,而消费者只需要将数据从消息队列中取出,这样就实现了生产者和消费 ...

  7. 教你构建一个优秀的SD Prompt

    构建一个优秀的Prompt 在使用Stable Diffusion AI时,构建一个有效的提示(Prompt)是至关重要的第一步.这个过程涉及到创造性的尝试和对AI行为的理解.这里我会对如何构建一个好 ...

  8. 通过path在windows下临时修改python和pip路径 以便于配置环境只对当前命令行窗口生效

    配置前 在cmd命令行下输入新env的路径 path=D:\Miniconda2\envs\openmmlab\openmmlab;D:\Miniconda2\envs\openmmlab\openm ...

  9. wireshark 抓包整理———— 从一个小案例开始 [一]

    前言 前面已经有抓包系列了,简单写一下wireshark的抓包系列,共36节,18个理论小栗子,36个实战栗子. 正文 这个例子是<<wireshark 分析就这么简单>>的一 ...

  10. docker 应用篇————docker-compose[十九]

    前言 简单介绍一下docker compose. 正文 首先进行下载一下. sudo curl -L "https://github.com/docker/compose/releases/ ...