GRPC 双向流在 1 分钟后无消息关闭

GRPC bidirectional stream closes after 1 minute without messages

我正在使用服务器打开 GRPC 双向流(具体为 python3.8)。从服务器获取一些数据后,我必须执行一项耗时的任务(大约需要 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())

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

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