【问题标题】:Avro messages within Avro messages: reasonable?Avro 消息中的 Avro 消息:合理吗?
【发布时间】:2018-08-24 21:49:50
【问题描述】:

我想用 Kafka 和 avro 做一些疯狂的事情。有人把我从壁架上说出来:

record Bundle {
   string key;
   array<bytes> msgs;
}

生产者单独序列化一堆共享一个密钥的消息,然后序列化一个包并发布到一个主题。

通过启动参数配置一个通用的 Flattener 服务来监听 1...n 个包含捆绑包的 kafka 主题,然后一次一个地盲目地将捆绑的消息转发到配置的输出主题。 (盲目的意思是它从数组中取出字节并将它们放在线上。)

用例:

我有响应小操作(更新记录、删除记录等)的服务。有时,我希望需要保证的批量操作不会与同一密钥的其他操作交错。

为了实现这一点,我的想法是在每个相关服务的前面放置一个 Flattener。正常的一次性命令存储在 1-item 包中,真正的批处理被捆绑到更大的包中。

我没有为内部消息使用特定的字段类型,因为我希望能够在所有地方重复使用 Flattener

这有任何意义吗?潜在的缺点?

编辑:

Flattener 服务的每个实例只会传递最终消费者已知类型的消息,其中嵌入了 schema_id。

数组不是特定类型数组的唯一原因是我希望能够在多个不同的服务(刚开始使用不同的环境变量/命令行参数)之前不改变地重复使用 Flattener。

【问题讨论】:

  • 潜在缺点:消费者无法验证该内部字段内的模式演变。
  • @cricket_007 为什么不呢?当然不是压平机,但最终消费者不能做所有正常的事情吗?还是这就是问题所在——它可以在没有验证的情况下通过一个跃点?
  • 消费者不知道msgs 应该是Avro。您需要将您的反序列化器作为每个消费者类的一部分发布
  • @cricket_007 我很困惑。最终消费者不会读取 msgs 数组。 Flattener 从数组中挑选每个味精并将其粘贴到最终消费者的第二个主题中。 Flattener 可能会重复一条无法正确反序列化的消息,但这与它无关。
  • 考虑到我看不到这个“Flattener”类,我想我不明白它的目的。从长远来看,您是在 Avro 中发送字节。如果这些字节恰好是 Avro,那很好,但与使用 Schema Registry 相比,您将通过传送必要的模式以及该数据来支付网络带宽的损失。

标签: apache-kafka avro


【解决方案1】:

我将把我的评论移到一个答案上,因为我认为“说服你离开壁架”是合理的;)

如果您设置了Producer&lt;String, GenericRecord&gt;(根据需要更改 Avro 类),您已经有一个 String 键和 Avro 字节作为值。这样,你就不需要嵌入任何东西了

【讨论】:

    猜你喜欢
    • 2023-03-25
    • 2018-12-30
    • 2016-08-28
    • 2016-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多