生产者:
kafka生产者在发送数据的时候,通常会有同步与异步发送,异步就是缓存部分数据, 达到一定条数或时间后批量发送,效率高效。
那么,不管同步还是异步,消息是否发送成功,Kafka通过acks这个参数来控制的:
0—表示不进行消息接收是否成功的确认;
1—表示当Leader接收成功时确认;
-1(all)—表示Leader和Follower都接收成功时确认;
通常为了兼顾效率与数据安全,将acks设置为1,只让每个分区的leader确认收到消息即可,不等副本是否同步数据完毕。
那么,在生产者发送数据到kafka后,如果返回成功的时候,由于网络等原因出现异常, 那么生产者是收不到成功信号的,会重发,导致消息重复
那么kafka如何解决生产者发送重复消息呢?
引入幂等性:kafka producer在进行retry重试时,只会生成一个消息。
幂等性实现:PID和Sequence Number
为了实现Producer的幂等性,Kafka引入了Producer ID(即PID)和Sequence Number。 PID:每个新的Producer在初始化的时候会被分配一个唯一的PID,这个PID对用户是 不可见的。
Sequence Numbler:(对于每个PID,该Producer发送数据的每个<Topic, Partition> 都对应一个从0开始单调递增的Sequence Number。
Broker端在缓存中保存了这seq n