java – Avro架构不尊重向后兼容性

前端之家收集整理的这篇文章主要介绍了java – Avro架构不尊重向后兼容性前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有这个avro架构
  1. {
  2. "namespace": "xx.xxxx.xxxxx.xxxxx","type": "record","name": "MyPayLoad","fields": [
  3. {"name": "filed1","type": "string"},{"name": "filed2","type": "long"},{"name": "filed3","type": "boolean"},{
  4. "name" : "metrics","type":
  5. {
  6. "type" : "array","items":
  7. {
  8. "name": "MyRecord","fields" :
  9. [
  10. {"name": "min",{"name": "max",{"name": "sum",{"name": "count","type": "long"}
  11. ]
  12. }
  13. }
  14. }
  15. ]
  16. }

这是我们用来解析数据的代码

  1. public static final MyPayLoad parseBinaryPayload(byte[] payload) {
  2. DatumReader<MyPayLoad> payloadReader = new SpecificDatumReader<>(MyPayLoad.class);
  3. Decoder decoder = DecoderFactory.get().binaryDecoder(payload,null);
  4. MyPayLoad myPayLoad = null;
  5. try {
  6. myPayLoad = payloadReader.read(null,decoder);
  7. } catch (IOException e) {
  8. logger.log(Level.SEVERE,e.getMessage(),e);
  9. }
  10.  
  11. return myPayLoad;
  12. }

现在我想在架构中添加一个字段,因此架构如下所示

  1. {
  2. "namespace": "xx.xxxx.xxxxx.xxxxx","type": "long"}
  3. ]
  4. }
  5. }
  6. }
  7. {"name": "agentType","type": ["null","string"],"default": "APP_AGENT"}
  8. ]
  9. }

注意添加的字段,也定义了默认值.问题是,如果我们收到使用旧架构编写的数据,我会收到此错误

  1. java.io.EOFException: null
  2. at org.apache.avro.io.BinaryDecoder.ensureBounds(BinaryDecoder.java:473) ~[avro-1.7.4.jar:1.7.4]
  3. at org.apache.avro.io.BinaryDecoder.readInt(BinaryDecoder.java:128) ~[avro-1.7.4.jar:1.7.4]
  4. at org.apache.avro.io.BinaryDecoder.readIndex(BinaryDecoder.java:423) ~[avro-1.7.4.jar:1.7.4]
  5. at org.apache.avro.io.ResolvingDecoder.doAction(ResolvingDecoder.java:229) ~[avro-1.7.4.jar:1.7.4]
  6. at org.apache.avro.io.parsing.Parser.advance(Parser.java:88) ~[avro-1.7.4.jar:1.7.4]
  7. at org.apache.avro.io.ResolvingDecoder.readIndex(ResolvingDecoder.java:206) ~[avro-1.7.4.jar:1.7.4]
  8. at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:152) ~[avro-1.7.4.jar:1.7.4]
  9. at org.apache.avro.generic.GenericDatumReader.readRecord(GenericDatumReader.java:177) ~[avro-1.7.4.jar:1.7.4]
  10. at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:148) ~[avro-1.7.4.jar:1.7.4]
  11. at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:139) ~[avro-1.7.4.jar:1.7.4]
  12. at com.appdynamics.blitz.shared.util.XXXXXXXXXXXXX.parseBinaryPayload(BlitzAvroSharedUtil.java:38) ~[blitz-shared.jar:na]

我从this文件中了解到这应该是向后兼容的,但不知何故情况似乎并非如此.知道我做错了什么吗?

解决方法

最后我得到了这个工作.我需要在SpecificDatumReader中给出两个模式
所以我修改了这样的解析,我在读者中传递了新旧架构,它就像一个魅力
  1. public static final MyPayLoad parseBinaryPayload(byte[] payload) {
  2. DatumReader<MyPayLoad> payloadReader = new SpecificDatumReader<>(SCHEMA_V1,SCHEMA_V2);
  3. Decoder decoder = DecoderFactory.get().binaryDecoder(payload,e);
  4. }
  5.  
  6. return myPayLoad;
  7. }

猜你在找的Java相关文章