什么是消息队列
在探索Kafka之前我们先来看一下什么是消息队列
消息队列(Message Queue):可以简称为MQ
例如:Java中的Queue队列,也可以认为是一个消息队列
消息队列:顾名思义,消息+队列,其实就是保存消息的队列,属于消息传输过程中的容器。
消息队列主要提供生产、消费接口供外部调用,做数据的存储和读取
消息队列分类
消息队列大致可以分为两种:点对点(P2P)、发布订阅(Pub/Sub)
共同点:
针对数据的处理流程是一样的
消息生产者生产消息发送到queue中,然后消息消费者从queue中读取并且消费消息。
不同点:
点对点(p2p)模型包含:消息队列(Queue)、发送者(Sender)、接收者(Receiver)
一个生产者生产的消息只有一个消费者(Consumer)(消息一旦被消费,就不在消息队列中)消费。例如QQ中的私聊,我发给你的消息只有你能看到,别人是看不到的发布订阅(Pub/Sub)模型包含:消息队列(Queue)、主题(Topic)、发布者(Publisher)、订阅者(Subscriber)
每个消息可以有多个消费者,彼此互不影响。比如我发布一个微博:关注我的人都能够看到,或者QQ中的群聊,我在群里面发一条消息,群里面所有人都能看到 这就是这两种消息队列的区别
什么是Kafka
Kafka 是一个 高吞吐量 的、 持久性 的、 分布式 发布订阅消息系统
- 高吞吐量:可以满足每秒百万级别消息的生产和消费。 为什么这么快?
难道Kafka的数据是放在内存里面的吗?
不是的,Kafka的数据还是放在磁盘里面的
主要是Kafka利用了磁盘顺序读写速度超过内存随机读写速度这个特性。
所以说它的吞吐量才这么高 - 持久性:有一套完善的消息存储机制,确保数据高效安全的持久化。
- 分布式:它是基于分布式的扩展、和容错机制;Kafka的数据都会复制到几台服务器上。当某一台机器故障失效时,生产者和消费者切换使用其它的机器。
Kafka的数据时存储是磁盘中的,为什么可以满足每秒百万级别消息的生产和消费?
这是一个面试题,其实就是我们刚才针对高吞吐量的解释:kafka利用了磁盘顺序读写速度超过内存随机读写速度这个特性Kafka主要应用在实时计算领域,可以和Flume、Spark、Flink等框架结合在一块使用 例如:我们使用Flume采集网站产生的日志数据,将数据写入到Kafka中,然后通过Spark或者Flink从Kafka中消费数据进行计算,这其实是一个典型的实时计算案例的架构
Kafka组件介绍
Broker(容器、节点)
先看中间的Kafka Cluster,这个Kafka集群内有两个节点,这些节点在这里我们称之为Broker
Broker:消息的代理,Kafka集群中的一个节点称为一个broker
Topic
主题,Kafka处理的消息的不同分类(是一个逻辑概念)。
如果把Kafka认为是一个数据库的话,那么Kafka中的Topic就可以认为是一张表 不同的topic中存储不同业务类型的数据,方便使用
Partition(分区,同一节点)
在Topic内部有partition的概念
Partition:是Topic物理上的分组,一个Topic会被分为1个或者多个partition(分区),分区个数是在创建topic的时候指定。每个topic都是有分区的,至少1个。
Replication(副本,不同节点)
针对partition其实还有副本的概念,主要是为了提供数据的容错性,我们可以在创建Topic的时候指定partition的副本因子是几个。
在这里面副本因子就是2,其中一个是Leader,另一个是真正的副本。Leader这个partition负责接收用户的读写请求,副本partition负责从Leader里面的partiton中同步数据,这样的话,如果后期leader对应的节点宕机了,副本可以切换为leader顶上来。
Message
在partition内部还有一个message的概念
Message:我们称之为消息,代表的就是一条数据,它是通信的基本单位,每个消息都属于一个partition。
Producer
Consumer
消息和数据的消费者,从kafka的topic中消费数据。
这里的消费者可以有多个,每个消费者可以消费到相同的数据
Zookeeper
Kafka的运行是需要依赖于Zookeeper的,Zookeeper负责协调Kafka集群的正常运行。
