【问题标题】:Kafka: Publish message only if it doesn't already existKafka:仅在消息尚不存在时发布消息
【发布时间】:2017-11-09 11:31:00
【问题描述】:

我正在向 Kafka 发布消息,这些消息被许多消费者使用。这些是幂等的,因此一条消息是否被多次使用都没有关系。

但是出于性能原因,我不希望我的(单个)生产者发布队列中已经存在的消息。假设消息只是 ID 字符串,因此很容易检查两条消息是否相等。

我认为 Kafka 并不能单独处理这种性能改进。是否有任何工具或概念可以帮助处理此问题?

【问题讨论】:

  • 您不想发布重复项,因为您不希望它们被多次处理(甚至是幂等的),或者出于什么原因?您不想推送已经处理过的消息,还是只推送未处理的消息?除了 Kafka,你还能容忍哪些基础设施?您是否考虑过使用“压缩”主题?
  • 是的 - 处理它们需要相当长的时间,因此队列中充满了需要时间处理的重复消息 - 这会延迟处理所有重复消息之后的其他消息。所以我的目标是:如果我要发布一条消息,我宁愿检查它是否已经在队列中(位置无关紧要),如果是,我不想发布它。我想我需要研究一下压缩,谢谢。
  • 您是否允许发送已处理并从队列中取出的新消息?或者对于已经处理的消息也应该检测到重复?
  • 是的。已处理的消息可以一次又一次地发布,甚至不得不发布。只是如果队列中已经有一些消息A,我不希望将更多As 发送到队列,因为它们都将被处理,这需要时间并且无济于事,因为它们是幂等的。
  • 是的,那么压缩主题可能会有所帮助 - 只是不要忘记在成功处理后发送具有相同密钥和空负载的消息

标签: java performance scala apache-kafka


【解决方案1】:

Kafka 并不适合归结为大海捞针的任何事情,因为您所能做的就是线性搜索。

在 Kafka 中获得很少超过一次的交付可能最好通过使用具有更好查询支持的外部数据存储来实现(Cassandra 或 Elasticsearch 是这里众多选项中的两个)。然后让生产者检查它要写入的消息是否在该数据存储中,并且您有一个主题的消费者,其唯一目的是将消息写入该数据存储。缺少基于大小的保留和不同消息具有相同密钥的密钥方案,这应该是故障安全的(这意味着我想不出它是怎么回事):你不会错误地决定不写你应该写的消息写。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-17
    • 2016-02-06
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 2021-07-18
    • 1970-01-01
    相关资源
    最近更新 更多