ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

kafka 生产者(下)

2022-08-10 14:05:21  阅读:217  来源: 互联网

标签:生产者 数据 应答 kafka 保证数据 Leader


保证数据的可靠性、数据的传递语义、幂等性、事务

生产者-数据的可靠性

ACKS

  • 0: 生产者发送过来的数据,不需要等数据落盘应答。

  • 1: 生产者发送过来的数据,Leader收到数据后应答。

应答完成后,还没开始同 步副本,Leader挂了,新的Leader不会 收到Hello的信息, 因为生产者已经 认为发送成功了

  • -1(all): 生产者发送过来的数据,Leader+和isr队列 里面的所有节点收齐数据后应答。-1和all等价。

数据完全可靠条件 = ACK级别设置为-1 + 分区副本大于等于2 + ISR里应答的最小副本数量大于等于2

可靠性总结:

acks=0,生产者发送过来数据就不管了,可靠性差,效率高;

acks=1,生产者发送过来数据Leader应答,可靠性中等,效率中等;

acks=-1,生产者发送过来数据LeaderISR队列里面所有Follwer应答,可靠性高,效率低;

生产环境使用场景:

在生产环境中,acks=0很少使用;acks=1,一般用于传输普通日志,允许丢个别数据;acks=-1,一般用于传输和钱相关的数据, 对可靠性要求比较高的场景。

那么ACKS 为-1 会存在什么问题?

leader 没有同步完成挂掉了,新的leader 确包含消息,而生产者却重新发送消息,就会导致消息的重复。

生产者-数据的传递性语义:

  • 至少一次(AtLeastOnce) : At Least Once可以保证数据不丢失,但是不能保证数据不重复

ACK级别设置为-1+分区副本大于等于2+ISR里应答的最小副本数量大于等于2

  • 最多一次(AtMostOnce): At Most Once可以保证数据不重复,但是不能保证数据不丢失。

ACK级别设置为0

  • 精确一次(Exactly Once):

    对于一些非常重要的信息,比如和钱相关的数据,要求数据既不能重复也不丢失。 Kafka 0.11版本以后,引入了一项重大特性:幂等性和事务。

生产者-幂等性:

幂等性就是指Producer不论向Broker发送多少次重复数据,Broker端都只会持久化一条,保证了不重复。

精确一次(Exactly Once) = 幂等性 + 至少一次( ack=-1 + 分区副本数>=2 + ISR最小副本数量>=2) 。

重复数据的判断标准:

具有<PID, Partition, SeqNumber>相同主键的消息提交时,Broker只会持久化一条。

  • PID是Kafka每次重启都会分配一个新的;
  • Partition 表示分区号;
  • Sequence Number是单调自增的。

所以幂等性只能保证的是在单分区单会话内不重复。

开启幂等性:

开启参数 enable.idempotence 默认为 true,false 关闭。

生产者-事务:

幂等性只保证单分区,单会话才会不丢失数据,一旦kafka重启,还会有数据同步问题。

生产者-数据有序性

单分区内,数据有序

解决乱序问题:

1)kafka在1.x版本之前保证数据单分区有序,条件如下: max.in.flight.requests.per.connection=1(设置缓存的个数)(不需要考虑是否开启幂等性)。

2)kafka在1.x及以后版本保证数据单分区有序,条件如下:

(1)未开启幂等性max.in.flight.requests.per.connection需要设置为1

(2)开启幂等性max.in.flight.requests.per.connection需要设置小于等于5

原因说明:因为在kafka1.x以后,启用幂等后,kafka服务端会缓存producer发来的最近5个request的元数据, 故无论如何,都可以保证最近5个request的数据都是有序的。

参考:

https://www.modb.pro/db/111263

https://www.infoq.cn/article/kafka-analysis-part-8

标签:生产者,数据,应答,kafka,保证数据,Leader
来源: https://www.cnblogs.com/shix0909/p/16572121.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有