我有一个特殊的情况,我需要确保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
。
发布于 2022-06-13 14:31:33
确保父键的所有消息都指向特定的分区。
Partitioner
将是正确的方法。
方法同时划分可能的键和值。但是,它也表示它们都可以是空的。
如果您完全控制生产者使用分区,这不应该是一个问题。我不认为键和值都是空的,至少在需要非空键的状态存储区是不可能的。
如果您构建简单字符串parent:pk
之类的键,那么使用ReadOnlyKeyValueStore#prefixScan
,这将允许您获取特定父前缀的所有数据,在此之后,您将需要检查返回的迭代器的值,以进行任何进一步的筛选/查找。
https://stackoverflow.com/questions/72604196
复制相似问题