1.消息队列(MessageQueue MQ)
- 消息队列是在消息的传输过程中保存消息的容器。
- 消息队列的分类(点对点 发布订阅)
- 点对点(p2p)
- 发布订阅(Pub/Sub)
- 点对点和发布订阅的区别
- 消息队列的好处
- 解耦
- 异步
- 削峰/限流
- 冗余
- 扩展
- 可恢复性
- 常见的消息系统
RabbitMQ、ZeroMQ、Redis、Kafka.....
2.kafka简介
- Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。
- Kafka是一种高吞吐量的,持久性的,分布式发布订阅消息系统,同时支持在线和离线处理
- 高吞吐量:即使是非常普通的硬件Kafka也可以支持每秒数百万的消息
- 持久性
- 分布式
- 官网:http://kafka.apache.org/(中文:http://kafka.apache.org/)
- 功能
- Kafka的功能简单来说就是可以传输数据以及处理数据。也可以说是面向数据流的生产,转换,存储,消费为整体的处理平台。
- 应用场景
- 构造实时流数据管道,它可以在系统或应用之间可靠地获取数据。 (相当于message queue)
- 构建实时流式应用程序,对这些流数据进行出处理(转换或者影响)。 (就是流处理,通过kafka stream topic和topic之间内部进行变化)
- 比如日志实时数据采集处理用:flume和kafka
3.kafka核心概念
- 主题(Topic):
- 逻辑上的一个概念,对消息进行不同分类。
- Kafka当中每个消息都属于一个主题,每个主题下有任意数量的消息。
- 一个主题可以有一个或多个生产者,也可以有零个、一个或多个消费者。
- 代理(Broker)
- broker存储topic数据,生产者将消息发送个broker, 消费者从broker当中获取消息。
- Kafka服务部署的一个节点,我们可以把部署了KafkaServer的这台机器看做是一个Broker;一般broker数量越多,集群吞吐量越高
- 一般一个Kafka集群会有多个节点(broker);
- 如果某topic有N个partition,集群有N个broker,那么每个broker存储该topic的一个partition。
- 如果某topic有N个partition,集群有(N+M)个broker,那么其中有N个broker存储该topic的一个partition,剩下的M个broker不存储该topic的partition数据。
- 如果某topic有N个partition,集群中broker数目少于N个,那么一个broker存储该topic的一个或多个partition。在实际生产环境中,尽量避免这种情况的发生,这种情况容易导致Kafka集群数据不均衡。
- 分区(Partition)
- 每个topic都可以被划分成一个或者多个分区(每个主题至少有一个分区),它是topic物理上的分组,在创建topic的时候指定
- 一个Partition只对应一个Broker,一个Broker可以管理多个Partition。
- 在一个分区内消息是顺序的,在不同的分区之间,kafka并不保证消息的顺序
- 分区下又分的一个Leader和(0或者多个)Follower
- 每个partition是一个目录,由多个segment组成,每个segment存着message,由(index、log)等组成,存储在磁盘中
- Message(消息)
- 每个消息(也叫记录record,我习惯叫消息)是由一个key,一个value和时间戳构成
- 生产者(Producer)
- 生产者就是消息的创造者,发布消息,可以是一个或者多个
- 消费者(Consumer)
- 消费者订阅消息(可订阅一个或多个主题),不断地从消息队列当中获取消息并处理,可以是一个或者多个
- 消费者数量不应大于partition数量,否则会有消费者消费不到数据,浪费资源
- 集群(Cluster)
- 集群指的是多个broker构成的一个整体,对外提供一定的服务。主要是为了保证其中一个broker挂了之后,kafka还能正常使用。集群当中的各个broker之间通过心跳的方式来确定其他机器是否存活。
- 控制器(Controller)
- 控制器是集群当中的概念,每个集群都会选择一个broker来担任控制器的角色。在一个集群当中,控制器这台broker会控制其他的broker实现相应的功能。控制器主要是负责kafka分区状态,管理每个分区的副本状态,监听zookeeper中数据的变化并作出相应的反馈。所有的broker都会监听Controller的状态,当controller出现故障时,会选举一个新的broker作为controller。
- 消费者组(Consumer Group)
- kafka当中多个消费者可以组成一个消费者组。
- 消费者组的主要作用是用来实现单播和广播。
- 单播:一个消息只能被一个消费者所消费,可将这些消费者放在同一个消费组当中。因为一个消费者组可以确保其订阅的topic每个分区只能被从属于该消费者组当中的一个消费者所消费。
- 多播:一个消息可被多个消费者所消费,可将这些消费者放在不同的消费者组中。如果不同的消费者组订阅了同一个topic,那么这些消费者组之间是彼此独立的,不会受到干扰。
4.Kafka有四个核心的API:
- The Producer API 允许一个应用程序发布一串流式的数据到一个或者多个Kafka topic。
- The Consumer API 允许一个应用程序订阅一个或多个 topic ,并且对发布给他们的流式数据进行处理。
- The Streams API 允许一个应用程序作为一个流处理器,消费一个或者多个topic产生的输入流,然后生产一个输出流到一个或多个topic中去,在输入输出流中进行有效的转换。
- The Connector API 允许构建并运行可重用的生产者或者消费者,将Kafka topics连接到已存在的应用程序或者数据系统。比如,连接到一个关系型数据库,捕捉表(table)的所有变更内容。