kafka 入门知识

Kafka基本概念解析

Broker
Kafka集群包含一个或多个服务器,这种服务器被称为broker。

Topic
每条发布到Kafka集群的消息都有一个类别,这个类别被称为topic。(物理上不同topic的消息分开存储,逻辑上一个topic的消息虽然保存于一个或多个broker上但用户只需指定消息的topic即可生产或消费数据而不必关心数据存于何处)

Partition
parition是物理上的概念,每个topic包含一个或多个partition,创建topic时可指定parition数量。每个partition对应于一个文件夹,该文件夹下存储该partition的数据和索引文件。

Product
负责发布消息到Kafka broker。

Consumer
消费消息。每个consumer属于一个特定的consuer group(可为每个consumer指定group name,若不指定group name则属于默认的group)。使用consumer high level API时,同一topic的一条消息只能被同一个consumer group内的一个consumer消费,但多个consumer group可同时消费这一消息。

push-and-pull
Kafka中的Producer和consumer采用的是push-and-pull模式,即Producer只管向broker push消息,consumer只管从broker pull消息,两者对消息的生产和消费是异步的。

push模式:push模式的目标是尽可能以最快速度传递消息,但是这样很容易造成consumer来不及处理消息,典型的表现就是拒绝服务以及网络拥塞。

pull模式:pull模式则可以根据consumer的消费能力以适当的速率消费消息。

Topic&Partition
Kafka的broker端支持消息分区,Producer可以决定把消息发到哪个分区,在一个分区中消息的顺序就是Producer发送消息的顺序,一个主题中可以有多个分区。Topic在逻辑上可以被认为是一个在的queue,每条消费都必须指定它的topic,可以简单理解为必须指明把这条消息放进哪个queue里。为了使得Kafka的吞吐率可以水平扩展,物理上把topic分成一个或多个partition,每个partition在物理上对应一个文件夹,该文件夹下存储这个partition的所有消息和索引文件。

分布式消息系统kafka的提供了一个生产者、缓冲区、消费者的模型
kafka 入门知识

  • topic:kafka给消息提供的分类方式。broker用来存储不同topic的消息数据
  • producer:往broker中某个topic里面生产数据
  • consumer:往broker中某个topic获取数据
    topic与消息

kafka将所有消息组织成多个topic的形式存储,而每个topic又可以拆分成多个partition,每个partition又由一个一个消息组成。每个消息都被标识了一个递增***代表其进来的先后顺序,并按顺序存储在partition中。
kafka 入门知识
这样,消息就以一个个id的方式,组织起来。

  • producer选择一个topic,生产消息,消息会通过分配策略append到某个partition末尾
  • consumer选择一个topic,通过id指定从哪个位置开始消费消息。消费完成之后保留id,下次可以从这个位置开始继续消费,也可以从其他任意位置开始消费
    这个id,在kafka中被称为offset

这种组织和处理策略提供了如下好处:

  • 消费者可以根据需求,灵活指定offset消费

  • 保证了消息不变性,为并发消费提供了线程安全的保证。 每个consumer都保留自己的offset,互相之间不干扰,不存在线程安全问题

  • 消息访问的并行高效性。 每个topic中的消息被组织成多个partition,partition均匀分配到集群server中。生产、消费消息的时候,会被路由到指定partition,减少竞争,增加了程序的并行能力

  • 增加消息系统的可伸缩性。 每个topic中保留的消息可能非常庞大,通过partition将消息切分成多个子消息,并通过负责均衡策略将partition分配到不同server。这样当机器负载满的时候,通过扩容可以将消息重新均匀分配

  • 保证消息可靠性。 消息消费完成之后不会删除,可以通过重置offset重新消费,保证了消息不会丢失

    灵活的持久化策略。 可以通过指定时间段(如最近一天)来保存消息,节省broker存储空间

备份
消息以分区(partition)为单位分配到多个server,并以partition为单位进行备份。备份策略为:1个leader和N个followers,leader接受读写请求,followers被动复制leader。leader和followers会在集群中打散,保证partition高可用
Kafka主从同步及leader&follower的理解
producer

producer生产消息需要如下参数:

  1. topic:往哪个topic生产消息
  2. partition:往哪个partition生产消息
  3. key:根据该key将消息分区到不同partition
  4. message:消息

consumer

传统消息系统有两种模式:

  1. 队列
  2. 发布订阅

kafka通过consumer group将两种模式统一处理:每个consumer将自己标记consumer group名称,之后系统会将consumer group按名称分组,将消息复制并分发给所有分组,每个分组只有一个consumer能消费这条消息。如下图:
kafka 入门知识
于是推理出两个极端情况:

  1. 当所有consumer的consumer group相同时,系统变成队列模式
  2. 当每个consumer的consumer group都不相同时,系统变成发布订阅

注意:
1、Consumer Groups 提供了topics和partitions的隔离, 如上图Consumer Group A中的consumer-C2挂掉,consumer-C1会接收P1,P2,即一个consumer Group中有其他consumer挂掉后能够重新平衡。如下图:
kafka 入门知识
2、多consumer并发消费消息时,容易导致消息乱序,通过限制消费者为同步,可以保证消息有序,但是这大大降低了程序的并发性。

kafka通过partition的概念,保证了partition内消息有序性,缓解了上面的问题。partition内消息会复制分发给所有分组,每个分组只有一个consumer能消费这条消息。这个语义保证了某个分组消费某个分区的消息,是同步而非并发的。如果一个topic只有一个partition,那么这个topic并发消费有序,否则只是单个partition有序。

一般消息系统,consumer存在两种消费模型:

  • push: 优势在于消息实时性高。劣势在于没有考虑consumer消费能力和饱和情况,容易导致producer压垮consumer。
  • pull: 优势在可以控制消费速度和消费数量,保证consumer不会出现饱和。劣势在于当没有数据,会出现空轮询,消耗cpu。

kafka采用pull,并采用可配置化参数保证当存在数据并且数据量达到一定量的时候,consumer端才进行pull操作,否则一直处于block状态。kakfa采用整数值consumer position来记录单个分区的消费状态,并且单个分区单个消息只能被consumer group内的一个consumer消费,维护简单开销小。消费完成,broker收到确认,position指向下次消费的offset。由于消息不会删除,在完成消费,position更新之后,consumer依然可以重置offset重新消费历史消息。

优点
1. 可持久化Message
2. 持久化本地文件系统,设置有效期
3. 支持高流量处理
4. 面向特定的使用场景而不是通用功能
5. 消费状态保存在消费端而不是服务端
6. 减轻服务器负担和交互
7. 支持分布式
8. 生产者/消费者透明异步
9. 依赖磁盘文件系统做消息缓存
10. 不消耗内存
11. 高效的磁盘存取
12. 复杂度为O(1)
13. 强调减少数据的序列化和拷贝开销
14. 批量存储和发送、zero-copy
15. 支持数据并行加载到Hadoop
16. 集成Hadoop

rabbitmq 和kafka 对比