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

时间:2018-05-25 00:43:44

标签: apache-kafka

背景:
我们之前使用过hibernate搜索,Lucene和jboss hornetq队列进行索引。

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

现在我们想要消除以数据库为中心的索引方法。我们决定使用kafka而不是hornetq。

用户创建数据时没有问题。

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

注意:我们必须采用这条路线,因为您知道索引中没有更新,而是删除然后插入。

问题:

  1. 如果我采用上述方法,我该如何映射具体的 topic1中显示的消息以及topic2中的特定消息。是 有没有办法在topic1和topic2中提供相同的消息ID?

  2. 如果我使用单个主题,有没有办法解决此问题?

  3. 有没有更好的设计/方法来解决上述问题?

  4. 提前致谢。

1 个答案:

答案 0 :(得分:0)

  
      
  1. 如果我采用上述方法,如何将topic1中的特定消息与topic2中的特定消息进行映射。有没有办法在topic1和topic2中提供相同的消息ID?
  2.   

要在同一Kafka群集中的主题之间映射或加入特定消息,Kafka Stream和KSQL可能是一个很好的方向。你能找到参考here吗?

有很多方法可以使对象成为唯一的,我建议在向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 
    }
});
  
      
  1. 如果我使用单个主题,有没有办法解决此问题?
  2.   

您可以在数据库中创建一个新表(表示A),以存储要发送的完整邮件以进行索引。每次用户创建或更新数据时,消息也将被插入/更新到表A.最后,您的Kafka客户端从表A中提取消息对象,并生成Kafka集群中的唯一主题。

  
      
  1. 有没有更好的设计/方法来解决上述问题?
  2.   

你能不能像我上面提到的那样尝试Kafka Stream和KSQL。