[英]Kafka Partitioner using value instead of key
我有一个特殊情况,我需要确保parent
键的所有消息都转到特定分区。 假设键的以下属性
pk
: UUID
和价值
parent
: String
name
: String
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.