grpc-swift中如何为Swift端的RPC调用设置超时时间
grpc-swift 缩短RPC调用超时的正确实现
编译报错Type 'TimeLimit' has no member 'seconds'的原因是:TimeLimit枚举本身没有.seconds成员,你误将TimeAmount的时间构造方法当成了TimeLimit的case。
grpc-swift的超时能力基于SwiftNIO的时间类型实现,正确配置方式分两种常用场景:
单次RPC调用设置超时
在构造CallOptions时,用TimeLimit.timeout()传入TimeAmount类型的时长即可,1秒超时的代码如下:
import GRPC import NIO let oneSecondTimeout = CallOptions( timeLimit: .timeout(.seconds(1)) ) // 发起调用时传入该options即可 let call = client.yourRpcMethod(request, callOptions: oneSecondTimeout)
给客户端设置全局默认超时
如果不需要每次调用单独传配置,可以在初始化gRPC客户端时设置默认CallOptions,所有未单独传options的调用都会沿用这个超时配置:
let defaultCallOptions = CallOptions(timeLimit: .timeout(.seconds(1))) let grpcClient = YourServiceClient( channel: yourConnectionChannel, defaultCallOptions: defaultCallOptions )
补充说明
- 如果你需要指定绝对的截止时间点而非相对时长,可以用
TimeLimit.deadline(),传入NIODeadline类型值即可,比如TimeLimit.deadline(.now() + .seconds(1))和上面的1秒相对超时效果完全一致。 - 若不需要任何超时控制,给
timeLimit传.none即可。 - 该配置是端到端全链路超时,覆盖连接建立、请求发送、响应等待全流程,正好解决你提到的「服务端未启动时默认等待20秒才报错」的问题,设置后会按你指定的1秒时长触发超时错误。
内容的提问来源于stack exchange,提问作者fsctl
相关产品推荐
相关产品推荐

