作者引言 .Net 8.0 下的新RPC

很高兴啊,我们来到了IceRPC之调用管道 Invocation pipeline与传出请求 Outgoing request->快乐的RPC, 基础引导,让自已不在迷茫,快乐的畅游世界。

调用管道 Invocation pipeline

了解如何发送请求requests和接收响应responses

定义

发送请求并接收相应响应的过程称为调用。

通常会通过客户端连接进行调用。然而,由于客户端和服务器连接具有相同的功能,因此也可以反过来调用,从连接的服务器端到此连接的客户端。

调用抽象

IceRPC总是通过调用调用器invoker来进行调用。调用器是一个简单的抽象,它接受传出的请求并返回传入的响应。

C# 中, 这个抽象是 IInvoker 接口:

namespace IceRpc;

public interface IInvoker
{
Task<IncomingResponse> InvokeAsync(OutgoingRequest request, CancellationToken cancellationToken = default);
}

ClientConnectionConnectionCache 都实现此接口。 这允许通过创建客户端连接或连接缓存,然后在生成的实例上调用 InvokeAsync 来进行调用:

await using var clientConnection = new ClientConnection(new Uri("icerpc://hello.zeroc.com"));
using var request = new OutgoingRequest(...); // Make an invocation by calling the IInvoker.InvokeAsync method implemented by ClientConnection.
IncomingResponse response = await clientConnection.InvokeAsync(request);

处理调用

在将其提供给连接之前,通常会对调用执行附加处理。例如,可能需要压缩请求的有效负载、为每个请求添加遥测字段、添加截止时间或简单地添加日志记录等。

调用器实现可以调用另一个调用器,它本身调用另一个调用器,等等;用于进行调用的调用器可以是调用器链或树的头,称为"调用管道"invocation pipeline.

3种常见的调用者类型:

  • Leaf invoker

    这是调用管道中的一片叶子。该调用器通常是连接。

  • Interceptor

    拦截器拦截调用,并将其转发到"下一个"next拦截器。IceRPC提供了几个内置的拦截器,用于记录,压缩等。

  • Pipeline

    管道在向调用器发出请求之前,通过在该管道中注册的拦截器来执行请求。

---
title: A typical invocation pipeline
---
flowchart LR
app([application code]) -- request --> i1["interceptor #1"] -- request --> i2["interceptor #2"]
i2 -- request --> ti["ClientConnection\n or ConnectionCache"] -- request --> connection
connection -- response --> ti -- response --> i2 -- response --> i1 -- response --> app

传出请求 Outgoing request

了解如何创建传出请求

Creating an outgoing request

为了创建 RPC,构造一个传出请求,然后将此请求作为参数传递给调用者invoke的调用方法。

传出请求携带调用者发送请求所需的所有信息:

  • 目标服务的服务地址service address
  • 调用此服务的操作名称
  • 请求字段
  • 请求的有效负载

传出请求还包含功能features。这些功能用于该管道内的本地通信;它们还用于管道中的调用者和应用程序代码之间的通信。

请求字段

请求字段表示由"传输连接"的请求承载的带外信息". 这些字段通常由拦截器和中间件读取和写入,以协调客户端和服务器中相同请求的处理。

字段是字节序列的字典 RequestFieldKey 中的条目,其中 RequestFieldKeySlice 中定义的枚举:

unchecked enum RequestFieldKey : varuint62 {
Context = 0
TraceContext = 1
CompressionFormat = 2
Deadline = 3
Idempotent = 4
}

例如,当压缩拦截器压缩传出请求的有效负载时,它设置请求字段CompressionFormat。这告诉连接另一侧的压缩中间件"该有效负载是用 brotli 压缩的";然后压缩中间件可以解压缩该(传入)请求有效负载。

请求有效负载和继续有效负载

请求的有效负载是表示操作参数的字节流。 当连接发送请求时,它会读取这些字节并将其逻辑复制到网络连接,直到不再有字节需要读取。

另一方面,连接从网络读取这些字节,创建传入请求并将此请求提供给调度器 dispatcher

传出请求的有效负载实际上分为两部分:连接在等待响应之前发送的第一部分,以及连接在等待、接收和返回响应时在后台发送的第二部分("继续")。

sequenceDiagram
Local-)Remote: request header + payload
par
Remote--)Local: response header + payload
and
Local-)Remote: request payload continuation
end

另一方面,调度器仅看到单个连续的传入请求有效负载。

请求功能

调用管道中的调用者在调用期间相互传输信息是很常见的。 例如,重试拦截器需要与连接缓存通信,以确保连接缓存不会继续使用相同的服务器地址重试。C# 中,这些调用者获取并设置请求的 IFeatureCollection 以相互通信。

还可以使用这些功能与调用管道进行通信。例如,您可以设置功能 ICompressFeature 以要求压缩机拦截器(如果已安装)压缩请求的有效负载:

using var request = new OutgoingRequest(serviceAddress)
{
Payload = largePayload,
Features = new FeatureCollection().With<ICompressFeature>(CompressFeature.Compress)
}; // Hopefully invoker is an invocation pipeline with a compressor interceptor.
IncomingResponse response = await invoker.InvokeAsync(request);

按照惯例,这些功能是使用接口类型进行管控的,例如上面示例中的 ICompressFeature

字段用于"传输连接"进行通信,而特征用于调用管道内的本地通信。IceRPC同时提供请求字段(由请求承载)和响应字段(由响应承载),但只提供请求特性:由于它都是本地的,因此不需要响应特性。

作者结语

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

IceRPC之调用管道Invocation pipeline与传出请求Outgoing request->快乐的RPC的更多相关文章

  1. Apache Beam实战指南 | 大数据管道(pipeline)设计及实践

    Apache Beam实战指南 | 大数据管道(pipeline)设计及实践  mp.weixin.qq.com 策划 & 审校 | Natalie作者 | 张海涛编辑 | LindaAI 前 ...

  2. Redis学习笔记7--Redis管道(pipeline)

    redis是一个cs模式的tcp server,使用和http类似的请求响应协议.一个client可以通过一个socket连接发起多个请求命令.每个请求命令发出后client通常会阻塞并等待redis ...

  3. 使用管道(PipeLine)和批量(Batch)操作

    使用管道(PipeLine)和批量(Batch)操作 前段时间在做用户画像的时候,遇到了这样的一个问题,记录某一个商品的用户购买群,刚好这种需求就可以用到Redis中的Set,key作为product ...

  4. .NET客户端实现Redis中的管道(PipeLine)与事物(Transactions)

    序言 Redis中的管道(PipeLine)特性:简述一下就是,Redis如何从客户端一次发送多个命令,服务端到客户端如何一次性响应多个命令. Redis使用的是客户端-服务器模型和请求/响应协议的T ...

  5. 控制结构(9): 管道(pipeline)

    // 上一篇:线性化(linearization) // 下一篇:指令序列(opcode) 最近阅读了酷壳上的一篇深度好文:LINUX PID 1 和 SYSTEMD.这篇文章介绍了systemd干掉 ...

  6. Redis中的管道(PipeLine)与事物(Transactions)

    Redis中的管道(PipeLine)与事物(Transactions) 序言 Redis中的管道(PipeLine)特性:简述一下就是,Redis如何从客户端一次发送多个命令,服务端到客户端如何一次 ...

  7. 管道模型(Pipeline)

    1.使用make_blobs来生成数据集,然后对数据集进行预处理 #导入数据集生成器 from sklearn.datasets import make_blobs #导入数据集拆分工具 from s ...

  8. redis 管道技术 pipeline 简介

    redis数据库的主要瓶颈是网络速度,其次是内存与cpu.在应用允许的情况下,优先使用pipeline批量操作.pipeline批量发出请求/一次性获取响应:不是发出多个请求,每个请求都阻塞等待响应, ...

  9. ASP.NET Core 2.1 中的 HttpClientFactory (Part 3) 使用Handler实现传出请求中间件

    原文:https://www.stevejgordon.co.uk/httpclientfactory-aspnetcore-outgoing-request-middleware-pipeline- ...

  10. MVC如何在Pipeline中接管请求的?

    MVC如何在Pipeline中接管请求的? 文章内容 上个章节我们讲到了,可以在HttpModules初始化之前动态添加Route的方式来自定义自己的HttpHandler,最终接管请求的,那MVC是 ...

随机推荐

  1. #线段树#洛谷 4588 [TJOI2018]数学计算

    题目传送门 分析 由于曾经做过原题 所以就直接说了,因为每个数最多被除掉一次 所以可以用线段树维护区间乘,也就很简单了,删除就单点修改就行了 代码 #include <cstdio> #i ...

  2. 提升面试成功率:深入理解 C++ 11 新特性

    C++11是C++语言的一个重大更新,引入了许多新特性,包括自动类型推导.lambda表达式.右值引用.智能指针等等.这些新特性使得C++更加现代化.高效.易用.也是面试容很容易被问到一个问题,下面我 ...

  3. 【FAQ】HMS Core推送服务推送角标的开发及常见问题解答

    目录 1.发送消息并显示桌面数字角标. 2.如何清除数字角标? 3.如何设置圆点角标? 4.应用桌面图标角标开关无法开启或未显示开关. 5.推送消息设置了角标字段但未显示角标? 6.未设置角标参数,但 ...

  4. WPF开发随笔收录-获取程序专有内存

    分享一个C#获取程序当前所占用的内存大小的方法,实测跟任务管理器上的内存值一样 /// <summary> /// 性能计数器组件类 /// </summary> privat ...

  5. HarmonyOS 性能优化

    如何合理使用动效来获得更好的性能 组件转场动画使用 transition: 推荐使用转场动画(transition)而不是组件动画(animateTo),因为 transition 只需要在条件改变时 ...

  6. marquee实现滚动

    marquee的基本语法:<marquee> ... </marquee> 参数:1.滚动方向 (direction):left(左).right(右).up(上).down( ...

  7. Django框架——ajax补充、多对多三种创建、序列化组件、批量操作数据、分页器

    ajax补充说明 主要是针对回调函数args接收到的响应数据 1.后端request.is_ajax() 用于判断当前请求是否由ajax发出 2.后端返回的三板斧都会被args接收不再影响整个浏览器页 ...

  8. 力扣219(java&python)-存在重复元素 II(简单)

    题目: 给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 i 和 j ,满足 nums[i] == nums[j] 且 abs(i - j) <= k .如果存在 ...

  9. 基于Serverless的云原生转型实践

    简介: 新一代的技术架构是什么?如何变革?是很多互联网企业面临的问题.而云原生架构则是这个问题最好的答案,因为云原生架构对云计算服务方式与互联网架构进行整体性升级,深刻改变着整个商业世界的 IT 根基 ...

  10. dubbo-go v3 版本 go module 踩坑记

    简介: 该问题源于我们想对 dubbo-go 的 module path 做一次变更,使用 dubbo.apache.org/dubbo-go/v3 替换之前的 github.com/apache/d ...