使用“ acks = all”配置创建Kafka Producer。
使用上述配置调用flush有什么意义吗?
在将刷新发送给代理之前,它将等待调用刷新。
AS
acks = all这意味着领导者将等待全套同步中 副本以确认记录。这样可以保证记录 只要至少保留一个同步副本,就不会丢失 活。这是最有力的保证。这是等效的 到acks = -1设置。
答案 0 :(得分:3)
flush():
调用此方法可使所有缓冲的记录立即可用 发送(即使linger_ms大于0)并在 与这些记录相关的请求的完成。的 flush()的后置条件是,任何先前发送的记录将具有 完成(例如Future.is_done()== True)。请求被认为 当根据 生产者的“ acks”配置,否则会导致错误。
其他线程可以继续发送消息,而一个线程处于 阻止等待冲洗呼叫完成;但是,不能保证 关于刷新调用后发送的消息的完成情况 开始。
flush()仍将阻止客户端应用程序,直到发送所有消息(即使ack = 0)。唯一的事情是它不会等待确认,只有在缓冲区发送出去之前,该块才会出现。
带有ack = all的flush()保证消息已发送,并已以所需的复制因子复制到群集中。
最后,回答您的问题:在将刷新发送给经纪人之前,它会等待调用刷新吗??
答案:不一定。生产者保持发送消息的时间间隔或的批次大小(The buffer.memory controls the total amount of memory available to the producer for buffering)。但是,最好使用flush()确保发送所有消息。
有关更多信息,请参阅此link。
答案 1 :(得分:3)
让我先尝试指出flush()
和acks
之间的区别,然后再提出两个问题。
flush()
-这是在生产者中调用的一种方法,用于将消息从生产者端维护的缓冲区(可配置)推送到代理。您可以调用此方法,也可以调用close()
来将消息从生产者缓冲区发送到代理。如果生产者可用的缓冲存储器已满(如Manoj在其回答中所述),则会自动调用此方法。
acks=ALL
是代理的责任,即,按照生产者请求的设置将消息同步复制到其他代理后,将确认发送回生产者。您将使用此设置来调整消息传递的语义。在这种情况下,一旦消息被复制到指定的同步副本,代理就会将确认发送给生产者,说“我收到了您的消息”。
现在,关于您的问题,即,使用acks设置调用flush是否有意义,以及生产者在发送给代理之前是否将等待flush调用。
好吧,生产者的异步性质将确保生产者不等待。但是,如果您显式调用flush()
或单独调用{{1}},则将阻止任何进一步的发送,直到生产者从代理获得确认为止。因此,这两个之间的关系非常微妙。
我希望这会有所帮助!