I0804 13:52:46.505722 0 C:\jenkins\workspace\gRPC_build_artifacts\platform\windows\workspace_csharp_ext_windows_x86\src\core\lib\surface\call.c:1802: grpc_call_start_batch(call=05BEFFD8, ops=05EFED58, nops=6, tag=05BC64E0, reserved=00000000)
I0804 13:52:46.505722 0 C:\jenkins\workspace\gRPC_build_artifacts\platform\windows\workspace_csharp_ext_windows_x86\src\core\lib\surface\call.c:1445: ops[0]: SEND_INITIAL_METADATA(nil)
I0804 13:52:46.505722 0 C:\jenkins\workspace\gRPC_build_artifacts\platform\windows\workspace_csharp_ext_windows_x86\src\core\lib\surface\call.c:1445: ops[1]: SEND_MESSAGE ptr=05BDAFD0
I0804 13:52:46.505722 0 C:\jenkins\workspace\gRPC_build_artifacts\platform\windows\workspace_csharp_ext_windows_x86\src\core\lib\surface\call.c:1445: ops[2]: SEND_CLOSE_FROM_CLIENT
I0804 13:52:46.505722 0 C:\jenkins\workspace\gRPC_build_artifacts\platform\windows\workspace_csharp_ext_windows_x86\src\core\lib\surface\call.c:1445: ops[3]: RECV_INITIAL_METADATA ptr=05BC64FC
I0804 13:52:46.505722 0 C:\jenkins\workspace\gRPC_build_artifacts\platform\windows\workspace_csharp_ext_windows_x86\src\core\lib\surface\call.c:1445: ops[4]: RECV_MESSAGE ptr=05BC6508
I0804 13:52:46.505722 0 C:\jenkins\workspace\gRPC_build_artifacts\platform\windows\workspace_csharp_ext_windows_x86\src\core\lib\surface\call.c:1445: ops[5]: RECV_STATUS_ON_CLIENT metadata=05BC650C status=05BC6518 details=05BC651C
我很困惑为什么当我认为TCP连接保持打开时,gRPC在调用之间记录消息SEND_CLOSE_FROM_CLIENT。
基本上我只有一个带有构造函数的随机类,它可以打开一个客户端通道到gRPC服务器。在这个类上调用的方法中,每个迭代都有一个循环调用RPC方法。但是,它很慢,我认为这是因为它每次尝试进行RPC调用时都会创建连接。
如何保持连接打开?这是双工流媒体的情况吗?
答案 0 :(得分:1)
SEND_CLOSE_FROM_CLIENT是由gRPC C核心库定义的原语,在HTTP / 2术语中表示“halfclose”(它通知客户端已完成在流式RPC中发送请求 - 其中每个RPC对应于HTTP / 1:1 2流;一元呼叫只是流媒体呼叫的一种特殊情况)。
SEND_CLOSE_FROM_CLIENT与关闭TCP连接无关(我认为如果不首先阅读有线协议和HTTP2,你就太快得出结论 https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md)