Producer写消息的机制

Producer的三种ACK机制

acks参数指定了必须要有多少个分区副本收到消息,生产者才认为该消息是写入成功的,这个参数对于消息是否丢失起着重要作用,可以选择三种模式:

  • acks=0: 不用等broker返回响应,就代表生产者成功写入消息(可能会存在数据丢失)。 提供了最低的延迟,但是最弱的数据持久保障。当服务器发生故障时,就很可能发生数据丢失。例如leader已经挂了,producer不知情,还会继续发送消息,broker接收不到数据就会数据丢失。由于不需要等到服务器的响应,所以可以以网络支持的最大速度发送消息,从而达到很高的吞吐量。

  • acks=1:等leader返回响应(可能会存在部分数据丢失)。 意味着producer要等待leader成功收到数据并得到确认,才发送下一条message。此选项提供了较好的持久性和较低的延迟性。但如果Partition的Leader挂了,follwer尚未来得及复制,数据就会丢失

    image-20220116153332081

  • acks=all: Leader和replicas都返回响应(无数据丢失)。只有所有参与复全部收到消息时,生产者才会接收到来自服务器的响应. 这种模式是最高级别的,也是最安全的,可以确保不止一个Broker接收到了消息. 该模式的延迟会很高.

image-20220116154356435

acks-all必须和min.insync.replicas结合使用,参考下面部分

最小同步副本(in-sync-replicas)

Kafka的Broker端提供了一个参数min.insync.replicas,该参数控制的是消息至少被写入到多少个副本才算是"真正写入”, 该值默认值为1,生产环境设定为一个大于1的值可以提升消息的持久性。

  • min.insync.replicas可以在broker级别设置,也可以在topic级别单独设置
  • min.insync.replicas = 2表示最少有两个broker有数据。如果此时使用了replication.factor=3, min.insync=2, acks=all, 则只能允许一个broker挂掉,不然producer在发送数据时会报错

Producer消息分发策略

消息是 Kafka 中最基本的数据单元。在 Kafka 中,一条消息由 keyvalue 两部分组成,key 和 value 值都可以为空。

这里的 key 有什么用呢? 当我们在发送一条消息时,我们可以指定这个 key ,那么 producer 则会根据 key 和 partition 机制,来判断当前这条消息应该发送并存储到哪个 partition 中。

如果指定key,这样就会写到固定的partition上。如果没有指定key,则使用round robin方式:

image-20201206074615098