广告
返回顶部
首页 > 资讯 > 后端开发 > GO >怎么在golang中使用GRPC设置client超时时间
  • 220
分享到

怎么在golang中使用GRPC设置client超时时间

2023-06-14 21:06:00 220人浏览 安东尼
摘要

这篇文章给大家介绍怎么在golang中使用grpc设置client超时时间,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。什么是Golanggolang 是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收

这篇文章给大家介绍怎么在golang中使用grpc设置client超时时间,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

什么是Golang

golang 是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言,其语法与 C语言相近,但并不包括如枚举、异常处理、继承、泛型、断言、虚函数等功能。

超时

建立连接

主要就2函数Dail和DialContext。

// Dial creates a client connection to the given target.func Dial(target string, opts ...DialOption) (*ClientConn, error) {    return DialContext(context.Background(), target, opts...)}
func DialContext(ctx context.Context, target string, opts ...DialOption) (conn *ClientConn, err error){...}

DialContext 太长了不帖了.看Dial实际上也是调用DialContext来实现的.如果你想在建立连接的时候使用超时控制.就使用

DialContext传入一个Timeout的context,就像下面的例子

ctx1, cel := context.WithTimeout(context.Background(), time.Second*3)defer cel()conn, err := grpc.DialContext(ctx1, address, grpc.WithBlock(), grpc.WithInsecure())

另外调用Dial建立连接默认只是返回一个ClientConn的指针,相当于new了一个ClientConn 把指针返回给你。并不是一定要建立真实的h3连接.至于真实的连接建立实际上是一个异步的过程。

当然了如果你想等真实的链接完全建立再返回ClientConn可以通过WithBlock传入Options来实现,当然了这样的话链接如果建立不成功就会一直阻塞直到Contex超时。

真正的建立链接的代码后面介绍重试的时候会再详细介绍。

调用超时

这个比较简单

ctx, cancel := context.WithTimeout(context.TODO(), time.Second*3)defer cancel() r, err := c.SayHello(ctx, &pb.HelloRequest{Name: name})

如上代码传入一个timeout context就可以。

Server

type SearchService struct{} func (s *SearchService) Search(ctx context.Context, r *pb.SearchRequest) (*pb.SearchResponse, error) {    for i := 0; i < 5; i++  {        if ctx.Err() == context.Canceled {            return nil, status.Errorf(codes.Canceled, "SearchService.Search canceled")        }         time.Sleep(1 * time.Second)    }     return &pb.SearchResponse{Response: r.GetRequest() + " Server"}, nil} func main() {    ...}

而在 Server 端,由于 Client 已经设置了截止时间。Server 势必要去检测它

否则如果 Client 已经结束掉了,Server 还傻傻的在那执行,这对资源是一种极大的浪费

因此在这里需要用 ctx.Err() == context.Canceled 进行判断,为了模拟场景我们加了循环和睡眠 ?

验证

重新启动 server.go 和 client.go,得到结果:

$ go run client.go2018/10/06 17:45:55 client.Search err: deadlineexit status 1

总结

本章节比较简单,你需要知道以下知识点:

怎么设置 Deadlines

为什么要设置 Deadlines

你要清楚地明白到,gRPC Deadlines 是很重要的,否则这小小的功能点就会要了你生产的命。

补充:golang使用grpc超时控制和对冲策略

超时控制

grcp超时控制设置在客户端调用服务时,如果设定了超时时间,客户端会立即返回超时。超时控制一般有三个因素:链路超时:上有调用端通过协议字段把自己允许的超时时间传给当前服务,表示在该时间内返回数据,超时返回已无意义。流程如下图A调用B的总超时情况。

消息超时:服务端收到请求消息到返回响应数据的最长消息处理时间。下图的B内部的当前请求整体超时时间。调用超时:当前服务调用下游服务设置的每一个rpc请求的超时时间。如下图B调用C的单个超时时间。通常一次请求会连续调用多次rpc,这个调用超时控制的是每个rpc的独立超时时间。

怎么在golang中使用GRPC设置client超时时间

发起rpc调用请求时,需要计算此次rpc调用的超时时间。真正生效的超时时间是通过以上三个因素实时计算的最小值,计算过程

如下:

首先计算链路超时和消息超时的最小值,如链路超时2s,消息超时1s,则当前消息的最长处理时间为1s。

发起rpc调用时,再次计算当前消息最长处理时间和单个超时时间的最小值,比如:上图的B->C设置的单个超时时间为5s,则实际上B调用C的真实超时仍然是1s,其实只要超时时间大于当前最长处理时间都是无效的,都会取最小值。再比如B->C单个超时时间为500ms,这种情况B调用C的真实超时即为500ms,此时500ms这个值也会通过协议字段传给C,在服务端C的视角来看就是他的链路超时时间。链路超时时间会在整个rpc调用链上一直传递下去,并逐渐减少,直至为0,这样避免出现死循环调用的问题。

因为每一次rpc调用都会实际消耗一部分时间,所以当前消息最长处理时间需要实时计算剩余时间,比如上面B调用C真实耗时200ms,此时最长处理时间就只剩下800ms了。此时发起第二次rpc调用时,则需要计算此时剩余的消息超时时间和单个调用时间的最小值。如上图的B->D设置的单个超时时间为1s,则实际生效的超时时间仍然为800ms。链路超时设置:golang的context.Context根据协议里面的timeout字段和框架配置的timeout字段。设置好当前请求的最长处理时间,然后交给用户使用,并在处理函数结束时会立马cancel掉当前context。所以在创建新的goroutine时,需要重新设定新的context。

对冲策略

对冲策略不是被动的等待上一次请求超时或者失败,在对冲延时时间内(或小于超时时间)如果没有收到回复的包就会再触发一个请求。

与重试策略不同的是同一时间内in-fliaght可能有多个,当接收到第一回复时,其他的回复会被忽略。

一、重试策略:

对失败的请求,进行重新请求。

怎么在golang中使用GRPC设置client超时时间

由图中可以看出,client一共进行了三次请求,前两次均失败,并且在重新请求时都会随机避段时间,防止请求毛刺,第三次请求成功,返回给应用层。对于每次尝试,我们都会尽可能地将请求发往不同的节点。

通常重试策略有三种配置:

失败重新请求的最大次数,达到最大次数仍然失败,不再进行重试;

退避时间:退避时间取的是 random(0, delay);

可重试错误码:设置可错误码,对于不可重试的,立即停止重试并将错误返回应用层。

二、对冲策略

怎么在golang中使用GRPC设置client超时时间

上图中client一共进行了4次,橙、蓝、绿、紫

橙色是第一次尝试。在由 client 发起后,server2 很快便收到了。但是 server2 的因为网络等问题,直到绿色请求成功,并返回给应用层后,它的正确回包才姗姗来迟。尽管它成功了,但我们必须丢弃它,因为我们已经将另一个成功的回包返回给应用层了。

蓝色是第二次尝试。因为橙色请求在对冲时延(hedging delay)后还没有回包,因此我们发起了一次新的尝试。这次尝试选择了 server1(我们会尽可能地为每次尝试选择不同的节点)。蓝色尝试的回包比较快,在对冲时延之前便返回了。但是却失败了。我们立刻发起了新一次尝试。

绿色是第三次尝试。尽管它的回包可能有点慢(超过了对冲时延,因此又触发了一次新的尝试),但是它成功了!一旦我们收到第一个成功的回包,便立刻将它返回给了应用层。

紫色是第四次尝试。刚发起后,我们便收到了绿色成功的回包。对紫色来说,它可能处于很多状态:请求还在 client gRPC 内,这时,我们有机会取消它;请求已经进入了 client 的内核或者已经由网卡发出,无论如何,我们已经没有机会取消它了。紫色请求上的 ✘ 表示我们会尽可能地取消紫色请求。注意,即使紫色请求最终成功地到达了 server2,它的回包也会像橙色一样被丢弃。

由以上可知对冲策略更像是添加了等待时间的重试,但是他没有退避机制,一旦收到错误的包,立刻发起重试。这种对于需要解决长尾问题时推荐使用,一般情况建议使用重试策略。

对冲策略一般有三种配置

对冲延时:在对对冲时延内没有收到回包时便会立刻发起新的尝试;

最大请求次数:一旦耗尽,便等待并返回最后一个回包,无论它是否成功或失败;

非致命错误:返回致命错误会立刻中止对冲,等待并返回最后一个回包,无论它是否成功或失败。返回非致命错误会立刻触发一次新的尝试(对冲时延计时器会被重置)。

关于怎么在golang中使用GRPC设置client超时时间就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

您可能感兴趣的文档:

--结束END--

本文标题: 怎么在golang中使用GRPC设置client超时时间

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么在golang中使用GRPC设置client超时时间
    这篇文章给大家介绍怎么在golang中使用GRPC设置client超时时间,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。什么是golanggolang 是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收...
    99+
    2023-06-14
  • golang在GRPC中设置client的超时时间
    超时 建立连接 主要就2函数Dail和DialContext。 // Dial creates a client connection to the given target. ...
    99+
    2022-11-12
  • mysql 中怎么设置事务锁超时时间
    mysql 中怎么设置事务锁超时时间,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Mysql数据库采用InnoDB模式,默认参数:innodb...
    99+
    2022-10-18
  • java怎么设置接口调用超时时间
    在 Java 中,我们可以使用 `java.net.URLConnection` 或 `java.net.HttpURLConnec...
    99+
    2023-10-26
    java
  • 怎么在c#中设置HttpClient超时
    这篇文章将为大家详细讲解有关怎么在c#中设置HttpClient超时,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。问题如果你经常用HttpClient去调用Restfull接口或传送文件,你...
    99+
    2023-06-14
  • 怎么在MySQL中设置时间
    这篇文章主要介绍“怎么在MySQL中设置时间”,在日常操作中,相信很多人在怎么在MySQL中设置时间问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么在MySQL中设置时间”...
    99+
    2023-04-27
    mysql
  • 怎么在PHP中设置和操作时间戳
    这篇文章主要介绍“怎么在PHP中设置和操作时间戳”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么在PHP中设置和操作时间戳”文章能帮助大家解决问题。一、获取当前时间戳要获取当前时间戳,您可以使用t...
    99+
    2023-07-05
  • 怎么在redis中设置key的过期时间
    在redis中设置key过期时间的方法:1.启动redis服务;2.登录redis数据库;3.执行命令设置过期时间;具体步骤如下:首先,在命令行中启动redis服务;service redis start mysql服务启动后,输入用户名,...
    99+
    2022-10-22
  • 数据在redis中保存的时间怎么设置
    在Redis中,可以使用EXPIRE命令来设置数据的过期时间。EXPIRE命令的语法如下:EXPIRE key seconds其中,...
    99+
    2023-09-05
    redis
  • 怎么在CentOS7系统中设置日期和时间
    本篇文章为大家展示了怎么在CentOS7系统中设置日期和时间,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、基本概念1 GMT、UTC、CST、DST 时间(1) UTC整个地球分为二十四时区,每...
    99+
    2023-06-10
  • 使用php怎么设置程序运行时间
    这期内容当中小编将会给大家带来有关使用php怎么设置程序运行时间,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。方法1:使用ini_set()函数配置“max_execution_time”项的值语法:in...
    99+
    2023-06-15
  • 怎么在PHP中用内置函数将时间转换为时间戳
    这篇“怎么在PHP中用内置函数将时间转换为时间戳”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么在PHP中用内置函数将时间...
    99+
    2023-07-05
  • 怎么使用Javascript在HTML中显示实时时间
    这篇文章主要介绍了怎么使用Javascript在HTML中显示实时时间的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么使用Javascript在HTML中显示实时时间文章都会有所收获,下面我们一起来看看吧。方...
    99+
    2023-07-02
  • linux中怎么利用date命令设置时间
    本篇文章给大家分享的是有关linux中怎么利用date命令设置时间,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。date命令date命令的功能是显示和设置系统日期和时间。 该命...
    99+
    2023-06-13
  • 手机使用云服务器怎么设置时间
    如果您的手机使用云服务器,您可以通过以下步骤设置时间: 打开您的手机设置,找到“日期和时间”选项。 确保“自动确定日期和时间”选项已开启。这将使您的手机自动从云服务器获取时间。 如果您需要手动设置时间,您可以关闭“自动确定日期和时间”选...
    99+
    2023-10-26
    服务器 时间 手机
  • 怎么在java中使用Clock访问时间
    这篇文章将为大家详细讲解有关怎么在java中使用Clock访问时间,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Java可以用来干什么Java主要应用于:1. web开发;2. Androi...
    99+
    2023-06-14
  • Linux中怎么使用date命令设置系统日期与时间
    这期内容当中小编将会给大家带来有关Linux中怎么使用date命令设置系统日期与时间,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。显示系统日期要显示系统日期,只要输入:$ date T...
    99+
    2023-06-16
  • Linux中怎么使用hwclock命令设置硬件日期和时间
    这期内容当中小编将会给大家带来有关Linux中怎么使用hwclock命令设置硬件日期和时间,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。具体方法如下:# hwclock &ndash;systoh...
    99+
    2023-06-16
  • 手机使用云服务器怎么设置时间长短
    1. 了解云服务器的使用时间 在使用云服务器时,通常会有一个使用时间的限制。这个时间限制是由云服务提供商设定的,可以是按小时、按天、按月等不同的时间段。在使用云服务器时,需要根据自己的需求选择合适的使用时间。 2. 设置云服务器的使用时间...
    99+
    2023-10-26
    长短 服务器 时间
  • 手机使用云服务器怎么设置时间限制
    如果您想在云服务器上设置手机使用时间限制,可以按照以下步骤进行操作: 首先,您需要在云服务器上安装一个家长控制应用程序,例如“Screen Time”或“Qustodio”。 打开应用程序并按照提示进行设置。您可以选择设置每天的使用时间...
    99+
    2023-10-26
    服务器 时间 手机
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作