kafka
本专栏主要讲了kafka入门知识
孟诸
coding
展开
-
kafka学习十三-消费者消费数据
1 自动提交的问题1.1 消息丢失由于自动提交是每隔一段时间提交一次,假如消费者拉到一批数据,刚处理一部分就提交了,然后挂掉了,这个时候未消费的那批数据就彻底丢失了,因为offset已经提交了,不会重新消费。1.2 消息重复同样的,消费者拉到一批数据,刚处理一部分没有提交,然后挂掉了,这个时候已经消费的那批消息会被再次消费。2 手动消费问题手动消费只会造成消息重复,不会造成消息丢失,消息重复原因和自动提交原因一样3 代码实现3.1 设置propertiespublic原创 2020-08-23 17:37:02 · 595 阅读 · 0 评论 -
kafka学习十二-生产者发送消息
目录1 发送消息流程2 发送消息API2.1 设置properties2.2 生产者发送消息2.3 自定义分区策略2.4 自定义拦截器2.4.1 核心方法介绍2.4.2 代码示例1 发送消息流程kafka Procedure发送消息采用的是异步发送方式,消息发送过程中涉及到两个线程,Main线程和Sender线程,以及一个共享变量RecordAccumulator。main线程把消息发送给RecordAccumulator,Sender线程不断从RecordAccum原创 2020-08-23 17:34:52 · 1108 阅读 · 0 评论 -
kafka学习十一-事务消息
1 Exactly Once语义将服务器的ACK设置为-1,可以保证Procedure到broker不会丢失数据即At Least Once;相对的,服务器级别设置为0,可以保证生产者发送消息只会发一次,即At Most Once语义但是,一些非常重要的消息,如交易数据,下游消费者要求消息不重不漏,即Exactly Once,精准一次,在0.11版本之前,kafka是无能为力的,只能通过设置ACK=-1,然后业务消费者自己去重。0.11版本之后,kafka引入了幂等性概念,procedure无论向b原创 2020-08-23 17:29:44 · 4510 阅读 · 0 评论 -
kafka学习十-高效读写数据
1 顺序写磁盘kafka的procedure生产数据,然后写入到log中,写的过程是直接追加到文件末端,顺序写。官方测试表明,同样的磁盘,顺序写能达到600M/s,随机写只能达到100K/s。这与磁盘结构有关,顺序写之所以快,是因为减少了大量磁头寻址时间2 零拷贝传统模式下,从硬盘读取一个文件是这样的:1)调用read函数,文件数据被copy到内核的缓冲区(read是系统调用,放到了DMA,所以用内核空间)。2)read函数返回,文件数据从内核缓冲区copy到用户缓冲区。3)write函原创 2020-08-23 00:13:47 · 352 阅读 · 0 评论 -
kafka学习九-消费者offset存储
kafka在0.9版本之前,消费者offset存储在zk中,路径是 /consumers/[groupId]/offsets/[topic]/[partition]0.9版本之后将offset放在kafka内置的一个topic中,该topic是__consumer_offsets,消费该topic需要修改consumer.properties文件exclude.internal.topics=false也是根据[groupId,topic,partition]来划分的...原创 2020-08-22 23:55:08 · 439 阅读 · 0 评论 -
kafka学习八-消费者分区策略
kafka有两种分配策略,RoundRobin和Range(默认)1 RoundRobin策略1.1 订阅单个topic这种方式下就是按照partition顺序,轮询分配给consumer,如下图1.2 订阅多个topic两个topic,t0和t1,各有3个分区,p0-p2kafka中有个类,TopicAndPartition,把topic和partition排列组合成6个对象,计算出哈希值排序,然后依次轮询分配给各个consumer。RoundRobin策略优点是消费者分区分配原创 2020-08-22 23:52:11 · 317 阅读 · 0 评论 -
kafka学习七-数据一致性问题
1 LEO和HW这样一个场景leader写了10条数据follower1同步了8条follower2同步了9条假如leader挂了,follower1或follower2任意一个当选为leader,则会出现数据不一致的情况。为了解决这个问题,kafka维护了LEO和HW两个数据如果没有HW这个概念,假如消费者消费到leader的offset=18的数据挂了,然后新选出的leader没有18的数据,消费者消费不到就会有问题。有了HW后,消费者最多看到HW,如果leader挂掉,任意一个fol原创 2020-08-22 23:47:25 · 664 阅读 · 0 评论 -
kafka学习六-数据可靠性保证
1 副本数同步策略1.1 半数以上完成同步就发送ACK优点:延迟低缺点:选取新leader时,容忍n台节点故障,需要2n+1个副本1.2 全部完成同步才发送ack优点:选取新leader时,容忍n台节点故障,需要n+1个副本缺点:延迟高kafka选取的是第二种2 ISR采用第二种方案后,有如下场景,leader收到数据,所有的follower都开始同步数据,但是有一个follower由于故障迟迟不能与leader进行同步,那么leader就要一直等待为了解决这个问题,lead原创 2020-08-22 23:44:27 · 185 阅读 · 0 评论 -
kafka学习五-生产者分区策略
发送消息的时候把消息封装成一个ProducerRecord对象,ProducerRecord有如下几个构造函数public ProducerRecord(String topic, Integer partition, K key, V value) { this(topic, partition, (Long)null, key, value, (Iterable)null);}public ProducerRecord(String topic, K key, V value) {..原创 2020-08-22 23:41:41 · 235 阅读 · 0 评论 -
kafka学习四-工作流程及文件存储
1 kafka工作流程kafka中消息是以topic进行分类的,生产者生产消息,消费者消费消息,都是面向topic的topic是逻辑上的概念,而partition是物理上的概念,每个partition对应一个log文件,该log文件中存储的就是producer生产的数据。producer生产的数据会被不断追加到log文件的末端,且每条数据都有自己的offsetoffset是一个long型的数字,通过这个offset可以确定一条在该partition下的唯一消息。在partition下是保证有序的原创 2020-08-02 21:41:24 · 153 阅读 · 0 评论 -
kafka学习三-启动配置
1 配置文件修改1.1 修改server.properties主要是下面几个配置# broker全局唯一编号,不能重复。集群部署的时候只需要保证brokerId不一样就行broker.id=0# 删除topic功能delete.topic.enable=true# kafka运行数据存放路径。注意,这里不是日志,是数据log.dirs=/opt/software/kafka-2.11/data# 连接zk地址zookeeper.connect=192.168.249.201:218原创 2020-08-02 21:13:25 · 336 阅读 · 0 评论 -
kafka学习二-kafka基础架构
kafka基础架构图如下1 生产者生产者负责向某个topic发送消息,发消息的时候可以指定分区2 topictopic包含多个partition,每个partition又有leader和follower,leader和follower在不同的broker上。创建topic的时候副本数不能大于broker个数3 消费者和消费者组消费者组负责消费某个topic的消息如果分区数多于消费者个数,那么存在一个消费者消费多个分区的数据。如果分区数等于消费者个数,那么每个消费者消费一个分区原创 2020-08-02 21:10:50 · 163 阅读 · 0 评论 -
kafka学习一-kafka消费模式
1 点对点模式消息生产者把消息发送到Queue中,然后消费者从Queue中取出并且消费消息。消息被消费后Queue中不再存储,所以一个消息只可以被一个消费者消费。2 发布订阅模式生产者把消息发布到topic中,同时有多个消费者订阅该topic。和点对点不同,该消息会被所有的消费者消费发布订阅有两种2.1 消费者主动拉取消息好处是消费者消费速度可以由消费者来确定。缺点是需要建立一个长轮询,不断的问消息,比较浪费资源。2.2 队列主动推送消息消费速度由队列决定。但是下游消费原创 2020-08-02 21:07:14 · 1546 阅读 · 0 评论