一、消息系统

image.png
点对点消息系统,能够保证消费消息的顺序,但是条消息只能否被消费一次。

发布订阅系统消息:不能保证消费消息的的顺序,每个消费者都可以消费消息,也就说一条消息可以被消费多次。

二、kafka术语

image.png
保证低延迟,零丢失、高吞吐量

Topic:在Kafka中,使用一个类别属性来划分数据的所属类,划分数据的这个类称为topic。如果把Kafka看做为一个数据库,topic可以理解 数据库中的一张表,topic的名字即为表名。

Partition:topic中的数据分割为一个或多个partition。每个topic至少有一个partition,默认只有一个。每个partition中的数据使用多个文件存储。partitio 的数据是有序的,partition间的数据丢失了数据的顺序。如果topic有多个partition,消费数据时就不能保证数据的顺序。在需要严格保证消 消费顺序的场景下,需要将partition数目设为1。(我们在创建Kafka Topic的时候,是可以指定partition的个数的)。

Partition offset:每条消息都有一个当前Partition下唯一的64字节的offset,它指明了这条消息的起始位置image.png,就好比每一行的数据。

Replicas of partition:副本是一个分区的备份。副本不会被消费者消费,副本只用于防止数据丢失。即消费者一定不会消费副本partition中 据,而是从leader的partition中读取数据。同时,还需要注意的是,我们的单机版Kafka不能给partition设置副本。因为我们只有一台机器, 本需要保存在其他的机器或者实例上。

Broker:Kafka 集群包含一个或多个服务器,服务器节点称为broker。broker存储topic的数据。如果某topic有N个partition,集群有N个 broker,那么每个broker存储该topic的一个partition,主要为了维护整个系统的负载均衡。

Producer:生产者即数据的发布者,该角色将消息发布到Kafka的topic中。broker接收到生产者发送的消息后,broker将该消息追加到当前 追加数据的partition文件中。生产者发送的消息,存储到一个partition中,生产者也可以指定数据存储的partition。

Consumer:消费者可以从broker中读取数据。消费者可以消费多个topic中的数据。多个 Consumer 构成 Group。

三、kafka的安装与使用

3.1 kafka安装

官网地址:http://kafka.apache.org/downloads

image.png

下载最新版kafka
image.png

首先解压安装包,之后修改config/server.properties文件,将broker.id由0改为1

image.png

设置一下日志的输出目录
image.png

使用kafka(进入到kafka根目录下)
image.png

3.2 kafka使用

  1. # Kafka 依赖于 ZK,先启动 ZK
  2. zookeeperbin/zookeeper-server-start.sh -daemon config/zookeeper.properties
  3. # 启动 Kafka 服务器
  4. kafka-serverbin/kafka-server-start.sh config/server.properties
  5. # 创建 Topic
  6. create topic: bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
  7. # 查看 Topic 列表
  8. topic list: bin/kafka-topics.sh --list --zookeeper localhost:2181
  9. # 启动 Producer
  10. producer: bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
  11. # 启动 Consumer
  12. consumer: bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning
  13. # 查看单个 Topic 信息
  14. topic info: bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic test

1、首先启动zookeeper,因为kafka的运行依赖于zookeeper

[root@localhost kafka_2.11-2.1.0]# bin/zookeeper-server-start.sh  -daemon 
config/zookeeper.properties

2、之后使用jps命令查看zookeeper是否启动成功。

image.png

3、启动kafka

[root@localhost kafka_2.11-2.1.0]# bin/kafka-server-start.sh config/server.properties

4、创建topic

[root@localhost kafka_2.11-2.1.0]# bin/kafka-topics.sh --create --zookeeper
localhost:2181 --replication-factor 1 --partitions 1 --topic test

成功创建topic

image.png

5、查看topic列表

[root@localhost kafka_2.11-2.1.0]# bin/kafka-topics.sh --list --zookeeper localhost:2181

可以看到kafka中topic的列表
image.png

6、生产者发送消息

[root@localhost kafka_2.11-2.1.0]# bin/kafka-console-producer.sh
--broker-list localhost:9092 --topic test

7、消费者消费消息

[root@localhost kafka_2.11-2.1.0]# bin/kafka-console-consumer.sh --bootstrap-server localhost:9092
--topic test --from-beginning

8、测试发送消息,消费消息

在生成者这边发送消息
image.png

可以看到在消费者这边顺利接受到了消息

image.png

9、查看topic的信息

[root@localhost kafka_2.11-2.1.0]# bin/kafka-topics.sh  --describe --zookeeper localhost:2181 --topic test

我们可以看到topic相关的信息

image.png

四、kafka的核心特性

4.1 kafka producer消息分区

image.png

4.2 消费者组

image.png

kafka保证一个partition只被一个消费者组内的其中一个消费者消费。

加入一个新的consumer,会重平衡。

image.png

添加消费者会再次重平衡,消费者组消费者的数量一定要小于等于topic的partition否则就会造成浪费。

两个消费者组消费Topic T1

image.png