繁体   English   中英

Kafka Partitioner 使用值而不是键

[英]Kafka Partitioner using value instead of key

我有一个特殊情况,我需要确保parent键的所有消息都转到特定分区。 假设键的以下属性

  • pkUUID

和价值

  • parentString
  • nameString
  • familyName名称: String
  • 等等

以前我已经实现了其他分区器,但我总是能够从关键部分获取相关信息。 接口org.apache.kafka.clients.producerPartitioner显示方法分区的可能性键和值。 但是,它也表示它们都可能为空。

我问这个是因为稍后流的内容也会被加载到物化视图中。 这个视图应该允许搜索“pk”。 如果我也将parent属性包含在键中,我将无法再搜索pk ,除非我也有parent

以下是我在流处理拓扑中设置物化视图的方法:

KTable<MyObjectKey, MyObjectValue> myObjects = builder
  .table("topicName", Consumed.with(myObjectKeySerde, myObjectValueSerde),
         Materialized.<MyObjectKey, MyObjectValue, KeyValueStore<Bytes, byte[]>>as("viewName")
           .withKeySerde(myObjectKeySerde)
           .withValueSerde(myObjectValueSerde));

稍后我可以像访问它一样访问它

final MyObjectKey pk = MyObjectKey.newBuilder().setUUID(... UUID searched for).build();
final ReadOnlyKeyValueStore<MyObjectKey, MyObjectValue> store =
  streamsBuilderFactoryBean.getKafkaStreams()
    .store( fromNameAndType("viewName", keyValueStore()));
MyObjectValue value = store.get(pk);

理论上可以使用范围查询,然后允许我在键中包含parent级。 然后我会从pk + 00000000-0000-0000-0000-000000000000搜索到pk + ffffffff-ffff-ffff-ffff-ffffffffffff

确保父键的所有消息都转到特定分区

Partitioner器将是做到这一点的正确方法。

方法划分可能性键和值。 但是,它也表示它们都可能为空

如果您可以完全控制使用 Partitioner 的生产者,那应该不是问题。 我不认为键和值都可以为空,至少对于需要非空键的状态存储来说是这样。


如果您构建诸如简单字符串parent:pk之类的键,则使用ReadOnlyKeyValueStore#prefixScan ,这应该允许您获取特定父前缀的所有数据,之后,您需要检查返回的迭代器的任何值更多过滤/查找。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM