最初的应用系统

直接在应用系统和消息服务器之间建立连接。

多个直联的消息应用系统

为进行度量指标的分析增加分析服务器
以及活动监控数据库监控信息服务器

这时候节点变得一团糟

指标发布与订阅系统

为解决一部分技术债务,开始使用单独一个服务器用来接收来自其他应用程序的度量指标,并为其他系统提供一个查询服务器。

多个发布与订阅系统

提供多个发布与订阅系统,但后期维护性差,需要维护多个发布与订阅系统。每个系统都有缺陷和不足。

真正需要的是一个单一的集中式系统

Kafka就是为解决上述问题的基于发布和订阅的消息系统

消息和批次

  1. 在Kafka中数据单元被称为 消息 。可以吧消息看作数据库里的一行“数据行”或者一条“记录” 消息会被按键的hash值,分配到不同的分区中。

  2. 为提高效率,消息分批次写入Kafka。 批次 就是一组消息,这些消息属于同一个主题和分区。

topic和partition(主题和分区)

  1. Kafka的消息通过主题进行分类。主题好比数据库表。一个主题可以被分为若干分区。由于一个主题通常包含多个分区,因此无法在整个主题范围内保证消息的顺序,但可以保证消息在单个分区内的顺序。

生产者和消费者

  1. 生产者创造消息。一般情况下,一个消息会被发布在一个特定的主题上,默认生产者会把消息均匀的分布到主题上的所有分区中。特殊情况下,生产者可以吧消息写入到指定分区中。通过指定消息的键和分区器。分区器是为消息的键生成一个HASH值,映射在不同分区。
  2. 消费者读取消息。消费者订阅一个或多个主题,并按照顺序读区它们。消费者是通过检查偏移量来区分已经读过的消息。消费者会在每个分区读取完后,将偏移量写入zookeeper中。保证下次读取不会造成重复或缺少。
  3. 消费者群组。消费者是消费者群组的一部分。会有多个消费者一起读取同一个主题。群组保证每个分区只能被一个消费者读取

    此时两个消费者各自读取一个分区。一个消费者单独读取两个分区。
    消费者和分区的映射关系被称作消费者对分区的所有权关系。

通过该方式。消费者在失效后,群组里的其他消费者会代替它接管它之前消费的分区。

broker和集群

一台单独的Kafka服务器被称为broker。broker接受来自生产者的消息。并设置偏移量,以及提交消息到磁盘中。消息会在broker中进行保存。broker为消费者提供服务。对读取分区作出相应,返回已经提交到磁盘上的信息。

broker组成集群。每个集群都有一台broker充当集群控制器。负责将分区分配到不同的broker中和监控broker。在集群中,一个分区从属于一个broker,该broker称为该分区的首领leader。一个分区可以通过复制,将副本分配到不同的broker中,这样就避免了单点问题。如果一个broker失效,其他broker就可以接管对分区的leader。

为什么选择Kafka

  1. 可以有无缝的支持多个生产者和消费者。并且消费者之间互不影响。多个消费者可以组成群组,共享一个消息流,保证整个群组对给定的消息只处理一次。
  2. 消费者可以非实时读取数据。这归功于Kafka的消息保留特性。消息会被提交到磁盘中,并按一定的规则进行保存。持久化数据,保证数据不会丢失。
  3. 伸缩性。Kafka从一开始就被设计为一个灵活的伸缩性系统。可以从单独的一个broker,逐步发展到多个broker的小型集群模式。随后逐步发展到上百个broker。并且及时个别broker失效,依旧能为用户提供消费服务。

以上内容参考翻译于
Kafka_The_Definitive_Guide