producer:生产者,发送消息起码要指定cluster和topicCluster:kafka集群,Broker:实际的工作节点(服务器)
在实际生产环境中,任意topic的Partition的数量不应该多于Broker的数量Topic:kafka消息队列采用的发布订阅模式,这个就是消费者订阅的主题
每个broker可以创建多个topic,实际应用中通常一个业务线创建一个topicPartition:一个Topic下面可以有多个partition,类似文件系统下的二级目录
分区的作用是负载均衡,提高kafka的吞吐量(提高并行能力)每个partition下的数据是有序的同一个topic的不同partition无法保证数据有序replication:每个分区都有多个副本。当主分区故障后可以选择一个从分区上位
副本的作用是为了实现高可用所以副本应该存到不同的服务器上才能保证高可用Leader:每个partition都且只有一个leader,leader是当前负责数据读写的partitionFollower:leader的数据备份。保持与leader数据同步。Consumer group:消费组,订阅一个topic,一个消费组下可以有多个消费者
如果consumer没有指定消费组,则为默认组一个topic下的数据会以多播的形式发给所有的消费组。Consumer:消费者,同一个消息只能被同一个消费组下的一个消费者消费Offset: 偏移量,kafka的存储文件都是按照offset.kafka来命名
用offset做名字方便查找,比如想找2048位置的数据,只要找到2048.kafka的文件即可
2. 生产者发送消息流程- producer向kafka集群获取分区leader消息生产者将消息发送给leaderleader将消息写入本地磁盘follower从leader拉去消息数据(pull)follower将消息写入本地磁盘后向leader发送ACKleader收到所有的follower的ack后向生产者发送ack
producer在写入时如果指定partition,则就写入该partition如果没有指定,但是设置了数据的key,则根据key的值hash出一个partition如果没有指定,也没有设置数据的key,则采取轮询方式 4. ack应答方式
producer向kafka写入消息时,可以设置参数来确定是否kafka接受到数据:
0:表示只要producer往集群发送数据后不等待集群的返回结果1:表示producer发送消息后,只要leader落库成功就返回给producer确认all:表示所有副本都完成备份,才给producer确认。 5. Push 与 Pull
producer向broker发送消息通过pushconsumer从broker中消费消息通过pull
消费时采用pull模式,可以根据consumer的消费能力所适应的速率来消费信息 6. kafka deliver guarantee
一般消息队列有三种分发保障策略
At most once:消息可能会丢失,但绝对不会重复传输At least one:消息绝不会丢,但可能会重复传输Exactly once:每条消息肯定会被传输一次且仅传输一次producer向broker发送消息如何做到Exactly once
当producer向broker发送消息时,需要收到该消息的commit如果因为网络故障导致没收到,producer可以生成一种类似主键的东西,从而实现在故障发生时进行幂等性重发。consumer从broker读取一条数据后,可以选择commit。 7. 总结
kafka能保证同一个partition内消息时有序的,但在不同partition之间不能保证消息有序当新数据写入时,就会追加到partition的尾部。在每个partition中每条消息都会被分配一个顺序的唯一标识,这个标识被称为offset,即偏移量
这个偏移量好定位它在磁盘的具体位置。kafka数据是存入磁盘的,属于持久化的数据
当每条消息被append到某个partition的过程,属于顺序写入磁盘,效率极高kafka集群会保留所有的消息,无论其是否被消费。(当然磁盘满了另说)kafka提供了两种删除旧数据策略:1.基于时间;2:基于Partition文件大小kafka读取数据的的时间复杂度为o(1):与文件大小无关(因为是顺序读取)
kafka会为每个consumer group保留一些metadata信息,当前消费的消息的position,即offset。这个offset是由consumer控制,正常情况下consumer会在消费一条消息后递增该offset。kafka 的broker是无状态的,它不需要标记哪些消息被消费了,也不需要通过broker去保证同一个consumer group只有一个consumer能消费某一条消息(即不需要锁机制),为kafka的高吞吐率提供有力保障 8. 与rocketmq的对比
kafka
优点
吞吐量极高(顺序存入磁盘,负载均衡)可用性很高(备份,主从partition)消费者采用pull方式获取信息,消息有序,能保证所有消息被消费且仅消费一次经常用于日志采集与大数据的实时计算缺点rocketmq
优点
吞吐量高可用性极高(分布式架构)可靠性高:经过参数优化配置,可以做到消息0丢失支持10亿级别的消息堆积,不会因为堆积导致性能下降缺点如何选择
kafka
基于pull的模式来消费消息,最求极高吞吐量,一开始的目的就是用于日志收集和传输。有日志采集功能则首选kafkarocketmq
用于对可靠性极高的场景,天生为金融互联网领域而生。如支付,业务削峰,高并发。



