前言
介绍kafka中涉及到的一些基本的概念,包括Broker,Topic,Partition,Producer,Consumer,Consumer Group等。
基本概念
Broker
kafka集群包含一个或多个服务器,这种服务器被称为broker。
Topic
每条发布到Kafka集群的消息都有一个类别,这个类别被称为Topic。
Partition
Partition是物理上的概念,每个Topic包含一个或多个Partition。这是数据进行水平分片,弹性扩容的关键。
Producer
消息生产者,负责发布消息到kafka broker。
Consumer
消息消费者,负责从kafka broker消费消息,消费端维护读取偏移位置offset。
Consumer Group
每个Consumer属于一个特定的Consumer Group(可为每个Consumer指定group name,若不指定group name则归属于默认的group)。Consumer Group 是实现消息单播和组播的关键。
官方原理图
单播与多播
与rabbitmq不同的是,kafka消息多播是通过为Topic定义不同的Consumer Group来实现的,而rabbitmq则是通过消息在多个队列中复制实现的,因为rabbitmq对于已经消费成功的消息,会及时的清除,以释放内存空间。kafka由于是直接使用磁盘队列,不用担心内存空间不足的问题。
在kafka中,同一Consumer Group中的Consumer并发消费broker中的消息,分组中的每个Consumer负责消费一个或多个Partition,每个Consumer各自维护其所在分区中的消息读取偏移offset。
对于同一个Topic,不同的Consumer Group是相互隔离的,在消费消息时不存在相互影响的问题。
单播:一个Topic仅有一个Consumer Group。
组播:一个Topic有多个不同的Consumer Group。
分区消息消费策略
在kafka中,每个topic包含一个或多个Partition,每个分区内的消息都是顺序的,为了防止offset在多个Consumer之间并发修改所带来的性能损耗,kafka不支持同一个分区被多个Consumer消费。也就是说,我现在有一个topic有5个Partition,但是有一个Consumer Group里面包含10个Consumer。那么真正参与消费的Consumer只有5个,剩余5个处于空闲状态。可以得出的结论是消息的并发处理速度,取决于topic有多少个分区数。多分区是无法保证消息的顺序性的,如果要保证顺序性,只能使用单分区。如果是分区数大于消费者数,则就会出现同一个消费者消费多个分区的情况。
过期消息清理策略
在kafka中,消息被消费完之后,并不会像rabbitmq一样,会将已经确认消费成功的消息,在broker中给清理掉,它是不会主动清理的,这也是kafka为什么既能够与spark集成,实时处理消息;同时也支持与hadoop集成,离线处理消息的关键。同时,我们也可以在Consumer端手动调整offset的值来重复消费之前的消息,也可以跳过一些消息等。
但是,对于过期消息所占磁盘空间的释放,kafka提供了以下两种处理策略:############################# Log Retention Policy #############################
# 过期日志清理策略[delete|compact],默认删除
log.cleanup.policy=delete
# 基于时间的策略:日志保留的最大时间,默认7天,触发条件则开始清理过期日志
log.retention.hours=168
# 基于空间的策略:分区文件最大size,触发条件则开始清理过期日志
log.retention.bytes=1073741824
# 过期日志清理检测时间间隔300秒
log.retention.check.interval.ms=300000
参考链接