h2c/grpc遗留问题
- [ ] 明确一些边缘header的设置规则,比如[grpc-]accept-encoding, grpc-timeout
- [ ] 改进server端判定client端是否支持gzip的方法,client端不一定要设置accept-encoding
- [x] grpc不支持application/grpc+json
- [ ] 考虑移除x-bd-error-code x-bd-log-id等字段的可行性。
- [ ] http/h2c支持snappy压缩。(deflate就没必要支持了)
- [x] http_verbose排版不对,且不是原子写出,多线程下可能交叉
- [x] protocol支持传递协议参数
- [ ] 支持ProgressiveAttachment和ProgressiveReader
- [x] http2协议名从h2c改为h2,根据ssl状态动态显示为h2c或h2
- [x] http2/grpc文档
- [ ] 当h2response的包体长度大于remote window size时,当前的做法是直接返回RST_STREAM,更好的做法是等到收到window_update再发,just like tcp。
- [x] (Bug)由于连接建立完成后,H2的setting和req是一起发送的,此时client发送一个包体大于默认值的包,会发送失败,那么setting也发不过去,Server也不会发送任何Setting,相当与不会收到任何消息
- [ ] grpc支持streaming rpc
- [ ] 文档中说明http2未实现功能。
- [ ] 支持rpc dump和rpc replay
赞h2c/grpc的支持, 请问下这里有grpc stream 方式的支持计划么?
这里面的ProgressiveReader和ProgressiveAttachment是二进制流层面的,是更加基础的功能,http1也支持(但是不同流要不同连接)。grpc stream要在其之上再封装一层,如果你有需求可以建一个单独的issue。
@jamesge 我遇到了上面说的 "当h2response的包体长度小于remote window size时,当前的做法是直接返回RST_STREAM,更好的做法是等到收到window_update再发,just like tcp"这个问题, 这个问题可以grpc-java客户端这边通过调大window size来解决吗.
@Xavier1994 调到最大可以让这个问题出现的概率非常小,不过也就失去了流控的作用了,如果你们的场景是客户端流控不太重要,可以调大
“当h2response的包体长度小于remote window size时,当前的做法是直接返回RST_STREAM,更好的做法是等到收到window_update再发”;是大于吧? 请问大概什么时候修复这个问题?
@taozhiwei 目前可以把remote window size调大作为workaround,在你们业务场景会带来什么问题么
@taozhiwei 目前可以把remote window size调大作为workaround,在你们业务场景会带来什么问题么
我已经修改grpc client调用方式了: ManagedChannel channel = NettyChannelBuilder.forAddress("127.0.0.1",8080).flowControlWindow(2097152).usePlaintext().build();
在用 grpc客户端调用brpc的server端, 当流量大的时候, 经常出现如下错误 [ERROR] [external/brpc/src/brpc/policy/http2_rpc_protocol.cpp:718:()] [0] Fail to find stream_id=835341
@jamesge @zyearn 请问是否是需要调整某些参数
@Xavier1994 这个是正常的错误,server因为某些错误关闭一个stream而client还在向这个stream发送数据就会报这个错。看看有没有其他错误日志以及是否把client端的windowsize设置正确
确实是正常的, 只要客户端端大量超时就会有这个错, 原因是客户端超时的时候会发一个RST去结束这个stream, 但是这个时候这个stream可能正常的数据还在处理, server先处理RST之后就会close掉这个stream, 就会报这个错