Closed Slontia closed 1 month ago
问题定位到了,和 brpc 的实现没有关系,issue 先 close 了
MyResponse *response 这个response需要先写入一些字段再发送回复吗?是不是因为没设置必要字段,序列化失败所以没有给client端发送回复
MyResponse *response 这个response需要先写入一些字段再发送回复吗?是不是因为没设置必要字段,序列化失败所以没有给client端发送回复
不需要的,没有设置必要字段也是可以响应的。上面给出的实现在我的环境里最终运行是没有问题的。
之前有问题的实现,是 server 端先 StreamWrite
再回的包,这种情况下会导致向 stream 写的数据先于 response 序列化。而 client 解析的时候,预期是先解析的 response,这会导致解析 response 失败。
Describe the bug (描述bug)
使用 stream RPC,从 server 端向 client 端发送消息时,在 client 端遇到了 check failed,原因是解析 message 失败,没有从 header 中解析出预期的协议名称(解析逻辑在
ParseRpcMessage
里)。随后一段时间后,RPC 报错超时。因为 example 中只包括了 client 给 server 发送 stream message 的例子,我不是很确定我这里的写法是否正确。
这是日志里发现的 check failed:
我尝试在此处加了一些日志,观察到 header 里并未包含「PRPC」。
日志报错:
To Reproduce (复现方法)
这是我 server 端的代码,做了一定程度的简化。目前的实现的顺序是 accept stream -> 回复 response -> write stream。
这是我 client 端的简化代码,将 closure 和 stream handler 集成到了一个类里。
Expected behavior (期望行为)
期望是 RPC 不超时,client 端能从 server 端接收到 response 和 stream message。
Versions (各种版本) OS: CentOS Linux release 7.2 (Final) Compiler: g++ (GCC) 10.2.1 20210130 (Red Hat 10.2.1-11) brpc: protobuf:
Additional context/screenshots (更多上下文/截图)