Apache kafka 如何识别和合并kafka中不同队列的消息

Apache kafka 如何识别和合并kafka中不同队列的消息,apache-kafka,Apache Kafka,背景: 我们以前使用hibernate搜索、Lucene和jboss hornetq队列进行索引 我们的应用程序是生产者,将元数据(用于识别数据库中记录的唯一数据信息)发送到hornetq。 使用者接收此元数据并查询数据库以获取完整的记录详细信息(包括子对象)。 这是一种更加以数据库为中心的方法 现在,我们希望消除以数据库为中心的索引方法。我们决定用卡夫卡而不是大黄蜂 用户创建数据时没有问题 我们发现,当用户编辑数据(例如,具有两个子对象的父实体)时,存在潜在问题。从数据库中提取数据以供用户显示

背景:
我们以前使用hibernate搜索、Lucene和jboss hornetq队列进行索引

我们的应用程序是生产者,将元数据(用于识别数据库中记录的唯一数据信息)发送到hornetq。 使用者接收此元数据并查询数据库以获取完整的记录详细信息(包括子对象)。 这是一种更加以数据库为中心的方法

现在,我们希望消除以数据库为中心的索引方法。我们决定用卡夫卡而不是大黄蜂

用户创建数据时没有问题

我们发现,当用户编辑数据(例如,具有两个子对象的父实体)时,存在潜在问题。从数据库中提取数据以供用户显示时,
我们将相同的数据推送到卡夫卡主题1。当用户修改数据(比如parenet级别的数据)并提交时。我们只获取父级数据(不获取子对象数据),我们将更改后的数据推送到topic2。现在我们必须将topic1(子对象)中的消息与topic2(父级数据)中的相应消息合并

注意:我们必须采用这种方法,因为您知道索引中没有更新,而是先删除,然后插入

问题:

  • 如果我使用上述方法,我如何映射特定的 主题1中存在的消息与主题2中的特定消息。是 有没有办法在topic1和topic2中提供相同的消息ID

  • 如果我只使用一个主题,有没有办法解决这个问题

  • 是否有更好的设计/方法来解决上述问题

  • 提前谢谢

  • 如果我采用上述方法,我如何将topic1中的特定消息映射到topic2中的特定消息。有没有办法在topic1和topic2中提供相同的消息ID
  • 要在同一Kafka集群中的主题之间映射或连接特定消息,Kafka流和KSQL可能是一个很好的方向。你能找到参考资料吗

    有许多方法可以使对象唯一,我建议在向topic1和topic2发送消息时使用父实体id。示例Java代码如下所示:

    ProducerRecord<String, ParentEntity> record = new ProducerRecord<>(topic1, 
    ParentEntity.getId(), ParentEntity);
    ListenableFuture<SendResult<String, ParentEntity>> future = 
    kafkaTemplate.send(record);
    future.addCallback(new ListenableFutureCallback<SendResult<String, 
    ParentEntity>>() {
        @Override
        public void onSuccess(SendResult<String, ParentEntity> result) {}
    
        @Override
        public void onFailure(Throwable ex) {
            //print out error log 
        }
    });
    
    ProducerRecord<String, ChildEntity> record = new ProducerRecord<>(topic2, 
    ChildEntity.getParentEntityId(), ChildEntity);
    ListenableFuture<SendResult<String, ChildEntity>> future = 
    kafkaTemplate.send(record);
    future.addCallback(new ListenableFutureCallback<SendResult<String, 
    ChildEntity>>() {
        @Override
        public void onSuccess(SendResult<String, ChildEntity> result) {}
    
        @Override
        public void onFailure(Throwable ex) {
            //print out error log 
        }
    });
    
    ProducerRecord记录=新的ProducerRecord(主题1,
    ParentEntity.getId(),ParentEntity);
    可列出的未来=
    kafkaTemplate.send(记录);
    future.addCallback(新ListenableFutureCallback(){
    @凌驾
    成功时公共无效(SendResult结果){}
    @凌驾
    失效时的公共无效(可丢弃的ex){
    //打印出错误日志
    }
    });
    生产记录=新生产记录(主题2,
    getParentEntityId(),ChildEntity);
    可列出的未来=
    kafkaTemplate.send(记录);
    future.addCallback(新ListenableFutureCallback(){
    @凌驾
    成功时公共无效(SendResult结果){}
    @凌驾
    失效时的公共无效(可丢弃的ex){
    //打印出错误日志
    }
    });
    
  • 如果我只使用一个主题,有没有办法解决这个问题
  • 您可以在数据库中创建一个新表(称为a),以存储要发送用于索引的完整消息。每次用户创建或更新数据时,消息也将插入/更新到表A。最后,您的Kafka客户端从表A中提取消息对象,并生成Kafka集群中的唯一主题

  • 是否有更好的设计/方法来解决上述问题

  • 您可以试试我上面提到的Kafka Stream和KSQL吗。

    谢谢您的快速响应。我将尝试您的解决方案,并稍后通知您