kafka(3)
作者:互联网
1.kafka 保证消息的顺序性:
1.一个topic 只对应一个分区 2.发送消息的时候指定 key/partition 2.如何保障kafka数据不丢失: kafka 消息不丢失: 生产端: 1.发送一条消息,调用send方法,会出现回调。如果失败可以重试; 2.参数ack设置,可试着为all,所有副本都落数据,才算成功。 代理端: 1.min.insync.replicas 参数设置,写入的数据等于参数个,才算写入成功。 2.失败重试机制。 消费端: 1.可以设置为手动提交offset,-- 当消息消费成功后手动提交。 kafka 数据发送一条消息 分区 -->多副本机制 生产者,消费者只跟leader副本交互。 acks = all 所有副本都要接受该消息后,才算真正的成功。 默认 acks =1 产生的数据被leader 接受 就算成功。 参数设置,不能完全保证消息不丢失,因为可能回存在网络抖动或者leader节点挂掉的情况触发重新选举,如果选举的成为leader的节点的高水位,没有最新数据,可能数据就毁丢失,参数的设置只能提高消息不丢失的概率,不能完全保障。 3.生产者设计概要: 1.首先,我们需要创建一个 ProducerRecord,这个对象需要包含消息的主题(topic)和值(value),可以选择性指定一个键值(key)或者分区(partition)。 2.发送消息时,生产者会对键值和值序列化成字节数组,然后发送到分配器(partitioner)。 3.如果我们指定了分区,那么分配器返回该分区即可;否则,分配器将会基于键值来选择一个分区并返回。 4.选择完分区后,生产者知道了消息所属的主题和分区,它将这条记录添加到相同主题和分区的批量消息中,另一个线程负责发送这些批量消息到对应的 Kafka broker。 5.当broker接收到消息后,如果成功写入则返回一个包含消息的主题、分区及位移的 RecordMetadata 对象,否则返回异常。 6.生产者接收到结果后,对于异常可能会进行重试。
消息的发送:
1.template.send 发送消息体 2.封装成 消费实体记录bean ProducerRecord 3.doSend --> ProducerRecord 4.创建生产者 getTheProducer 5.初始化一个列表 final SettableListenableFuture<sendresult<k, v="">> 6.异步线程发送消息代码:
getTheProducer().send( producerRecord, new Callback() {
@Override
public void onCompletion(RecordMetadata metadata, Exception exception) {
} });
if (this.autoFlush) {
flush();
}
}
4.消费者概要: 我们可以增加消费者来进行水平扩展提升消费者能力,消费者的的数据不应该多于生产者(分区的意思,生产者是brocker上),多的会空闲。 kafka的一个重要特性就是,写入一次消息,可以支持任意多的应用读取这个消息。 如果需要读取用户全量数据,需要创建消费者组; 消费组和分区重平衡: 在重平衡的过程中,所有的消费者都不能消费消息,因此会造成整个消费组短暂的不可用。 partition和消费模型 partition 会为每个consumer Group 保存一个偏移量,记录group消费的位置。 5.为什么kafka是pull模型 producer 向 broker push消息 consumer 从broker pull消息 可以逐条消费也可以批量消费 6.kafka如何保持可靠性 Kafka 中的可靠性保证有如下四点: 1.对于一个分区来说,它的消息是有序的。如果一个生产者向一个分区先写入消息A,然后写入消息B,那么消费者会先读取消息A再读取消息B。 2.当消息写入所有in-sync状态的副本后,消息才会认为已提交(committed)。这里的写入有可能只是写入到文件系统的缓存,不一定刷新到磁盘。 生产者可以等待不同时机的确认, 比如等待分区主副本写入即返回,后者等待所有in-sync状态副本写入才返回。 3.一旦消息已提交,那么只要有一个副本存活,数据不会丢失。 4.消费者只能读取到已提交的消息
标签:副本,生产者,分区,写入,kafka,消息 来源: https://www.cnblogs.com/dhdnm/p/16606878.html