Kakfa生产者消息传递,带有acks = all和同花顺

时间:2019-05-07 09:10:32

标签: apache-kafka kafka-producer-api

使用“ acks = all”配置创建Kafka Producer。

使用上述配置调用flush有什么意义吗?

在将刷新发送给代理之前,它将等待调用刷新。

AS

  

acks = all这意味着领导者将等待全套同步中   副本以确认记录。这样可以保证记录   只要至少保留一个同步副本,就不会丢失   活。这是最有力的保证。这是等效的   到acks = -1设置。

2 个答案:

答案 0 :(得分:3)

按照documentation

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}},则将阻止任何进一步的发送,直到生产者从代理获得确认为止。因此,这两个之间的关系非常微妙。

我希望这会有所帮助!