即使生产者得到认可,消息是否也会在Kafka中发生丢失?

时间:2019-09-18 07:47:17

标签: apache-kafka kafka-producer-api

Kafka doc说:

  
      
  • Kafka在很大程度上依赖于文件系统来存储和缓存消息。
  •   
  • 现代操作系统提供了预读和后写技术,这些技术可以以大块倍数预取数据,并将较小的逻辑写入分组为大型物理写入。
  •   
  • 现代操作系统在将主内存用于磁盘缓存方面变得越来越积极。当回收内存时,现代操作系统会很乐意将所有可用内存转移到磁盘缓存中,而对性能的影响很小。所有磁盘读写都将通过此统一缓存
  •   
  • ...而不是在内存不足时尽可能地在内存中维护并将所有内存刷新到文件系统,而是将其反转。所有数据都会立即写入文件系统上的持久日志中,而不必刷新到磁盘。实际上,这仅意味着将其转移到内核的页面缓存中。”
  •   

另外this article说:

  

(3)当所有同步副本均已将其应用于日志时,该消息为“已提交”,并且(4)只要至少一个同步副本仍处于活动状态,任何已提交的消息都不会丢失。

因此,即使我为生产者配置了acks=all(在所有代理提交消息之后,都会导致生产者收到确认),并且生产者收到了某些消息的确认,这是否意味着他们仍然有可能获得消息丢失,尤其是如果所有代理都崩溃并且操作系统从未将已提交的消息缓存刷新到磁盘上?

1 个答案:

答案 0 :(得分:2)

使用acks=all且主题的复制因子> 1时,仍然有可能丢失已确认的消息,但可能性很小。

例如,如果您有3个副本(且所有副本都是同步的),并且使用acks=all,则您需要同时丢失所有3个经纪人,然后再花时间进行实际的交易。写入磁盘。使用acks=all,一旦所有同步副本均收到该消息,就发送确认信息,例如,您可以确保此数字保持较高,例如min.insync.replicas=2

如果您使用rack awareness feature(显然经纪人实际上在不同的机架或什至是更好的数据中心),则可以进一步降低这种情况的可能性。

总而言之,使用所有这些选项,您可以充分降低丢失数据的可能性,以免发生这种情况。

相关问题