kafka是一种分布式的,基于发布/订阅的消息系统。
分布式,吞吐量高,发布订阅模式,轻量灵活,较长时间持久化
电商网站中,新的用户注册时,需要将用户的信息保存到数据库中,同时还需要额外发送注册的邮件通知、以及短信注册码给用户。但因为发送邮件、发送注册短信需要连接外部的服务器,需要额外等待一段时间,此时,就可以使用消息队列来进行异步处理,从而实现快速响应。
比较常见的:发送短信验证码、发送邮件
可以使用消息队列作为临时存储,或者一种通信管道
Queue支持存在多个消费者,但是对一个消息而言,只会有一个消费者可以消费。
多个消费者可以消费一个消息
每个消息可以有多个订阅者,消息队列收到的消息,每个订阅这个主题的消费者都可以消费
发布订阅模式还有消费组的形式,多个消费者组成一个消费组,一个消费组里只有一个消费者能消费这条信息。
由消费者监控现队列的状态,主动拉取消息消费。
Kafka是以集群的形式运行的,集群的节点就叫broker,每个broker都有对应的编号
主题是一个逻辑概念,用于生产者发布数据,消费者拉取数据,生产者将数据发送到Kafka的topic上,订阅了这个topic的消费者就能消费到这些数据。
生产者,负责将数据推送给broker的topic
消费者,负责从broker的topic中拉取数据,并自己进行处理
在Kafka集群中,topic被分为多个分区。这些分区会分布在不同的broker节点上。
每个分区由多个副本构成,副本的目的就是冗余备份,当某个Broker上的分区数据丢失时,依然可以保障数据可用。因为在其他的Broker上的副本是可用的。
一个消费者组可以包含多个消费者,组内的消费者根据消费策略,一起消费主题的所有分区数据.
在Kafka中,每个主题都被分成多个分区,每个分区都是一个有序的消息队列。每条消息在分区中都有一个唯一的偏移量(offset),它表示了这条消息在分区中的位置。消费者在消费消息时,会记录它当前消费到的位置,也就是offset。这样,如果消费者停止或失败,它可以根据记录的offset继续从上次离开的地方开始消费。offsets可以存储在Kafka或ZooKeeper中,以便在消费者重新启动或故障转移时进行恢复。
消费者的offsets存储在一个名为__consumer_offsets的内部Kafka主题中。
一个主题分为多个分区,每个分区由多个副本组成,每个分区的多个副本分为leader和follower,leader负责数据的读写,follower负责和leader数据进行同步。分区的数据记录在多个.log文件中,一个.log大小大于某个值时,会再创建一个文件存进入Kafka的数据。
生产者发送到kafka的数据最终是存在log中,每个log都是由一个.log和.index文件组成。数据进来时,将数据追加到.log,将数据在.log中的索引追加到.index。当.log文件达到一定的大小后,kafka会新建一个.log和.index存储之后的数据,文件名字以新的索引起始点命名。
在消费者消费的时候,会记录自己消费的位置的offset偏移量,消费组会先根据这个偏移量确定自己需要消费的数据在哪个日志文件,之后通过二分查找.index索引文件找到自己需要消费的数据的位置。
kafka可以由多个消费者构成一个消费组去消费topic。
topic的分区会根据消费策略均匀的分配给消费组中的每个消费者。
假设一个主题有10个分区,如果没有消费者组,只有一个消费者对这10个分区消费,他的压力肯定大。
如果有了消费者组,组内的成员就可以分担这10个分区的压力,提高消费性能。
假设有4个消费者订阅一个主题,不同的组合方式就可以形成不同的消费模式。
使用4个消费者组,每组里放一个消费者,利用分区在消费者组间共享的特性,就实现了广播(发布订阅)模式。
只使用一个消费者组,把4个消费者都放在一起,利用分区在组内成员间互斥的特性,就实现了单播(队列)模式。
如果只有一个消费者,出现故障后就比较麻烦了,但有了消费者组之后就方便多了。
消费组会对其成员进行管理,在有消费者加入或者退出后,消费者成员列表发生变化,消费组就会执行再平衡的操作。
例如一个消费者宕机后,之前分配给他的分区会重新分配给其他的消费者,实现消费者的故障容错。
同时可以主动在消费组内增加或减少消费者,自动触发重平衡,重新分配topic的分区,适应消费压力的变化。
Rebalance机制的目的是实现负载均衡和容错。当新的消费者加入消费组时,Rebalance过程会将一些分区重新分配给新的消费者,以实现负载均衡。当现有的消费者离开消费组时,Rebalance过程会将它所消费的分区重新分配给其他消费者,以实现容错
Rebalance触发的时机