问题描述
我有一个 Micronaut(版本 2.1.4)应用程序,它通过 HTTP 使用 Protobuf 消息。
这是控制器示例:
@Post
@Consumes(ProtobufferCodec.PROTOBUFFER_ENCODED)
@Produces(ProtobufferCodec.PROTOBUFFER_ENCODED)
public HttpResponse<MyResponse> ingestData(@Body byte[] body)
throws InvalidProtocolBufferException {
MyProto myOjbect = MyProto.parseFrom(body);
MyResponse responseBody = myService.processData(body);
return HttpResponse.ok(responseBody);
}
我的问题是,仅对于某些请求(并非所有请求),行 MyProto.parseFrom(body)
引发异常
om.google.protobuf.InvalidProtocolBufferException: While parsing a protocol message,the input ended unexpectedly in the middle of a field. This Could mean either that the input has been truncated or that an embedded message misreported its own length.
at com.google.protobuf.InvalidProtocolBufferException.truncatedMessage(InvalidProtocolBufferException.java:84)
at com.google.protobuf.CodedInputStream$ArrayDecoder.pushLimit(CodedInputStream.java:1189)
at com.google.protobuf.CodedInputStream$ArrayDecoder.readMessage(CodedInputStream.java:886)
...
at com.google.protobuf.AbstractParser.parsePartialFrom(AbstractParser.java:158)
at com.google.protobuf.AbstractParser.parseFrom(AbstractParser.java:191)
at com.google.protobuf.AbstractParser.parseFrom(AbstractParser.java:203)
at com.google.protobuf.AbstractParser.parseFrom(AbstractParser.java:208)
at com.google.protobuf.AbstractParser.parseFrom(AbstractParser.java:48)
....
而且例外是正确的,正文 (byte[]) 被截断了(不完整)并且长度与之前的不同,我是通过 CURL 发送的。我还验证了 Content-Length
标头中的值与 byte[]
(protobuf) 的长度不同,因为 byte[]
的长度更小。
我无法重现此问题,仅在生产中发生。
有什么想法吗?
“感情”:
- 它发生在大请求中
- 也许 Netty 有一些参数,即使请求的大小允许,它也会被截断、切碎或类似,从而影响 protobuf (byte[])
- 性能(内存)问题?
更多信息:
- io.micronaut:micronaut-bom:2.1.4
- io.micronaut:micronaut-http-server-netty
- io.micronaut.grpc:micronaut-protobuff-support:1.0.1
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)