Avroスキーマに基づいて、スキーマに適したクラスで動作するクラス(データ)を生成しました データをエンコードしてから、他のアプリケーション "A"にkafkaを使用して送信しますAvro with Kafka - スキーマの変更による逆シリアル化
(アプリケーション「A」に)私はデシリアライザclass DataDeserializer implements Deserializer<Data> {
private String encoding = "UTF8";
@Override
public void configure(Map<String, ?> configs, boolean isKey) {
// nothing to do
}
@Override
public Tloog deserialize(String topic, byte[] data) {
try {
if (data == null)
{
return null;
}
else
{
DatumReader<Tloog> reader = new SpecificDatumReader<Data>(Data.class);
DecoderFactory decoderFactory = DecoderFactory.get();
BinaryDecoder decoder = decoderFactory.binaryDecoder(data, null);
Data decoded = reader.read(null, decoder);
return decoded;
}
} catch (Exception e) {
throw new SerializationException("Error when deserializing byte[] to string due to unsupported encoding " + encoding);
}
}
を実装することにより、データをdeserilize反対側に
Data data; // <- The object was initialized before . Here it is only the declaration "for example"
EncoderFactory encoderFactory = EncoderFactory.get();
ByteArrayOutputStream out = new ByteArrayOutputStream();
BinaryEncoder encoder = encoderFactory. directBinaryEncoder(out, null);
DatumWriter<Tloog> writer;
writer = new SpecificDatumWriter<Data>(Data.class);
writer.write(data, encoder);
byte[] avroByteMessage = out.toByteArray();
問題は、このアプローチがIetheデータクラスははずSpecificDatumReaderの使用を必要とすることですと一体化するアプリケーションコード...これは問題になる可能性 - スキーマが変更される可能性があり、したがって、データのクラスを再生成し、もう一度 2の質問に統合する必要があります。
- は、私がアプリケーションにGenericDatumReaderを使用すべきか?どのようにそれを行う 正しく。 (私はスキーマをアプリケーションに単純に保存できます)
- Dataが変更された場合、SpecificDatumReaderを使用する簡単な方法はありますか?どのようにそれは多くのトラブルで統合することができますか?
おかげ
[Confluent Schema Registry](http://docs.confluent.io/1.0。1/schema-registry/docs/index.html)。 – vlahmot
私はSchema Registryを見ました.CafkaバックエンドアーキテクチャにRESTfulインターフェイスを壊すのは非常に奇妙です。なぜあなたのクライアントはあなたのスキーマストリームと直接対話できないのでしょうか?それは、馬のチームと一緒に車のシャーシを引っ張るようなものです。確かに、カフカストリームをすでに消費しているこのようなユースケースの場合、スキーマを取得するためにRESTful呼び出しを行うことは望ましくありません。 –
私は自動スキーマの進化とデータ破損からの保護のためにそれが好きでした。スキーマへの参照のみが格納され、各データポイントでの完全なスキーマは格納されないという事実もまた素晴らしいです。スキーマをフェッチするためのWeb呼び出しを追加することは、私たちにとって問題ではありませんでした。 – vlahmot