KafKa知识体系--基础篇
Posted 123早点睡
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了KafKa知识体系--基础篇相关的知识,希望对你有一定的参考价值。
网上的springboot 和主流技术整合的demo:
https://github.com/javastacks/spring-boot-best-practice (springboot的绝大部分知识点demo)
https://github.com/javastacks/spring-boot-best-practice/tree/master/spring-boot-kafka (springboot 整合kafka demo)
以文章内容来自于:程序员耕耘(微信公众号),华仔聊技术(微信公众号)
link:https://mp.weixin.qq.com/s/VJtWZxA84Nv_NlDe5ke_fw
kafka简介:
Kafka最初由Linkedin公司开发,是一个分布式的、分区的、多副本的、多订阅者,基于zookeeper协调的分布式日志系统(也可以当做MQ系统),常用于web/nginx日志、访问日志、消息服务等等,Linkedin于2010年贡献给了Apache基金会并成为顶级开源项目。
kafka的特性:
高吞吐量、低延迟,kafka 每秒可以处理几十万条信息,延迟只有几毫秒
可拓展性,kafka集群支持热拓展
持久性,可靠性:消息被持久化到本地磁盘,支持数据备份丢失
容错性:允许集群中的节点失败(若分区副本量为n,则允许n-1个节点失败)
高并发:单机可支持数千个客户端同时读写
kafka的应用场景:
日志收集、信息系统、用户活动追踪、运营指标。。。
kafka架构(重头戏!)
kafka架构包含四大组件:生产者、消费者、kafka集群、zookeeper集群。
broker:
kafka集群包括一个或者多个服务器,每个服务器节点称为broker
Broker为kafka控制器组件(Controller),是kafka的核心组件,主要的作用是在Zookeeper的帮助下管理和协调整个kafka集群
topic:
可以简单理解为队列,每条发布到kafka集群的消息都有一个类别-->topic,信息按topic来分类,topic为逻辑分类,同一个topic的数据既可以在broker上也可以在不同的broker节点上。topic 为逻辑上的概念。
partition:
分区,每个topic被物理划分为一个或多个分区,每个分区在物理上对应一个文件夹,该文件夹里面存储了这个分区的所有消息和索引文件。在创建topic时可以指定partition数量,生产者将消息发送到topic时消息会根据分区策略追加到分区文件的末尾(顺序写磁盘)
分区策略:
所谓分区策略就是决定生产者将消息发送到哪个分区的算法。kafka提供默认的分区策略,同时我们也可以自定义分区策略。kafka允许为每条消息设置为一个key,一旦消息被定义了key,那么就可以保证同一个key的所有消息都进入到相同分区,这属于自定义策略的一种,称为按消息key保存策略,或key-ordering策略。
同一个topic的多个分区可以部署在多个机器上,以此实现kafka的伸缩性。同一partition的数据是有序的,但topic下的多个partition之间在消费时不能保证有序性。在需要严格保证消息的顺序消费的场景中可以将partition数设为1,这种做法的缺点是降低了吞吐。一般情况下只需要保证每个分区的有序性,再对消息设置key来保证相同key的消息落在同一个分区,即可满足绝大多数应用。
offest
partition中的每条消息都被标记了一个序号,这个序号表示消息在partition中的偏移量,称为offset,每一条消息在partition都有唯一的offset,消息者通过指定offset来指定要消费的消息。
正常情况下消费者消费完一条信息后会递增offest,准备去消费下一条消息,也可以将offest设成较小的值,重新消费消费过的信息,由此可以看出offest时由consumer控制的,consumer想消费哪条信息就消费哪条信息,所以kafka broker是无状态的,它不需要标记哪些信息被消费过。
producer
生产者,生产者发送消息到指定的topic下,消息再根据分配规则append到某个partition的末尾
consumer
消费者,消费者从topic中消费数据
consumer group
相同group id 的消费者则为同一个消费者组,每个消费者都需要设一个消费者组id,没有则属于默认的group.同一topic的一条消息只能被同一个consumer group内的一个consumer消费,但可以被多个consumer group 消费这一条消息。这是kafka用来实现topic 消息的广播和单播的手段。如果需要实现广播,一个consumer group内只放一个消费者即可,要实现单播,将所有的消费者放到同一个consumer group即可。
leader
每个partition有多个副本,其中仅有一个作为leader,leader会负责所有客户端的读写操作
follower
follower不对外提供服务,只与leader保持数据同步,如果leader失效,则选举一个follower来充当新的leader。当follower与卡住或者同步太慢,leader会把这个follower从ISR列表中删除,重新创建一个follower。
rebalance
同一个consumer group下的多个消费者互相协调消费工作,我们这样想,一个topic分为多个分区,一个consumer group里面的所有消费者合作,一起去消费所订阅的某个topic下的所有分区(每个消费者消费部分分区),kafka会将该topic下的所有分区均匀的分配给consumer group下的每个消费者,如下图
rebalance表示"重平衡",consumer group内某个消费者挂掉后,其他消费者自动重新分配订阅主题分区的过程,是 Kafka 消费者端实现高可用的重要手段。如下图Consumer Group A中的C2挂掉,C1会接收P1和P2,以达到重新平衡。同样的,当有新消费者加入consumer group,也会触发重平衡操作。
分区和消费顺序
1,同一个生产者发送到同一个分区的消息,先发送的offest比后发送的offest小,同一个生产者发送到不同分区的消息,消息顺序无法保证
2,消费者按照消息在分区中的存放顺序进行消费,只保证分区间的消费顺序,不能保证不同分区间的消费顺序。
消息传递语义
kafka三高架构设计剖析
以上是关于KafKa知识体系--基础篇的主要内容,如果未能解决你的问题,请参考以下文章
夯实Kafka知识体系及基本功分析一下(Broker)服务的可靠性机制分析「原理篇」
夯实Kafka知识体系及基本功分析一下生产者(Producer)实现原理分析「原理篇」