在c#中使用不同模式的avro genericrecords之间迁移的最快方法是什么?

ttvkxqim  于 2021-06-04  发布在  Kafka
关注(0)|答案(0)|浏览(295)

我正在使用c#的官方avro库,并试图整理一些概念证明来说明如何将genericord从一个模式迁移到另一个模式。
在我的示例中,假设我们有3个模式:a、b和c。b与a向后兼容,c与b向后兼容,但c与a向后兼容。如果我的术语有误,基本上,a可以迁移到b,b到c,但不能直接迁移到c。
我想做的是编写一个小方法,将a迁移到b,然后将b迁移到c,并返回结果,但是,我担心我的方法有点慢,可能需要一些关于如何“正确”执行此操作的建议。
这是我的基本类,它接受一个avro.schema数组,并在9秒内对一个小记录执行大约100万次转换(我知道这不科学,我只是希望得到一些基本的优化):

public class SchemaAdapter
{
    private readonly Tuple<Schema, Schema>[] migrations; 

    public SchemaAdapter(params Schema[] schemas)
    {
        migrations = new Tuple<Schema, Schema>[schemas.Length - 1];
        for (int i = 0; i < schemas.Length - 1; i++)
        {
            migrations[i] = Tuple.Create(schemas[i], schemas[i + 1]);
        }
    }

    public SchemaAdapter(Schema from, Schema to) : 
        this(new Schema[] { from, to })
    {
    }

    public GenericRecord Adapt(GenericRecord record)
    {
        var result = record;
        for (int i = 0; i < migrations.Length; i++)
        {
            var stream = new MemoryStream(result.ToByteArray());
            var decoder = new BinaryDecoder(stream);
            var reader = new GenericReader<GenericRecord>(migrations[i].Item1, migrations[i].Item2);
            result = reader.Read(null, decoder);
        }
        return result;
    }
}

我很想找到一种方法,不使用genericord类,只使用字节数组就可以处理这些类型的操作。我觉得那会很理想。你有没有想过我该怎么改进?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题