🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] ## 概述 kafka :https://juejin.im/post/6844904013062733837 消息队列:https://mp.weixin.qq.com/s?__biz=MzI4Njg5MDA5NA==&mid=2247485080&idx=1&sn=f223feb9256727bde4387d918519766b&chksm=ebd74799dca0ce8fa46223a33042a79fc16ae6ac246cb8f07e63a4a2bdce33d8c6dc74e8bd20&token=1755043505&lang=zh_CN#rd Redis合集:https://mp.weixin.qq.com/s?__biz=MzI4Njg5MDA5NA==&mid=2247484609&idx=1&sn=4c053236699fde3c2db1241ab497487b&chksm=ebd745c0dca0ccd682e91938fc30fa947df1385b06d6ae9bb52514967b0736c66684db2f1ac9&token=177635168&lang=zh_CN&scene=21#wechat_redirect 拉模式和推模式:https://cloud.tencent.com/developer/news/684791 那为什么还需要消息队列(MQ)这种**中间件**呢???其实这个问题, Redis是一个以`key-value`形式存储的内存数据库,明明我们可以使用类似HashMap这种实现类就可以达到类似的效果了,那还为什么要Redis?《[Redis合集] * 到这里,大家可以先猜猜为什么要用消息队列(MQ)这种**中间件**,下面会继续补充。 我想的原因有 1. 可以水平扩展生产者,消费者。增加吞吐量 消息队列可以简单理解为:**把要传输的数据放在队列中**。 ## kafka 下载 & 安装 & 配置 使用docker安装 ### 拉取kafka和zookeeper镜像并启动容器 ``` docker pull wurstmeister/zookeeper docker pull wurstmeister/kafka ``` 启动zookeeper容器 ``` $ docker run -d --name zookeeper -p 2181:2181 -t wurstmeister/zookeeper ``` 启动kafka容器 ``` docker run -d --name kafka -p 9092:9092 -e KAFKA_BROKER_ID=0 -e KAFKA_ZOOKEEPER_CONNECT=192.168.6.143:2181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.6.143:9092 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 -t wurstmeister/kafka ``` 这里面主要设置了4个参数 ``` KAFKA_BROKER_ID=0 KAFKA_ZOOKEEPER_CONNECT=192.168.6.143:2181 KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.6.143:9092 KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 ``` 中间两个参数的192.168.204.128改为宿主机器的IP地址,如果不这么设置,可能会导致在别的机器上访问不到kafka。 ### 启动 消息发送方和接收方 进入kafka容器的命令行 ``` docker exec -it kafka /bin/bash ``` 进入kafka所在目录 ``` cd /opt/kafka_2.13-2.6.0/ ``` 启动消息发送方 ``` ./bin/kafka-console-producer.sh --broker-list localhost:9092 --topic mykafka ``` 克隆会话 进入kafka所在目录 ``` cd /opt/kafka_2.13-2.6.0/ ``` 启动消息接收方 ``` ./bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic mykafka --from-beginning ``` ### 测试kafka 在消息发送方输入123456 在消息接收方查看 如果看到123456 消息发送完成 ### 集群搭建 使用docker命令可快速在同一台机器搭建多个kafka,只需要改变brokerId和端口 ``` docker run -d --name kafka1 -p 9093:9093 -e KAFKA_BROKER_ID=1 -e KAFKA_ZOOKEEPER_CONNECT=192.168.1.100:2181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.1.100:9093 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9093 -t wurstmeister/kafka ``` 创建Replication为2,Partition为2的topic 在kafka容器中的opt/kafka_2.12-1.1.0/目录下输入 ``` bin/kafka-topics.sh --create --zookeeper 192.168.1.100:2181 --replication-factor 2 --partitions 2 --topic partopic ``` 查看topic的状态 在kafka容器中的opt/kafka\_2.12-1.1.0/目录下输入 ``` bin/kafka-topics.sh --describe --zookeeper 192.168.1.100:2181 --topic partopic ``` 输出结果: ``` Topic:partopic PartitionCount:2 ReplicationFactor:2 Configs: Topic: partopic Partition: 0 Leader: 0 Replicas: 0,1 Isr: 0,1 Topic: partopic Partition: 1 Leader: 0 Replicas: 1,0 Isr: 0,1 ``` 显示每个分区的Leader机器为broker0,在broker0和1上具有备份,Isr代表存活的备份机器中存活的。 当停掉kafka1后, ``` docker stop kafka1 ``` 再查看topic状态,输出结果: ``` Topic:partopic PartitionCount:2 ReplicationFactor:2 Configs: Topic: partopic Partition: 0 Leader: 0 Replicas: 0,1 Isr: 0 Topic: partopic Partition: 1 Leader: 0 Replicas: 1,0 Isr: 0 ```