一、 点对点模式
点对点模式通常是基于拉取或者轮询的消息传送模型,这个模型的特点是发送到队列的消息被一个且只有一个消费者进行处理,一旦消费者读取队列中的消息,它就从该队列中消失。生产者将消息放入消息队列后,由消费者主动的去拉取消息进行消费。点对点模型的的优点是消费者拉取消息的频率可以由自己控制。但是消息队列是否有消息需要消费,在消费者端无法感知,所以在消费者端需要额外的线程去监控。
二、 发布订阅模式
在发布 - 订阅系统中,消息被保留在主题中。 与点对点系统不同,消费者可以订阅一个或多个主题并使用该主题中的所有消息。 在发布 - 订阅系统中,消息生产者称为发布者,消息使用者称为订阅者。 一个现实生活的例子是Dish电视,它发布不同的渠道,如运动,电影,音乐等,任何人都可以订阅自己的频道集,并获得他们订阅的频道时可用。
Kafka是一种高吞吐量的分布式发布订阅消息系统
三、特性
- 高吞吐、低延迟:kakfa 最大的特点就是收发消息非常快,kafka 每秒可以处理几十万条消息,它的最低延迟只有几毫秒。
- 高伸缩性: 每个主题(topic) 包含多个分区(partition),主题中的分区可以分布在不同的主机(broker)中。
- 持久性、可靠性: Kafka 能够允许数据的持久化存储,消息被持久化到磁盘,并支持数据备份防止数据丢失,Kafka 底层的数据存储是基于Zookeeper 存储的,Zookeeper 我们知道它的数据能够持久存储。
- 容错性: 允许集群中的节点失败,某个节点宕机,Kafka 集群能够正常工作
- 高并发: 支持数千个客户端同时读写。
四、结构
Broker:一台服务器就是一个Brokr,一个集群由多个Broker组成,一个Broker可以容纳多个Topic,Broker之间不存在主从关系,地位平等。
Topic:每条消息都有一个主题,主题可以有多个分区,多个分区可以分布在不同的Broker上,但是这对于消费者生产者是透明的,即他们直接去访问主题和分区即可,而不用关心他们在那个Broker上。
Partition:Topic的分区,每个topic可以有多个分区,分区的作用是做平衡负载,提高kafka的吞吐量,提高可扩展性(将一个主题分布到多个机器上)。同一个topic在不同的分区的数据是不重复的,partition的表现形式就是一个一个的文件夹!
Offset:消息在分区中的位置,每一个分区中的每一个消息都有一个offset(偏移量)。
Replication:每一个分区都有多个副本,副本的作用是做备胎。当主分区(Leader)故障的时候会选择一个备胎(Follower)上位,成为Leader。在kafka中默认副本的最大数量是10个,且副本的数量不能大于Broker的数量,follower和leader绝对是在不同的机器,同一机器对同一个分区也只可能存放一个副本(包括自己),副本作用就是一个出问题另一个代替他,放在一个服务器的话岂不是都没了。
Producer:生产者往某个Topic上发布消息。生产者也负责选择发布到这此Topic上的哪一个分区(通过轮询或哈希等算法)。
Consumer:消费者,即向指定的Topic获取消息,根据指定Topic的分区索引及其对应分区上的消息偏移量来获取消息。
消费者组:每个消费这必然会属于某个消费者组,一个消费者组订阅一个主题,一块去消费其中的消息(消费者组中的消费者是竞争关系,而不是共享消息,不同消费者不能消费同一个分区,一个消费者可以消费多个分区,如果组里的消费者多与分区数,则有的消费者就不能消费)。消费者组之间共享消息。
zookeeper:存放kafka集群的相关数据组件,在zookeeper集群中保存Topic的状态信息,如分区个数,组成,分区的分布情况。保存Broker的状态信息,保存消费者信息等,
每个分区的数据是相等的吗?如果不相等那怎么保证消费者可以消费相同的消息,或者消费者不需要消费相同的数据,
答:分区是不一样的,一个消费组里的消费者一起消费主题中的消息,一个消费者可以消费多个分区,多个消费者不能消费同一个分区,不同组可以消费一样的消息
五、综上
一个典型的kafka集群包括若干哥生产者,若干个Broker,若干个消费者,和一个zookeeper集群。kafka通过zookeeper管理集群配置,生产者根据指定的分区选择方法(轮询、哈希等)将消息push到指定主题分区上,kafka集群收到消息后将其持久化到磁盘上(可配置保留时长,不关系消费的问题,消费者通过pull的方式通Broker上订阅消费消息。
六、参考链接
https://zhuanlan.zhihu.com/p/68052232
https://www.w3cschool.cn/apache_kafka/apache_kafka_cluster_architecture.html
https://colobu.com/2014/08/06/kafka-quickstart/
https://zhuanlan.zhihu.com/p/37405836