其他分享
首页 > 其他分享> > kafka(3)

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