大数据开发:Kafka 异步发送消息可靠性策略

Kafka作为分布式消息队列,对于消息传送有实时传送和异步发送的区别,而异步发送消息,就会涉及到一个很关键的问题,如何保证消息发送的准确性和可靠性。今天的大数据开发学习分享,我们就主要来讲讲Kafka 异步发送消息的可靠性策略。

Kafka消息队列做异步发送时,大致会从3个部分去确保消息的可靠性:

一、 生产者的可靠性保证

回答生产者的可靠性保证,即回答:

发消息之后有没有ack?

发消息收到ack后,是不是消息就不会丢失了?

而Kafka通过配置来指定producer生产者在发送消息时的ack策略:

Request.required.acks=-1 (全量同步确认,强可靠性保证);

Request.required.acks = 1(leader 确认收到, 默认);

Request.required.acks = 0 (不确认,但是吞吐量大)。

如果想实现Kafka配置为 CP(Consistency & Partition tolerance) 系统, 配置需要如下:

request.required.acks=-1

min.insync.replicas = ${N/2 + 1}

unclean.leader.election.enable = false

二、Broker的可靠性保证

消息通过producer发送到broker之后,还会遇到很多问题:

Partition leader 写入成功,follower什么时候同步?

Leader写入成功,消费者什么时候能读到这条消息?

Leader写入成功后,leader重启,重启后消息状态还正常嘛?

Leader重启,如何选举新的leader?

这些问题集中在:消息落到broker后,集群通过何种机制来保证不同副本间的消息状态一致性。

三、Kafka消息备份和同步

Kafka通过分区的多副本策略来解决消息的备份问题。通过HW和LEO的标识,来对应ISR和OSR的概念,用于类比共识性算法解决数据同步一致性的问题。

分区多副本即前文提到的Partition 的replica(副本) 分布在跟 partition 不相同的机器上, 通过数据冗余保证故障自动转移。而不同副本的状态形成了ISR和OSR的概念。

ISR : leader 副本保持一定同步的 follower 副本, 包括 leader 副本自己,叫 In Sync Replica;

AR: 所有副本 (replicas) 统称为 assigned replicas, 即 AR;

OSR: follower 同 leader 同步数据有一些延迟的节点。

ISR是Kafka的同步策略中独有的概念,区别于raft等共识性算法。Raft要求集群中要求N/2+1台正常,其在这种条件下通过复杂的算法保证选举出的新leader符合一致性状态。

而kafka的ISR同步策略,通过ISR列表的可伸缩性和HW&LEO更新,一定程度上解决了消息一致性和吞吐性能之间的平衡。

ISR通过HW和LEO的概念表示消息的同步状态:

HW: Highwatermark,俗称高水位,它表示了一个特定的消息偏移量(offset), 在一个parttion中consumer只能拉取这个 offset 之前的消息(此 offset 跟 consumer offset 不是一个概念) ;

LEO: LogEndOffset, 日志末端偏移量, 用来表示当前日志文件中下一条写入消息的offset;

leader HW: 该Partititon所有副本的LEO最小值;

follower HW: min(follower自身LEO 和 leader HW);

Leader HW = 所有副本LEO最小值;

Follower HW = min(follower 自身 LEO 和 leader HW);

Leader不仅保存了自己的HW & LEO,还保存了远端副本的HW & LEO。

简单来说,每个副本都有HW和LEO的存储,而leader不但保存自己的HW和LEO, 还保存了每个远端副本的LEO,用于在自身的HW更新时计算值。

关于大数据开发学习,Kafka 异步发送消息可靠性策略,以上就为大家做了大致的介绍了。Kafka在消息发送上,为保证可靠性还是有相应的解决方案的,具体到各个端口的策略,还需要更细致地去理解。

你可能感兴趣的:(大数据开发:Kafka 异步发送消息可靠性策略)