Micronaut 应用程序中截断的 protobufs

问题描述

我有一个 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 (将#修改为@)