首页 > 其他分享 >.Net 8.0 下的新RPC,IceRPC之"请求"生命线意义非凡

.Net 8.0 下的新RPC,IceRPC之"请求"生命线意义非凡

时间:2024-05-02 11:44:17浏览次数:25  
标签:8.0 调用 请求 IceRPC RPC 时间 超时 截止

作者引言

很高兴啊,我们来到了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.

结论

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

作者结语

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

标签:8.0,调用,请求,IceRPC,RPC,时间,超时,截止
From: https://www.cnblogs.com/xlgwr/p/18170054

相关文章

  • jsrpc获取瑞数请求后缀和cookie
    jsrpc获取瑞数请求后缀和cookie记得加入我们的学习群:961566389点击链接加入群聊:https://h5.qun.qq.com/s/62P0xwrCNO1.分析xhr每次请求都能看到会携带一个请求后缀uB04BPdr:以及每次请求都会更换cookie下的mEsoE3ffu2LGP:这两个就是需要逆向的参数。2.调试因为使用jsrpc......
  • .Net 8.0 下的新RPC,IceRPC之试试的新玩法"打洞"
    作者引言很高兴啊,我们来到了IceRPC之试试的新玩法"打洞",让防火墙哭去吧试试RPCs的新玩法"打洞"比较典型的玩法:RPC数据流从客户端流向服务端,现在来尝试用IceRPC来玩一个新的花样"打洞"。概述对于IceRPC,客户端是发起连接的实体,而服务器是接受连接的实体。建立连接后,......
  • python grpc简单使用
    pythongrpc简单使用1、rpc和grpc关系RPC(RemoteProcedureCallProtocol),直译来看就是远程过程调用协议。它提供了一套机制,使得应用程序之间可以进行通信,使用时客户端调用server端的接口就像调用本地的函数一样方便。并且server端和client端不限语言,任何语言遵循protobuf协议......
  • RPC协议有哪些
    序章什么是RPC?答:RPC(RemoteProcedureCall)远程过程调用协议。RPC协议的用途是什么?答:服务间方便地调用,主要后端服务之间。看到一段话,【对外使用RESTfulAPI,对内使用RPC】使用RPC协议的好处?答:相对于RESTfulAPI,(数据传输)效率更高(有多高?自己没调查过)。gRPC是什么?答:Googl......
  • 全景剖析阿里云容器网络数据链路(七):Terway DataPath V2(Terway≥1.8.0)
    作者:余凯前言近几年,企业基础设施云原生化的趋势越来越强烈,从最开始的IaaS化到现在的微服务化,客户的颗粒度精细化和可观测性的需求更加强烈。容器网络为了满足客户更高性能和更高的密度,也一直在高速的发展和演进中,这必然对客户对云原生网络的可观测性带来了极高的门槛和挑战。为......
  • Aliyun服务器部署MySql 8.0
    Aliyun服务器部署MySql8.0一、安装MySQL复制相应版本;下载wget-i-chttps://repo.mysql.com//mysql80-community-release-el8-1.noarch.rpm1安装yum-yinstallmysql80-community-release-el8-1.noarch.rpm12、安装MySQL服务器安装命令(可以先执行下一步操作,再来......
  • MySQL8.0.22安装
    MySQL8.0.22安装及配置(超详细)大家好,今天我们来学习一下MySQL8.0.22安装及配置,好好看,好好学,超详细的第一步进入MySQL官网下载,如下图所示:第二步进入下载完成后解压到除c盘以外的盘,如下图所示:第三步解压后的目录并没有的my.ini文件,没关系可以自行创建在安装根目......
  • Go语言高并发与微服务实战专题精讲——远程过程调用 RPC——优化RPC调用,缓解频繁请求
    远程过程调用RPC——优化RPC调用,缓解频繁请求导致的GC压力 在Go语言的高并发和微服务架构中,远程过程调用(RPC)是一种常用的通信机制。然而,当频繁发送RPC请求时,不断创建Request和Response结构体可能会带来额外的垃圾收集(GC)压力,进而影响应用的性能和响应时间。为了减......
  • Go语言高并发与微服务实战专题精讲——远程过程调用 RPC——客户端处理RPC请求的原理
    远程过程调用RPC——客户端处理RPC请求的原理及源代码分析 客户端无论是同步调用还是异步调用,每次RPC请求都会生成一个Call对象,并使用seq作为key保存在map中,服务端返回响应值时再根据响应值中的seq从map中取出Call,进行相应处理。 客户端发起RPC调用的过程大致如下所示,我们......
  • RPC(远程过程调用)详解
    一、RPC是什么RPC是指远程过程调用,也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。二、RPC需要解决的问题1、CallID映射我们怎么告诉远程机器我们要调用f......