1.kafka的概念
kafka是一个分布式的基于发布/订阅模式的消息队列,主要应用于大数据实时处理领域。
2.kafka消息队列的两种模式
1.点对点模式(一对一,消费者主动拉取数据,消息接到后消息清除)
2.发布/订阅模式(一对多又叫观察者模式,消费者消费数据之后不会清除消息但有一个过期时间,到了时间就删除,但ActiviMQ的话 只要消费完然后没有删除的话就一直在,像对数据处理有一定的严格要求就可以使用)
但发布/订阅模式有两个消费模式:
1.一种是消费者主动去队列里面进行消费,有一个缺点就是:每次都要轮询的去访问队列,但队列中没有消息。这就很浪费资源
2.还有就是队列给消费者主动推送的形式 这就解决了消费者不需要每次轮询的去访问队列,减少资源损耗。
3.kafka的好处
(1)高吞吐量、低延迟
Kafka 每秒可以处理几十万条消息,它的延迟最低只有几毫秒。每个 topic (主题)可以分多个 Partition(分区),Consumer Group(消费者) 对 Partition 进行消费操作,提高负载均衡能力和消费能力。
(2)可扩展性
kafka 集群支持热扩展。
(3)持久性、可靠性
消息被持久化到本地磁盘,并且支持数据备份防止数据丢失。
(4)容错性
允许集群中节点失败(多副本情况下,若副本数量为 n,则允许 n-1 个节点失败)。
(5)高并发
支持数千个客户端同时读写。
4.kafka的架构理解
1.Producer(生产者)
生产者就是往同一个topic(主题)里面去发送消息的
2.Topic(主题)
Topic,是一个逻辑概念,不是一个具体的事物,例如数据库表,在10个数据库中,我们都可以把这张表存放在不同的数据库中,同理,topic就是把消息分给不同的分区
3.Partition
一个Topic可以有多个分区,例如我们的Topic主题,然后每个分区会根据topic的副本数量创建分区副本,
像我们topicA 有两个分区,每个分区就有2个副本,分别为主本(learder)和副本(follower)
主本(learder):主要负责读写操作
从本(follower):负责主副本的备份,当learder出现宕机的时候参与投票选举为新的learder
当learder出现问题的时候,我们需要处理的数据就还是在,实现了高可用
4.Consumer(消费者)
- 一个消费者consumer都从属于一个(消费组)consumer group,消费者组可以有多个消费者,也可以单个
- 某一个分区只能被同一个消费者组里面的消费者进行消费,但Partition 1可以被Consumer 1和Consumer 4进行消费,因为不在一个消费者组中
- 消费者组里面的消费者的个数跟分区数是相等的最好,节约资源,例如consumer2就是多余的。
-
消费者只需要维护一个offset值,这个值是记录消费的偏移量的,就算这个消费者消费完,这条数据也不会消失,不会影响其他消费者消费。如果消费者出现宕机,恢复之后可根据偏移量继续消费
5.Zookeeper
1.关于分区(broker)注册
Broker数据是分散在不同的服务器,需要进行集中管理
每个分区进行启动时,都会在zookeeper中注册
2.维护分区和分区副本直接的关系,消费者去读取的时候,去zk查询对应的节点,就知道从那个broker读数据了。
3.生产者负载均衡
每个分区启动时,就会将分区注册到zk中,生产者通过该节点的变化来动态地感知到分区服务器列表的变更,这样实现了动态的负载均衡
4.消费者
问题:如果consumer消费过程中出现宕机等故障,consumer 恢复后,需要从故障前的位置的继续消费?
在0.9之前,consumer 默认将 offset 保存在 Zookeeper 中。在0.9版本之后,consumer 默认将 offset 保存在 Kafka 一个内置的 topic 中,该 topic 为__consumer_offsets。