概述
- Kafka 是一个分布式流式处理平台
- 消息队列:发布和订阅消息流
- 容错的持久方式存储记录消息流:Kafka 会把消息持久化到磁盘,有效避免了消息丢失的风险
- 流式处理平台: 在消息发布的时候进行处理,Kafka 提供了一个完整的流式处理类库。
- 应用场景
- 消息队列
- 数据处理
- 早期的消息队列是队列模型,如果有多个消费者的话就是平分消息
- 发布-订阅模型就可以实现多个消费者都消费到所有消息
- Kafka中重要的概念
- Producer(生产者) : 产生消息的一方。
- Consumer(消费者) : 消费消息的一方。
- Broker(代理) : 可以看作是一个独立的 Kafka 实例。多个 Kafka Broker 组成一个 Kafka Cluster。
同时,你一定也注意到每个 Broker 中又包含了 Topic 以及 Partion 这两个重要的概念:
- Topic(主题) : Producer 将消息发送到特定的主题,Consumer 通过订阅特定的 Topic(主题) 来消费消息。
- Partion(分区) : Partion 属于 Topic 的一部分。一个 Topic 可以有多个 Partion ,并且同一 Topic 下的 Partion 可以分布在不同的 Broker 上,这也就表明一个 Topic 可以横跨多个 Broker 。
Kafka 为分区(Partion)引入了多副本(Replica)机制。分区(Partion)中的多个副本之间会有一个叫做 leader 的家伙, 其他副本称为 follower。我们发送的消息会被发送到 leader 副本,然后 follower 副本才能从 leader 副本中拉取消息进行同步。(和Redis的主从模式类似)
Kafka 的多分区(Partition)以及多副本(Replica)机制有什么好处呢?
- Kafka 通过给特定 Topic 指定多个 Partition, 而各个 Partition 可以分布在不同的 Broker 上, 这样便能提供比较好的并发能力(负载均衡)。
- Partition 可以指定对应的 Replica 数, 这也极大地提高了消息存储的安全性, 提高了容灾能力,不过也相应的增加了所需要的存储空间。
Zookeeper 在 Kafka 中的作用
- ZooKeeper 主要为 Kafka 提供元数据的管理的功能。
- Broker 注册 :在 Zookeeper 上会有一个专门用来进行 Broker 服务器列表记录的节点。
- Topic 注册 :在 Kafka 中,同一个Topic 的消息会被分成多个分区并将其分布在多个 Broker 上,这些分区信息及与 Broker 的对应关系也都是由 Zookeeper 在维护
- 负载均衡 :上面也说过了 Kafka 通过给特定 Topic 指定多个 Partition, 而各个 Partition 可以分布在不同的 Broker 上, 这样便能提供比较好的并发能力
Kafka 如何保证消息的消费顺序?
- 消息在被追加到 Partition(分区)的时候都会分配一个特定的偏移量(offset)。Kafka 通过偏移量(offset)来保证消息在分区内的顺序性。
- 所以解决办法
- 1 个 Topic 只对应一个 Partion。
- (推荐)发送消息的时候指定 key/partion。
如何避免消息丢失
- 生产者发送时丢失消息
- 在发送消息的时候可以监听回调,如果失败进行重试,设置重试次数和重试间隔
- 消费者消费后程序异常终止
- 手动关闭闭自动提交 offset,每次在真正消费完消息之后之后再自己手动提交 offset ,会造成消息重复消费
- Kafka弄丢消息:当leader 副本所在的 broker 突然挂掉, follower 副本还没来得及同步leader中的消息,就会导致消息丢失
- 设置acks=all:acks 的默认值即为1,代表我们的消息被leader副本接收之后就算被成功发送。
当我们配置 acks = all 代表则所有副本都要接收到该消息之后该消息才算真正成功被发送。
- 设置 replication.factor >= 3:设置的分区数大于等于3
- 设置 min.insync.replicas > 1:代表消息至少要被写入到 2 个副本才算是被成功发送。
- replication.factor > min.insync.replicas ,一般推荐设置成 replication.factor = min.insync.replicas + 1。
- 设置 unclean.leader.election.enable = false:重新选取leader的时候会对比同步程度
