卡夫卡主题中的唯一消息检查

时间:2019-07-30 13:04:10

标签: apache-kafka logstash

我们使用Logstash,我们想从Oracle数据库中读取一张表,并将这些消息(如下所示)发送给Kafka:

Topic1: message1: {"name":"name-1", "id":"fbd89256-12gh-10og-etdgn1234njF", "site":"site-1", "time":"2019-07-30"}
        message2: {"name":"name-2", "id":"fbd89256-12gh-10og-etdgn1234njG", "site":"site-1", "time":"2019-07-30"}
        message3: {"name":"name-3", "id":"fbd89256-12gh-10og-etdgn1234njS", "site":"site-1", "time":"2019-07-30"}
        message4: {"name":"name-4", "id":"fbd89256-12gh-10og-etdgn1234njF", "site":"site-1", "time":"2019-07-30"}

请注意,message1message4same ID number重复。

现在,我们希望确保所有消息都是唯一的,那么如何过滤topic1并唯一化所有消息然后发送到topic2

我们想要的最终结果:

Topic2: message1: {"name":"name-1", "id":"fbd89256-12gh-10og-etdgn1234njF", "site":"site-1", "time":"2019-07-30"}
        message2: {"name":"name-2", "id":"fbd89256-12gh-10og-etdgn1234njG", "site":"site-1", "time":"2019-07-30"}
        message3: {"name":"name-3", "id":"fbd89256-12gh-10og-etdgn1234njS", "site":"site-1", "time":"

1 个答案:

答案 0 :(得分:0)

这称为一次精确处理

您可能会对Kafka FAQ的第一部分感兴趣,该部分描述了有关如何避免在数据生产中重复的一些方法(例如,在生产者方面):

  

语义一度只有两个部分:避免在数据期间重复   生产,并避免在数据消耗期间重复。

     

有两种方法可以在数据期间精确获取一次语义   生产:

     
      
  1. 每个分区以及每次访问网络时都使用一个写入器   错误检查该分区中的最后一条消息,以查看您的最后一条消息   写成功
  2.   
  3. 在主目录中包含主键(UUID或其他内容)   消息并在消费者上进行重复数据删除。
  4.   
     

如果您执行以下任一操作,则Kafka托管的日志将为   无重复。但是,没有重复的阅读取决于   也来自消费者的合作。如果消费者定期   检查它的位置,然后如果它失败并重新启动它将   从检查点位置重新启动。因此,如果数据输出和   检查点不是原子写的,将有可能得到   在这里也重复。此问题特定于您的存储   系统。例如,如果您使用的是数据库,则可以提交   这些一起进行交易。 HDFS加载程序Camus LinkedIn   对于Hadoop负载,Write做了类似的事情。另一种选择   不需要交易的是将偏移量与   使用主题/分区/偏移量加载和删除重复数据   组合。

     

我认为有两项改进可以使这变得容易得多:

     
      
  1. 生产商幂等可以自动完成,而且成本更低   通过有选择地在服务器上集成对此的支持。
  2.   
  3. 现有   高水平的消费者不会暴露很多更细粒度的   控制偏移量(例如重置您的位置)。我们将努力   不久之后
  4.   

另一个选择(并非完全符合您的要求)是日志压缩。假设重复的消息具有相同的密钥,则日志压缩策略有效时,日志压缩最终将删除重复项。