【问题标题】:Kafka syncronous send vs inflight requestsKafka 同步发送与飞行中的请求
【发布时间】:2021-04-26 15:59:52
【问题描述】:

如果我使用 -

同步发送消息
producer.send(myRecord).get();

我是否保证消息会按照发送的顺序到达各个分区?

或者我还需要设置max.in.flight.requests.per.connection=1

(当前 max.in.flight.requests.per.connection 设置为大于 1,因此我需要先明确这一点,然后才能建议将其设置为 1,仅在需要时。我必须仅当它是强制性的时才推荐它。

我目前的理解是——

producer.send(myRecord).get();

还将负责重试。直到第一个成功或 N 次重试失败后才会处理下一条记录。只有在第一条记录失败或成功后,第二条记录才会被处理/发送给代理。

【问题讨论】:

  • 我理解max.in.flight.requests.per.connection 的事情。但我不明白的是,当.send().get() 阻塞线程时 - 无法尝试传递其他消息(除非在多个线程中使用相同的生产者,在这种情况下我同意艾伦的观点。)但是在单线程中情况 - 只是做.send().get() 应该确保订购。

标签: java apache-kafka kafka-producer-api


【解决方案1】:

你是对的,producer.send().get() 应该确保排序。确保排序的另一种方法是设置 max.in.flight.requests.per.connection=1,这允许您异步发送消息,并且可以启动批处理,因此效率更高。

【讨论】:

  • producer.send().get() should ensure ordering - 答案。 +1。这可能导致问题的唯一地方是跨多个线程使用相同的生产者..但这适用于自己的分析。
【解决方案2】:

不,您不能保证消息会以相同的顺序到达相关分区。因为“max.in.flight.requests.per.connection”配置的默认值为 5。 如果你没有设置1,那将尝试5次。在此过程中,您可能会丢失正确的排名。 这里有一些参考;

https://docs.confluent.io/platform/current/installation/configuration/producer-configs.html#producerconfigs_max.in.flight.requests.per.connection

https://docs.confluent.io/platform/current/installation/configuration/producer-configs.html#producerconfigs_max.in.flight.requests.per.connection

【讨论】:

  • 但是,我再说一遍,producer.send(myRecord).get(); 在成功或失败之前不会返回。那么机上设置对同步发送有何影响。对于给定的生产者,只有一个连接(对吗?)并且被 .send().get() 用完。
  • 不,您的应用程序和 Kafka Broker 之间没有任何同步结构。 Kafka经纪人处理这种情况是在内部。它有 ISR 列表来检查 Leader 和 Follower 分区的状态,并且每条消息都有内部 ID。 ISR 列表和消息 ID 的力量 Kafka 可以确定哪些消息已提交或未提交。并通过重试机制尝试在内部发送消息。
  • +1,我理解max.in.flight.requests.per.connection 的事情。但我不明白的是,当.send().get() 阻塞线程时 - 无法尝试传递其他消息(除非在多个线程中使用相同的生产者,在这种情况下我同意艾伦的观点。)但是在单线程中情况 - 只是做.send().get() 应该确保订购。
  • 是的,但是多实例呢?单线程和多实例同时?它不能那样做。因为 Kafka Broker 是分布式工作的。多分区、多复制和多实例。因此它不能。
  • 有很多技术可以做到这一点。但这不是我们的背景。 Kafka 分布式工作,应用程序也可以在多实例上运行。这就是我想告诉你的。当您使用 Kafka 时,请忘记面向对象编程或函数式编程。它是分布式计算。与其他人完全不同。
猜你喜欢
  • 1970-01-01
  • 2018-04-21
  • 2017-03-22
  • 2018-06-02
  • 2015-02-10
  • 1970-01-01
  • 2018-01-13
  • 2019-12-11
  • 2020-04-21
相关资源
最近更新 更多