|
@@ -37,7 +37,7 @@ kafka、JMS(ActiveMQ)就属于这个流派,⽣产者会发送 key 和数
|
|
|
|
|
|
这种的代表是 RabbitMQ(或者说是 AMQP)。⽣产者发送 key 和数据,消费者定义订阅的队列,Broker 收到数据之后会通过⼀定的逻辑计算出 key 对应的队列,然后把数据交给队列
|
|
|

|
|
|
-这种模式下解耦了 key 和 queue,在这种架构中 queue 是⾮常轻ᰁ级的(在 RabbitMQ 中它的上限取决于你的内存),消费者关⼼的只是⾃⼰的 queue;⽣产者不必关⼼数据最终给谁只要指定 key 就⾏了,中间的那层映射在 AMQP 中叫 exchange(交换机)。
|
|
|
+这种模式下解耦了 key 和 queue,在这种架构中 queue 是⾮常轻量级的(在 RabbitMQ 中它的上限取决于你的内存),消费者关⼼的只是⾃⼰的 queue;⽣产者不必关⼼数据最终给谁只要指定 key 就⾏了,中间的那层映射在 AMQP 中叫 exchange(交换机)。
|
|
|
|
|
|
AMQP 中有四种 exchange
|
|
|
* Direct exchange:key 就等于 queue
|
|
@@ -53,7 +53,7 @@ AMQP 中有四种 exchange
|
|
|

|
|
|
节点之间通讯的消息都是发送到彼此的队列中,每个节点都既是⽣产者⼜是消费者。ZeroMQ做的事情就是封装出⼀套类似于 Socket 的 API 可以完成发送数据,读取数据
|
|
|
|
|
|
-ZeroMQ 其实就是⼀个跨语⾔的、᯿ᰁ级的 Actor 模型邮箱库。你可以把⾃⼰的程序想象成⼀个 Actor,ZeroMQ 就是提供邮箱功能的库;ZeroMQ 可以实现同⼀台机器的 RPC 通讯也可以实现不同机器的 TCP、UDP 通讯,如果你需要⼀个强⼤的、灵活、野蛮的通讯能⼒,别犹豫 ZeroMQ
|
|
|
+ZeroMQ 其实就是⼀个跨语⾔的、轻量级的 Actor 模型邮箱库。你可以把⾃⼰的程序想象成⼀个 Actor,ZeroMQ 就是提供邮箱功能的库;ZeroMQ 可以实现同⼀台机器的 RPC 通讯也可以实现不同机器的 TCP、UDP 通讯,如果你需要⼀个强⼤的、灵活、野蛮的通讯能⼒,别犹豫 ZeroMQ
|
|
|
|
|
|
|
|
|
# 三、Kafka的基本知识
|
|
@@ -66,18 +66,18 @@ ZeroMQ 其实就是⼀个跨语⾔的、᯿ᰁ级的 Actor 模型邮箱库。你
|
|
|
* 上传到kafka服务器上:/usr/local/kafka
|
|
|
* 解压缩压缩包
|
|
|
* 进入到config目录内,修改server.properties
|
|
|
-```
|
|
|
+```shell
|
|
|
#broker.id属性在kafka集群中必须要是唯⼀
|
|
|
broker.id=0
|
|
|
#kafka部署的机器ip和提供服务的端⼝号
|
|
|
-listeners=PLAINTEXT://192.168.245.21:9092
|
|
|
+listeners=PLAINTEXT://127.0.0.1:9092
|
|
|
#kafka的消息存储⽂件
|
|
|
log.dir=/usr/local/kafka/data/kafka-logs
|
|
|
#kafka连接zookeeper的地址
|
|
|
zookeeper.connect=localhost:2181
|
|
|
```
|
|
|
* 进入到bin目录内,执行以下命令来启动kafka服务器(带着配置文件)
|
|
|
-```
|
|
|
+```shell
|
|
|
# 先启动zookeeper,使用自带的zookeeper
|
|
|
bin/zookeeper-server-start.sh -daemon config/zookeeper.properties
|
|
|
# 启动kafka
|
|
@@ -85,7 +85,7 @@ bin/kafka-server-start.sh -daemon config/server.properties
|
|
|
# 这里的-daemon为可选参数,加上就是后台启动,不加就是前台启动会打印到控制台。
|
|
|
```
|
|
|
* 校验kafka是否启动成功:
|
|
|
-```
|
|
|
+```shell
|
|
|
# 进入到zk内查看是否有kafka的节点:
|
|
|
bin/zookeeper-shell.sh 127.0.0.1:2181
|
|
|
ls /brokers/ids/
|
|
@@ -108,21 +108,22 @@ ls /brokers/ids/
|
|
|
## 3.创建topic
|
|
|
|
|
|
* 通过kafka命令向zk中创建⼀个主题
|
|
|
-```
|
|
|
-./kafka-topics.sh --create --zookeeper 127.0.0.1:2181 --replication-factor 1 --partitions 1 --topic test
|
|
|
+
|
|
|
+```sh
|
|
|
+kafka-topics.sh --create --zookeeper 127.0.0.1:2181 --replication-factor 1 --partitions 1 --topic test
|
|
|
```
|
|
|
|
|
|
* 查看当前zk中所有的主题
|
|
|
-```
|
|
|
-./kafka-topics.sh --list --zookeeper 192.168.0.:2181
|
|
|
+```shell
|
|
|
+kafka-topics.sh --list --zookeeper 127.0.0.1:2181
|
|
|
```
|
|
|
|
|
|
## 4.发送消息
|
|
|
|
|
|
kafka⾃带了⼀个producer命令客户端,可以从本地⽂件中读取内容,或者我们也可以以命令⾏中直接输⼊内容,并将这些内容以消息的形式发送到kafka集群中。在默认情况下,每⼀个⾏会被当做成⼀个独⽴的消息。使⽤kafka的发送消息的客户端,指定发送到的kafka服务器地址和topic
|
|
|
|
|
|
-```
|
|
|
-./kafka-console-producer.sh --broker-list 192.168.245.21:9092 --topic test
|
|
|
+```shell
|
|
|
+kafka-console-producer.sh --broker-list 127.0.0.1:9092 --topic test
|
|
|
```
|
|
|
|
|
|
|
|
@@ -131,13 +132,13 @@ kafka⾃带了⼀个producer命令客户端,可以从本地⽂件中读取内
|
|
|
对于consumer,kafka同样也携带了⼀个命令⾏客户端,会将获取到内容在命令中进⾏输出,默认是消费最新的消息。使⽤kafka的消费者消息的客户端,从指定kafka服务器的指定topic中消费消息
|
|
|
|
|
|
* ⽅式⼀:从最后⼀条消息的偏移量+1开始消费
|
|
|
-```
|
|
|
-# 创建消费者时,若不指定group.id,则该消费者属于默认消费组
|
|
|
-./kafka-console-consumer.sh --bootstrap-server 192.168.245.21:9092 -topic test
|
|
|
+```shell
|
|
|
+# 创建消费者时,若不指定group.id,则会创建一个默认的消费者组,组里面只有test这一个消费者
|
|
|
+kafka-console-consumer.sh --bootstrap-server 127.0.0.1:9092 -topic test
|
|
|
```
|
|
|
* ⽅式⼆:从头开始消费
|
|
|
-```
|
|
|
-./kafka-console-consumer.sh --bootstrap-server 192.168.245.21:9092 --from-beginning --topic test
|
|
|
+```shell
|
|
|
+kafka-console-consumer.sh --bootstrap-server 127.0.0.1:9092 --from-beginning --topic test
|
|
|
```
|
|
|
|
|
|
|
|
@@ -147,7 +148,7 @@ kafka⾃带了⼀个producer命令客户端,可以从本地⽂件中读取内
|
|
|

|
|
|
|
|
|
* ⽣产者将消息发送给broker,broker会将消息保存在本地的⽇志⽂件中
|
|
|
-```
|
|
|
+```shell
|
|
|
/usr/local/kafka/data/kafka-logs/主题-分区/00000000.log
|
|
|
```
|
|
|
* 消息的保存是有序的,通过offset偏移量来描述消息的有序性
|
|
@@ -158,27 +159,27 @@ kafka⾃带了⼀个producer命令客户端,可以从本地⽂件中读取内
|
|
|
在⼀个kafka的topic中,启动两个消费者,⼀个⽣产者,问:⽣产者发送消息,这条消息是否同时会被两个消费者消费?
|
|
|
|
|
|
如果多个消费者在同⼀个消费组,那么只有⼀个消费者可以收到订阅的topic中的消息。换⾔之,同⼀个消费组中只能有⼀个消费者收到⼀个topic中的消息。
|
|
|
-```
|
|
|
-./kafka-console-consumer.sh --bootstrap-server 127.0.0.1:9092 --consumer-property group.id=testGroup --topic test
|
|
|
+```shell
|
|
|
+kafka-console-consumer.sh --bootstrap-server 127.0.0.1:9092 --consumer-property group.id=testGroup --topic test
|
|
|
```
|
|
|
|
|
|
## 8.多播消息
|
|
|
|
|
|
不同的消费组订阅同⼀个topic,那么不同的消费组中只有⼀个消费者能收到消息。实际上也是多个消费组中的多个消费者收到了同⼀个消息。
|
|
|
-```
|
|
|
-./kafka-console-consumer.sh --bootstrap-server 192.168.0.4:9092 --consumer-property group.id=testGroup1 --topic test
|
|
|
+```shell
|
|
|
+kafka-console-consumer.sh --bootstrap-server 192.168.0.4:9092 --consumer-property group.id=testGroup1 --topic test
|
|
|
|
|
|
-./kafka-console-consumer.sh --bootstrap-server 192.168.245.21:9092 --consumer-property group.id=testGroup2 --topic test
|
|
|
+kafka-console-consumer.sh --bootstrap-server 127.0.0.1:9092 --consumer-property group.id=testGroup2 --topic test
|
|
|
```
|
|
|
下图就是描述多播和单播消息的区别
|
|
|

|
|
|
|
|
|
## 9. 查看消费组的详细信息
|
|
|
-```
|
|
|
+```shell
|
|
|
# 查看当前主题下有哪些消费组
|
|
|
-./kafka-consumer-groups.sh --bootstrap-server 192.168.245.21:9092 --list
|
|
|
+kafka-consumer-groups.sh --bootstrap-server 127.0.0.1:9092 --list
|
|
|
# 通过以下命令可以查看到消费组的详细信息:
|
|
|
-./kafka-consumer-groups.sh --bootstrap-server 192.168.245.21:9092 --describe --group testGroup
|
|
|
+kafka-consumer-groups.sh --bootstrap-server 127.0.0.1:9092 --describe --group testGroup
|
|
|
```
|
|
|
重点关注以下⼏个信息:
|
|
|
* current-offset: 最后被消费的消息的偏移量
|
|
@@ -204,12 +205,12 @@ kafka⾃带了⼀个producer命令客户端,可以从本地⽂件中读取内
|
|
|
|
|
|
### 2.2创建多分区的主题
|
|
|
|
|
|
-```
|
|
|
+```shell
|
|
|
# 为⼀个主题创建多个分区
|
|
|
-./kafka-topics.sh --create --zookeeper 192.168.245.21:2181 --replicationfactor 1 --partitions 2 --topic test1
|
|
|
+kafka-topics.sh --create --zookeeper 127.0.0.1:2181 --replicationfactor 1 --partitions 2 --topic test1
|
|
|
|
|
|
# 可以通过这样的命令查看topic的分区信息
|
|
|
-./kafka-topics.sh --describe --zookeeper 192.168.245.21:2181 --topic test1
|
|
|
+kafka-topics.sh --describe --zookeeper 127.0.0.1:2181 --topic test1
|
|
|
```
|
|
|
|
|
|
|
|
@@ -232,18 +233,18 @@ kafka⾃带了⼀个producer命令客户端,可以从本地⽂件中读取内
|
|
|
|
|
|
* 创建三个server.properties⽂件
|
|
|
|
|
|
-```
|
|
|
+```shell
|
|
|
# 0 1 2
|
|
|
broker.id=2
|
|
|
// 9092 9093 9094
|
|
|
-listeners=PLAINTEXT://192.168.245.21:9094
|
|
|
+listeners=PLAINTEXT://127.0.0.1:9094
|
|
|
//kafka-logs kafka-logs-1 kafka-logs-2
|
|
|
log.dir=/usr/local/data/kafka-logs-2
|
|
|
```
|
|
|
|
|
|
* 通过命令来启动三台broker
|
|
|
|
|
|
-```
|
|
|
+```shell
|
|
|
./kafka-server-start.sh -daemon ../config/server.properties
|
|
|
./kafka-server-start.sh -daemon ../config/server1.properties
|
|
|
./kafka-server-start.sh -daemon ../config/server2.properties
|
|
@@ -251,7 +252,7 @@ log.dir=/usr/local/data/kafka-logs-2
|
|
|
|
|
|
* 校验是否启动成功
|
|
|
|
|
|
-```
|
|
|
+```shell
|
|
|
# 进入到zk内查看是否有kafka的节点:
|
|
|
bin/zookeeper-shell.sh 127.0.0.1:2181
|
|
|
ls /brokers/ids/
|
|
@@ -261,17 +262,17 @@ ls /brokers/ids/
|
|
|
|
|
|
在创建主题时,除了指明了主题的分区数以外,还指明了副本数,那么副本是⼀个什么概念呢?
|
|
|
|
|
|
-```
|
|
|
+```shell
|
|
|
# 副本是对分区的备份。在集群中,不同的副本会被部署在不同的broker上。下⾯例⼦:创建1个主题,2个分区、3个副本。
|
|
|
-./kafka-topics.sh --create --zookeeper 192.168.245.21:2181 --replication-factor 3 --partitions 2 --topic my-replicated-topic
|
|
|
+kafka-topics.sh --create --zookeeper 127.0.0.1:2181 --replication-factor 3 --partitions 2 --topic my-replicated-topic
|
|
|
```
|
|
|
|
|
|
副本是为了为主题中的分区创建多个备份,多个副本在kafka集群的多个broker中,会有⼀个副本作为leader,其他是follower。
|
|
|
查看topic情况:
|
|
|
|
|
|
-```
|
|
|
+```shell
|
|
|
# 查看topic情况
|
|
|
-./kafka-topics.sh --describe --zookeeper 192.168.245.21:2181 --topic my-replicated-topic
|
|
|
+kafka-topics.sh --describe --zookeeper 127.0.0.1:2181 --topic my-replicated-topic
|
|
|
```
|
|
|

|
|
|

|
|
@@ -290,19 +291,19 @@ kafka的写和读的操作,都发⽣在leader上。leader负责把数据同步
|
|
|
## 3.关于集群消费
|
|
|
|
|
|
### 3.1向集群发送消息:
|
|
|
-```
|
|
|
-./kafka-console-producer.sh --broker-list 192.168.245.21:9092,192.168.245.21:9093,192.168.245.21:9094 --topic my-replicated-topic
|
|
|
+```shell
|
|
|
+./kafka-console-producer.sh --broker-list 127.0.0.1:9092,127.0.0.1:9093,127.0.0.1:9094 --topic my-replicated-topic
|
|
|
```
|
|
|
|
|
|
### 3.2从集群中消费消息
|
|
|
-```
|
|
|
+```shell
|
|
|
./kafka-console-producer.sh --broker-list
|
|
|
-192.168.245.21:9092,192.168.245.21:9093,192.168.245.21:9094 --topic my-replicated-topic
|
|
|
+127.0.0.1:9092,127.0.0.1:9093,127.0.0.1:9094 --topic my-replicated-topic
|
|
|
```
|
|
|
### 3.3指定消费组来消费消息
|
|
|
-```
|
|
|
+```shell
|
|
|
./kafka-console-consumer.sh --bootstrap-server
|
|
|
-192.168.245.21:9092,192.168.245.21:9093,192.168.245.21:9094 --frombeginning --consumer-property group.id=testGroup1 --topic my-replicated-topic
|
|
|
+127.0.0.1:9092,127.0.0.1:9093,127.0.0.1:9094 --frombeginning --consumer-property group.id=testGroup1 --topic my-replicated-topic
|
|
|
```
|
|
|
|
|
|
### 3.4分区分消费组的集群消费中的细节
|