Ignite与卡夫卡整合

Ignite与卡夫卡整合,ignite,Ignite,我正在尝试Ignite和Kafka集成,以将Kafka消息引入Ignite缓存 我的消息键是一个随机字符串(要使用Ignite,kafka消息键不能为null),该值是Person的json字符串表示形式(java类) 当Ignite收到这样一条消息时,看起来Ignite将使用消息的键(在我的例子中是随机字符串)作为缓存键 是否可以将消息密钥更改为个人id,以便我可以将消息放入缓存 看起来拖缆接收器(新的StreamReceiver)是可行的 streamer.receiver(

我正在尝试Ignite和Kafka集成,以将Kafka消息引入Ignite缓存

我的消息键是一个随机字符串(要使用Ignite,kafka消息键不能为null),该值是Person的json字符串表示形式(java类)

当Ignite收到这样一条消息时,看起来Ignite将使用消息的键(在我的例子中是随机字符串)作为缓存键

是否可以将消息密钥更改为个人id,以便我可以将消息放入缓存

看起来
拖缆接收器(新的StreamReceiver)
是可行的

        streamer.receiver(new StreamReceiver<String, String>() {
            public void receive(IgniteCache<String, String> cache, Collection<Map.Entry<String, String>> entries) throws IgniteException {
                for (Map.Entry<String, String> entry : entries) {
                    Person p = fromJson(entry.getValue());
                    //ignore the message key,and use person id as the cache key
                    cache.put(p.getId(), p);
                }
            }
        });
streamer.receiver(新的StreamReceiver(){
public void receive(IgniteCache缓存、集合项)引发IgniteException异常{
对于(Map.Entry:entries){
Person p=fromJson(entry.getValue());
//忽略消息键,并使用person id作为缓存键
cache.put(p.getId(),p);
}
}
});

这是推荐的方式吗?我不确定在StreamReceiver中调用cache.put是否正确,因为这只是写入缓存之前的一个预处理步骤。

Data streamer会将所有密钥映射到缓存关联节点,创建批条目并将批发送到关联节点。在它之后,
StreamReceiver
将接收您的条目,获取
Person
的ID并调用
cache.put(K,V)
。将条目引导映射到相应的缓存关联节点,并将更新请求发送到此节点

一切看起来都很好。但是,从Kafka映射随机密钥的结果和映射
Person
的ID的结果将不同(很可能是不同的节点)。因此,由于冗余网络跳数,您的性能将很差

不幸的是,当前的
KafkaStreamer
实现不支持流元组提取器(参见例如
StreamSingleTupleExtractor
class)。但您可以使用现有的卡夫卡拖缆实现作为示例轻松创建自己的卡夫卡拖缆实现


您还可以尝试使用
KafkaStreamer
keydecover
valDecoder
从Kafka消息中提取
人员的ID。我不确定,但它会有帮助。

谢谢@a_gura提供的有用答案!