一、简介

1.1 概述

什么是Kafka:

  • 最初由Linkedin公司开发,由scala编写,其诞生是为了解决Linkedin的数据管道问题——由于各种缺陷而导致消息阻塞或者服务无法正常访问;
  • 分布式消息队列。Kafka对消息保存时根据topic进行归类,发送消息者称为producer,消息接受者称为consumer,Kafka集群由多个Kafka实例组成,每个实例(server)称为broker;
  • 无论是Kafka集群,还是consumer都依赖于Zookeeper集群保存一些meta信息,来保证系统可用性。

Kafka主要设计目标:

  • 通过O(1)的磁盘数据结构提供消息的持久化,对于即使数以TB的消息存储也能够保持长时间的稳定性能;
  • 高吞吐量 :即使是非常普通的硬件Kafka也可以支持每秒数百万的消息;
  • 支持Kafka Server间的消息分区,及分布式消费,同时保证每个partition内的消息顺序传输;
  • 支持离线数据处理和实时数据处理;
  • 使用推送和拉取模型解耦生产者和消费者;
  • 系统可以随着数据流的增长进行横向扩展

1.2 消息队列

Kafka属于发布-订阅模式。消息传递方式:

  • 点对点模式:一对一;一条消息只能被消费一次,消费后清除;
  • 发布-订阅模式:一对多;消费者可以订阅一个或多个topic,同一条数据可以被多个消费者消费,消息被消费后不会立马清除。

1.3 Kafka的优点

  • 解耦
  • 冗余
  • 扩展性
  • 灵活性&峰值处理能力
  • 可恢复性
  • 顺序保证
  • 缓冲
  • 异步通信

二、Kafka基础角色

  • producer:消息生产者,向消息系统发送消息的客户端;
  • consumer:消息消费者,从消息系统读取消息的客户端;
  • topic:主题。是一个逻辑概念。其作用类似于关系型数据库的表;
  • partition:分区。为了实现扩展性,一个非常大的topic可以分布到多个broker上,一个topic分为多个partition(分布在不同的服务器上,具体在.log文件里),序号从0开始,每个partition是一个有序队列。partition中每条消息都会被分配一个有序的ID(offset)。Kafka只保证一个partition中的消息的有序性,不保证一个topic的多个partition间的顺序;
  • offset:偏移量。partition中的每个消息都有一个连续的序号,用于partition唯一标识一条消息;
  • consumer group:消费者群组。一个topic可以有多个consumer,每个partition只会把消息发给消费者组中的一个consumer;

!

  • controller:Kafka是主从式的架构,主节点就叫controller,其余的为从节点,controller是需要和zookeeper进行配合管理整个kafka集群。

三、Kafka架构

Kafka详细架构图:

  • 一个典型的Kafka集群包含若干个producer、broker、consumer(group)以及一个zookeeper;
  • Kafka通过zookeeper管理集群配置,选举leader,以及在consumer group发生变化时进行rebalance;
  • producer使用push模式将消息发布到broker,consumer使用pull模式从broker订阅并消费消息。