Java 卡夫卡同步发送vs机上请求

Java 卡夫卡同步发送vs机上请求,java,apache-kafka,kafka-producer-api,Java,Apache Kafka,Kafka Producer Api,如果我使用同步发送消息- producer.send(myRecord).get(); 我是否保证消息将以与发送相同的顺序到达相应的分区 或者我仍然需要设置max.in.flight.requests.per.connection=1 (当前max.in.flight.requests.per.connection设置为大于1,因此我需要在建议将其设置为1之前明确这一点,只有在需要时才可以。只有在强制的情况下,我才可以建议将其设置为1) 我目前的理解是- producer.send(myRec

如果我使用同步发送消息-

producer.send(myRecord).get();
我是否保证消息将以与发送相同的顺序到达相应的分区

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

(当前max.in.flight.requests.per.connection设置为大于1,因此我需要在建议将其设置为1之前明确这一点,只有在需要时才可以。只有在强制的情况下,我才可以建议将其设置为1)

我目前的理解是-

producer.send(myRecord).get();

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

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


你说得对,制作人。send()。get()应该确保订购。另一种确保排序的方法是设置max.in.flight.requests.per.connection=1,这允许您异步发送消息,批处理可以起作用,因此效率更高。

但是,我重复一遍,
producer.send(myRecord.get()在成功或失败之前不会返回。那么飞机上的设置对同步发送有什么影响呢。对于给定的生产者,只有一个连接(对吗?)被
.send().get()
使用。不,应用程序和Kafka代理之间没有任何同步结构。卡夫卡经纪人处理的情况是内部的。它有ISR列表来检查引导者和跟随者分区的状态,并且每条消息都有内部ID。ISR列表和消息ID Kafka的功能可以确定哪个消息已提交或未提交。通过重试机制,它尝试在内部发送消息。+1,我理解
max.in.flight.requests.per.connection
的含义。但我不明白的是,当
.send().get()
阻塞线程时——不能尝试传递其他消息(除非同一个生产者在多个线程中使用,在这种情况下,我同意Alan的观点。)但在单线程情况下——只需执行
.send().get()
就可以确保排序。是的,但是多实例呢?同时使用单线程和多实例?它不能那样做。因为卡夫卡经纪人的工作是分布式的。多分区、多复制和多实例。正因为如此,它不能。有很多技术可以做到这一点。但这不是我们的背景。Kafka是分布式的,应用程序也可以在多实例上运行。这就是我想告诉你的。使用Kafka时,请忘记面向对象编程或函数式编程。这是分布式计算。与其他人完全不同。我理解
max.in.flight.requests.per.connection
这件事。但我不明白的是,当
.send().get()
阻塞线程时——不能尝试传递其他消息(除非同一个生产者在多个线程中使用,在这种情况下,我同意Alan的看法。)但在单线程情况下——只需执行
.send().get()
即可确保排序。
生产者.send().get()应确保排序符合要求+1.唯一可能导致问题的地方是当同一生产者跨多个线程使用时。。但这是我们自己的分析。