返回顶部
首页 > 资讯 > 后端开发 > GO >gRPC 上下文取消传播
  • 134
分享到

gRPC 上下文取消传播

2024-04-04 23:04:18 134人浏览 安东尼
摘要

编程网今天将给大家带来《grpc 上下文取消传播》,感兴趣的朋友请继续看下去吧!以下内容将会涉及到等等知识点,如果你是正在学习golang或者已经是大佬级别了,都非常欢迎也希望大家都能给我建议评论哈

编程网今天将给大家带来《grpc 上下文取消传播》,感兴趣的朋友请继续看下去吧!以下内容将会涉及到等等知识点,如果你是正在学习golang或者已经是大佬级别了,都非常欢迎也希望大家都能给我建议评论哈~希望能帮助到大家!

问题内容

我试图了解 Go 上下文取消在客户端服务通信(例如任何 grpc api 调用)中是如何工作的。

假设客户端取消了上下文。这是否会导致向服务器发出新的 Http 请求,并取消先前/正在进行的 gRPC 请求的上下文?服务器如何知道客户端是否取消了上下文?


正确答案


默认情况下,http2 用作 gprc 的底层协议。 http2 连接上可能有多个流。这是一张图片,说明了来自 WEB dev 的 http2 的连接和流

如果您在响应返回之前取消一个 grpc 调用中的上下文。客户端的 errcode 可能是 cancel 和 mapping to RST_STREAM,然后这个 rst_stream 将被发送到服务器。 rst_stream 帧允许立即终止流,即当前的 rpc 调用流将被终止。但是,http2 连接仍然存在,当调用下一个 rpc 调用时,将使用另一个新流来执行 rpc 调用。

这里是一些测试代码片段。

客户端:100毫秒后强制取消上下文。

    conn, err := grpc.dial(serveraddr,
        grpc.withtransportcredentials(insecure.newcredentials()))

    defer conn.close()

    c := pb.newgreeterclient(conn)

    for i := 0; i < 10; i++ {
        ctx, cancel := context.withcancel(context.todo())
        go func() {
            // force call cancel after 100 milliseconds
            time.sleep(100 * time.millisecond)
            cancel()
        }()

        r, err := c.sayhello(ctx, &pb.hellorequest{name: "name"})
     }

服务器端:延迟sayhello响应1秒。

func (s *server) sayhello(ctx context.context, in *pb.hellorequest) (*pb.helloreply, error) {
    // delay ack on server by 1 seconds
    randms := 1000

    select {
    case <-time.after(time.duration(randms) * time.millisecond):

    case <-ctx.done():
        if ctx.err() == context.canceled || ctx.err() == context.deadlineexceeded {
            log.printf("sayhello: context err %+v \n", ctx.err())
            return nil, ctx.err()
            
        }
    }

使用 godebug=http2debug=2运行代码,更多grpc的调试日志可以帮助我们了解客户端和服务器之间的消息。

客户端日志

2022/10/21 20:40:38 http2: Framer 0xc0005be000: wrote SETTINGS len=0
2022/10/21 20:40:38 http2: Framer 0xc0005be000: read SETTINGS len=6, settings: MAX_FRAME_SIZE=16384
2022/10/21 20:40:38 http2: Framer 0xc0005be000: wrote SETTINGS flags=ACK len=0
2022/10/21 20:40:38 http2: Framer 0xc0005be000: read SETTINGS flags=ACK len=0
2022/10/21 20:40:38 http2: Framer 0xc0005be000: wrote HEADERS flags=END_HEADERS stream=1 len=98
2022/10/21 20:40:38 http2: Framer 0xc0005be000: wrote DATA flags=END_STREAM stream=1 len=12 data="\x00\x00\x00\x00\a\n\x05world"
2022/10/21 20:40:38 http2: Framer 0xc0005be000: read WINDOW_UPDATE len=4 (conn) incr=12
2022/10/21 20:40:38 http2: Framer 0xc0005be000: read PING len=8 ping="\x02\x04\x10\x10\t\x0e\a\a"
2022/10/21 20:40:38 http2: Framer 0xc0005be000: wrote PING flags=ACK len=8 ping="\x02\x04\x10\x10\t\x0e\a\a"
force call cancel in client
2022/10/21 20:40:38 could not greet: rpc error: code = Canceled desc = context canceled
2022/10/21 20:40:38 http2: Framer 0xc0005be000: wrote RST_STREAM stream=1 len=4 ErrCode=CANCEL
2022/10/21 20:40:41 http2: Framer 0xc0005be000: wrote HEADERS flags=END_HEADERS stream=3 len=7
2022/10/21 20:40:41 http2: Framer 0xc0005be000: wrote DATA flags=END_STREAM stream=3 len=12 data="\x00\x00\x00\x00\a\n\x05world"
2022/10/21 20:40:41 http2: Framer 0xc0005be000: read WINDOW_UPDATE len=4 (conn) incr=12
2022/10/21 20:40:41 http2: Framer 0xc0005be000: read PING len=8 ping="\x02\x04\x10\x10\t\x0e\a\a"
2022/10/21 20:40:41 http2: Framer 0xc0005be000: wrote PING flags=ACK len=8 ping="\x02\x04\x10\x10\t\x0e\a\a"
force call cancel in client
2022/10/21 20:40:41 could not greet: rpc error: code = Canceled desc = context canceled
2022/10/21 20:40:41 http2: Framer 0xc0005be000: wrote RST_STREAM stream=3 len=4 ErrCode=CANCEL
2022/10/21 20:40:44 http2: Framer 0xc0005be000: wrote HEADERS flags=END_HEADERS stream=5 len=7
2022/10/21 20:40:44 http2: Framer 0xc0005be000: wrote DATA flags=END_STREAM stream=5 len=12 data="\x00\x00\x00\x00\a\n\x05world"
2022/10/21 20:40:44 http2: Framer 0xc0005be000: read WINDOW_UPDATE len=4 (conn) incr=12

没有。它关闭网络连接。

由于网络连接已关闭。

好了,本文到此结束,带大家了解了《gRPC 上下文取消传播》,希望本文对你有所帮助!关注编程网公众号,给大家分享更多Golang知识!

您可能感兴趣的文档:

--结束END--

本文标题: gRPC 上下文取消传播

本文链接: https://lsjlt.com/news/596273.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • gRPC 上下文取消传播
    编程网今天将给大家带来《gRPC 上下文取消传播》,感兴趣的朋友请继续看下去吧!以下内容将会涉及到等等知识点,如果你是正在学习Golang或者已经是大佬级别了,都非常欢迎也希望大家都能给我建议评论哈...
    99+
    2024-04-04
  • 处理跨层上下文取消
    问题内容 我正在开发一个带有控制器、服务、存储库等的分层后端 API。 上下文 这些层中的每个方法都采用 context.Context 作为其包含请求上下文的第一个参数。这很方便,因...
    99+
    2024-02-06
  • goroutine 没有看到上下文取消?
    小伙伴们对Golang编程感兴趣吗?是否正在学习相关知识点?如果是,那么本文《goroutine 没有看到上下文取消?》,就很适合你,本篇文章讲解的知识点主要包括。在之后的文章中也会多多分享相关知识...
    99+
    2024-04-04
  • vue上下模糊如何取消
    这篇文章主要介绍“vue上下模糊如何取消”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“vue上下模糊如何取消”文章能帮助大家解决问题。第一种方法:取消滚动回弹效果Vue.js默认的滚动行为会让你的滚...
    99+
    2023-07-06
  • 如何在 Goroutine 中使用上下文取消功能?
    在 go 中使用上下文取消功能可以优雅地取消正在进行的 goroutine:使用 context 包创建带超时的上下文。在函数返回时使用 defer 取消上下文。在 goroutine ...
    99+
    2024-05-15
    上下文取消
  • 如何在 Golang 中使用 gRPC 实现文件上传?
    如何使用 grpc 实现文件上传?创建配套服务定义,包括请求和响应消息。在客户端,打开要上传的文件并将其分成块,然后通过 grpc 流流式传输发送到服务端。在服务端,接收文件块并将其存储...
    99+
    2024-05-13
    文件上传 grpc git golang
  • PHP(文件上传、下载、删除、读取&写入)
    一、文件上传: 先构造一个html的上传页面 文件上传 action:是提交给谁处理,写upload.php的话就交由upload.php处理,为空就是自己处理  可以看到页面成功构造成...
    99+
    2023-09-04
    安全 php
  • JS中传播事件、取消事件默认行为、阻止事件传播的示例分析
    这篇文章主要介绍JS中传播事件、取消事件默认行为、阻止事件传播的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1.事件处理程序的返回值    &...
    99+
    2024-04-02
  • Scrapy案例01-爬取传智播客主页上
    目录 1. 新建scrapy项目 2. 爬虫文件: 2.1. 查看需要爬取内容存在哪里: 2.2. 设置item需要保存的数据变量 ...
    99+
    2023-01-30
    播客 案例 主页
  • Linux下怎么上传、下载文件
    这篇文章给大家分享的是有关Linux下怎么上传、下载文件的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。lrzsz-0.12.20.tar.gz是一款linux下命令行界面上支持上传和下载的第三方工具,能够起到很方...
    99+
    2023-06-28
  • Java上传下载ftp文件
    在Java中连接FTP服务器可以使用Apache Commons Net库提供的FTPClient类。以下是一个简单的示例代码,演示如何连接到FTP服务器、进行文件上传和下载操作: import org.apache.commons.net...
    99+
    2023-09-03
    java apache 服务器
  • java- SFTP文件上传下载
    JSch - SFTP文件上传下载 文章目录 JSch - SFTP文件上传下载1. JSch简介2. ChannelSftp常用ApiJSch支持三种文件传输模式文件上传 put() 方法文...
    99+
    2023-09-30
    java 服务器
  • python ftp 上传、下载文件
    python ftp 上传、下载文件#获取昨天日期TODAY = datetime.date.today()  YESTERDAY = TODAY - datetime.timedelta(days=1) CURRENTDAY=YESTER...
    99+
    2023-01-31
    上传 文件 python
  • Win7下取消共享文件夹上的小锁图标的图文教程
    我们用过Windows 7系统的都会发现,共享后的文件夹图标左下角显示锁,取消共享后依然存在,如图: Window 7系统中小锁其实是开启简单共享后,文件本身访问权限受限的标识。添加所有用户权限后可以消失。 操作步骤:...
    99+
    2023-06-05
    Win7 取消共享文件夹上的小锁图标 图文 图标 小锁 教程
  • SpringMVC实现上传下载文件
    本文实例为大家分享了SpringMVC实现上传下载文件的具体代码,供大家参考,具体内容如下 一、SpringMVC专门提供了CommonsMultipartResolver组件用于文...
    99+
    2024-04-02
  • 我们如何保证取消的上下文会导致 goroutine 终止?
    php小编子墨将为大家介绍如何保证取消上下文会导致goroutine终止的方法。当我们在使用goroutine时,有时候需要在某个条件满足时取消它,以避免不必要的计算和资源浪费。为了确...
    99+
    2024-02-09
  • android实现多线程下载文件(支持暂停、取消、断点续传)
    多线程下载文件(支持暂停、取消、断点续传) 多线程同时下载文件即:在同一时间内通过多个线程对同一个请求地址发起多个请求,将需要下载的数据分割成多个部分,同时下载,每个线程只负责...
    99+
    2022-06-06
    多线程下载 多线程 断点续传 断点 线程 Android
  • linux下上传下载文件夹的方法
    linux下目录复制:本机->远程服务器 scp -r /home/shaoxiaohu/test1 zhidao@192.168.0.1:/home/test2 test1为源目录,test2为目标目录,z...
    99+
    2022-06-04
    linux 上传文件夹 linux下载文件夹
  • 对象存储MinIO(实现文件上传、读取、下载、删除)
    一、 MinIO         MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服 务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/ 虚拟机镜...
    99+
    2023-08-31
    spring boot java mysql
  • MobaXterm上传下载文件、文件夹到服务器上
      首先通过SSH与服务器建立连接,不懂的可查阅相关资料,CSDN里有很多介绍。 上传下载文件 可以在命令输入窗口,无需输入命令,按ctrl单击的同时鼠标右键出现以下左图,选择receive file using Z-modem或者send...
    99+
    2023-08-31
    linux
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作