【问题标题】:GRPC bidirectional stream closes after 1 minute without messagesGRPC 双向流在 1 分钟后关闭,没有消息
【发布时间】:2021-07-02 18:44:45
【问题描述】:

我正在使用服务器(特别是 python3.8)打开一个 GRPC 双向流。从服务器获取一些数据后,我必须执行一项耗时的任务(大约需要 3 分钟)。在执行此操作时,我会保持通道打开,以便在任务完成后立即将结果发送到服务器

在服务器发出最后一条消息后 1 分钟,我的连接关闭。我得到这个错误

<AioRpcError of RPC that terminated with:
    status = StatusCode.INTERNAL
    details = "Received RST_STREAM with error code 1"
    debug_error_string = "{"created":"@1625250019.779494905","description":"Error received from peer ipv4:3.101.44.139:443","file":"src/core/lib/surface/call.cc","file_line":1066,"grpc_message":"Received RST_STREAM with error code 1","grpc_status":13}"
>

对我来说,这似乎是一些超时。我是grpc的初学者。我参考了this article,并为我的频道提供了文章中指定的客户端选项,每个数字接近 5 分钟。但这并没有改变什么。有人可以帮助我了解这里发生了什么以及我应该如何解决这个问题?


TL;DR

我与服务器的连接是异步安全通道。请注意,我的两个流是独立的,这就是为什么我必须这样做async

channel=grpc.aio.secure_channel(address, credentials=creds, options=options)

我有两个协程,一个等待长时间运行的任务执行,另一个在双向流上接收和感知消息

def parse_response(resp):
    # collect data from server response
    # make `task_available=True` when all data is received

async def stream_handler():
    stub = TaskServiceStub(channel)
    req_gen = get_requests()  # An async generator for request messages
    stream: grpc.aio.StreamStreamCall = stub.Task(req_gen)
    
    async for resp in stream.__aiter__():
        parse_response(resp)

async def task_handler():
    if task_available:
        do_task()

async def main():
    await asyncio.gather(stream_handler(), task_handler())

【问题讨论】:

  • RST_STREAM 是客户端发送的取消请求,客户端通道中的选项是什么?并检查客户端日志,是否还有其他问题导致请求失败?
  • 我不确定客户端是否关闭了连接,如果这是您的暗示的话。查看答案

标签: python asynchronous grpc bidirectional grpc-python


【解决方案1】:

向服务器 nginx 配置添加读取超时解决了该问题

nginx.ingress.kubernetes.io/server-snippet: |
    client_header_timeout 3h;
    client_body_timeout 3h;
    grpc_read_timeout 3h;
    grpc_send_timeout 3h;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-08
    • 2021-11-01
    • 1970-01-01
    • 2017-10-16
    • 2022-11-08
    • 1970-01-01
    • 2020-09-30
    • 1970-01-01
    相关资源
    最近更新 更多