【发布时间】: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