Kafka分布式消息系统原理 2015-07-30 20:30

简介

Kafka是一个高吞吐、分布式、基于发布订阅模式的消息系统。利用Kafka技术可在廉价的PC服务器上搭建起大规模消息系统。

使用消息系统的原因

  1. 解耦: 消息系统在处理过程中插入一个隐含的,基于数据的接口层。
  2. 冗余:消除队列持久化,防止数据丢失。
  3. 扩展性:消除队列解耦处理过程,容易扩展处理。
  4. 可恢复性:处理过程失效,恢复后可继续处理。
  5. 顺序保证:Partition内部保证顺序。
  6. 异步通信:消息先放入队列,等需要时再处理。

术语

  1. Broker:Kafka集群内的一个或多个服务实例。一般一个物理节点上启动一个Broker,也可以启动多个。
  2. Topic:发布到Kafka集群的消息的类别。
  3. Partition:Partition是物理上的概述。每一个Topic有一个或多个Partition。
  4. Producer:消息生产者
  5. Consumer:消息消费者
  6. Consumer Group:一组Consumer的集合

拓扑

一个典型的Kafka集群包含若干个Producer、若干Broker、若干Consumer Group以及一个Zookeeper集群。 Kafka通过Zookeeper管理集群配置,选举Leader,以及在Consumer Group发生变化时进行rebalance。 Producer使用Push方式将消息发布到Broker,Consumer使得Pull模式从Broker订阅并消费消息。

每个Topic都有一个或多个Partition构成。每个Partition都有一个序且不可变的消息队列。
任何发布到此Partition的消息都会被直接追加到log文件的尾部。
每条消息在文件中的位置称为offset,offset是一个long数字,它唯一标记一条消息。
消费者通过(offset、Partition、Topic)跟踪记录。

副本以Partition为单位。每个Partition都有各自的主副本和从副本。 主副本叫Leader,从副本叫做Follower,处于同步状态的副本叫In-Sync Replicas(ISR)。 Follower通过Pull的方式从Leader同步数据。
消费者和生产者都是从Leader读写数据,不与Follower交互。

Partition数量决定了每个Consumer Group中并发消息者的最大数量。 Consumer Group A有两个消费者来读4个Partition中的数据。Consumer Group B有四个消费者来读4个Partition中的数据。

消息删除机制

与传统的Message Queue不同,Kafka会保留所有的消息,无论其被消费与否。
Kafka提供了两种策略删除旧数据:delete和compact。

如果删除策略是delete,则在消息文件达到指定的大小或时间超过指定期限时,Kafka删除旧数据。

配置:

如果删除策略是compact,则只保留每个Partition内每个key最新的消息。如下图,key为"123"的消息有多条,那么Kafka只会保留最后一条。

配置:

log.cleaner.enable=true
log.cleanup.policy=compact

参考文档

  1. Kafka官方文档
Tags: #Kafka    Post on Streaming