【问题标题】:A kafka record is acknowledged but no data returned to consumer确认 kafka 记录,但没有数据返回给消费者
【发布时间】:2019-05-31 13:54:44
【问题描述】:

有 3 个节点的 Kafka(版本 2.2.0)集群。一个节点人为地变得不可用(网络断开)。然后我们有以下行为:

  1. 我们将记录发送给具有给定主题分区的生产者(发送到特定分区,比如 #0)。

  2. 我们从制作者那里收到记录元数据,确认它已被确认。

  3. 之后,我们立即轮询分配给同一主题分区的消费者和从记录元数据中获取的偏移量。轮询超时设置为 30 秒。不返回数据(返回空集)。

这种情况不时发生不一致(在描述的情况下,一个 Kafka 节点发生故障)。

基本上我的问题是:是否应该立即为消费者提供数据?如果不是,那么合理的超时时间是多少?

UPD:一些配置细节:

  • 主题的分区数:1
  • 默认复制因子:3
  • 同步复制因子:2
  • 生产者确认:全部

【问题讨论】:

  • 视情况而定。你能分享你的配置吗?具体来说:主题的分区数(您要发送到特定分区吗?)、复制因子、生产者上的“acks”设置、“isolation.level”或任何非默认值。还有kafka版本。
  • @RobertBräutigam 我已经用要求的详细信息更新了我的问题。我没有提到acks和隔离级别,因为它们是默认的并且没有改变。

标签: apache-kafka


【解决方案1】:

生产者上acks的默认设置是1。这意味着生产者只等待来自领导者副本的确认。如果leader在确认后立即死亡,消息将不会被传递。

是否应该立即为消费者提供数据?是的,一般来说,默认情况下应该有很少的延迟,应该在默认情况下有效地在毫秒范围内并且没有负载。

如果要确保消息不会丢失,除了 min.insync.replicas=2 之外,还必须将生产者配置为“acks=all”。这将确保所有同步副本都确认消息,并且至少有 2 个节点会这样做。因此,您仍然可以丢失一个节点并且没事。丢失 2 个节点,您将无法发送,但即便如此,消息也不会丢失。

【讨论】:

  • 我刚刚检查过,实际上我们将生产者的acks 设置为all。很抱歉,我最初没有注意到这一点。
  • (顺便提一下,你的回答对我来说还是很有价值的,所以我已经+1了)
  • 好的,可能还有其他问题,很难通过 cmets 进行调试 :) 例如:您是否处于负载状态,或者您只是发送一条有时无法传递的消息?您是指定分区,还是让它自动分配?是否有多个消费者,如果是,他们是否有相同的 id?消息是否真的到达了主题,或者甚至没有到达那么远? (不?)幸运的是,有一百种方式可以使用/配置 Kafka。
  • 1) 无负载,只发送一条消息。我相信消息已经传递,因为我们收到了一个带有新偏移量的 RecordMetadata。 2) 明确指定分区。 3)有多个消费者,但他们在不同的实例上;都具有不同的唯一组 ID。 4)我相信消息到达了,因为正如我之前提到的,我们在 ack 中收到了一个新的偏移量。信息。
  • P.S.这个问题并不一致。此外,消息可供消费者使用的时间差异很大:在大多数情况下,它在 2 秒内,但也有 20、30 秒等的延迟。但显然增加轮询延迟不是解决方案。
猜你喜欢
  • 2019-05-11
  • 2017-09-22
  • 1970-01-01
  • 1970-01-01
  • 2021-04-25
  • 1970-01-01
  • 2019-11-21
  • 2021-06-29
  • 1970-01-01
相关资源
最近更新 更多