赞
踩
消息队列是一种进程间通信或同一进程的不同线程间的通信方式,软件的贮列用来处理一系列的输入,通常是来自用户。消息队列提供了异步的通信协议,每一个贮列中的纪录包含详细说明的资料,包含发生的时间,输入设备的种类,以及特定的输入参数,也就是说:消息的发送者和接收者不需要同时与消息队列交互。
Kafka地址
:https://github.com/apache/kafkaRocketMq地址
:https://github.com/apache/rocketmqPulsar地址
:https://github.com/apache/pulsarRabbitMq地址
:https://github.com/rabbitmq/rabbitmq-serverNsq地址
:https://github.com/nsqio/nsq提示:以下是本篇文章正文内容,下面案例可供参考
Kafka 适合离线和在线消息消费
。 Kafka 消息保留在磁盘上,并在群集内复制以防止数据丢失。 Kafka 构建在 ZooKeeper 同步服务之上。 它与 Apache Storm 和 Spark 非常好地集成,用于实时流式数据分析。多副本备份
、横向扩展能力
。生产者往队列里写消息,消费者从队列里取消息进行业务逻辑。一般在架构设计中起到解耦
、削峰
、异步处理
的作用。
broker(经纪人,代理人)
: Kafka实例
broker
:Kafka 集群中有很多台 Server,其中每一台 Server 都可以存储消息,将每一台 Server 称为一个 kafka 实例,也叫做 broker。Topic(主题)
: 同类消息集合
topic
里保存的是同一类消息,相当于对消息的分类
,每个 producer 将消息发送到 kafka 中,都需要指明要存的 topic 是哪个,也就是指明这个消息属于哪一类。Partition(分区)
:每个 partition 在存储层面是 append log 文件
每个 topic 都可以分成多个 partition
,每个 partition 在存储层面是 append log 文件
。任何发布到此 partition 的消息都会被直接追加到 log 文件的尾部。为什么要进行分区呢?
最根本的原因就是:kafka基于文件进行存储,当文件内容大到一定程度时,很容易达到单个磁盘的上限,因此,采用分区的办法**,一个分区对应一个文件**,这样就可以将数据分别存储
到不同的server上去,另外这样做也可以负载均衡
,容纳更多的消费者。多个消息就会分别分布在多个分区里面
偏移量(Offset)
:
不允许对消息进行“随机读写”
。分组(Group)
:同组消费者
每个topic的订阅单位都是以组位单位
,同一组内的消费者消费消息是互斥的关系,类似我们微信的多个终端
,一个处理之后,其他都不用处理。总之:一个 topic 对应的多个 partition 分散存储到集群中的多个 broker 上,存储方式是一个 partition 对应一个文件,每个 broker 负责存储在自己机器上的 partition 中的消息读写。
Zookeeper是一个分布式配置和同步服务
Kafka 在 Zookeeper 中存储基本元数据(如偏移量Offset、主题Topic)
由于所有关键信息存储在 Zookeeper 中,并且它通常在其整体上复制此数据,因此Kafka代理/ Zookeeper 的故障不会影响 Kafka 集群的状态。
# 1, 安装Zookeeper kafka docker pull wurstmeister/kafka docker pull zookeeper # 2.1, 启动Zookeeper docker run -d --name zookeeper -p 2181:2181 -v /mnt/d/apps/kafkaData/zookeeper/data:/data -v /mnt/d/apps/kafkaData/zookeeper/log:/datalog zookeeper # 2.2, 启动Kafka # PS 172.27.107.133 是宿主机地址 docker run -d --name kafka --publish 9092:9092 \ --link zookeeper \ --env KAFKA_ZOOKEEPER_CONNECT=172.28.207.86:2181 \ --env KAFKA_ADVERTISED_HOST_NAME=172.28.207.86 \ --env KAFKA_ADVERTISED_PORT=9092 \ --env KAFKA_LOG_DIRS=/kafka/kafka-logs-1 \ -v /mnt/d/apps/kafkaData/kafka/log:/kafka/kafka-logs-1 \ wurstmeister/kafka # 3. CRUD Topic # 创建 topic docker exec kafka kafka-topics.sh --create --zookeeper 172.28.207.86:2181 --replication-factor 1 --partitions 1 --topic topic_gbc_order # 查看 topic docker exec kafka kafka-topics.sh --list --zookeeper 172.28.207.86:2181 # docker exec -it kafka kafka-console-producer.sh --broker-list 192.168.60.133:9092 --topic test # 4. CRUD 消费者Consumer和生产者 # 创建 生产者 docker exec -it kafka kafka-console-producer.sh --broker-list 172.28.207.86:9092 --topic topic_gbc_order # 创建 消费者 docker exec -it kafka kafka-console-consumer.sh --bootstrap-server 172.28.207.86:9092 --topic topic_gbc_order --from-beginning
通过Docker compose 创建 kafka和zookeeper
docker-compose up -d
compose.yaml
version: '3' services: zookeeper: image: zookeeper # 镜像名称 restart: unless-stopped ports: - "2181:2181" volumes: - /mnt/d/apps/kafkaData/zookeeper/data:/data # 数据文件夹挂载 - /mnt/d/apps/kafkaData/zookeeper/log:/datalog # 日志文件夹挂载 container_name: zookeeper # 容器名称 kafka: image: wurstmeister/kafka # 镜像名称 ports: - "9092:9092" environment: KAFKA_ADVERTISED_HOST_NAME: "172.27.107.133" # 宿主机地址 KAFKA_ZOOKEEPER_CONNECT: "zookeeper:2181" KAFKA_LOG_DIRS: "/kafka/kafka-logs-1" # 日志路径 volumes: - /mnt/d/apps/kafkaData/kafka/log:/kafka/kafka-logs-1 # 日志挂载 depends_on: - zookeeper # 依赖镜像 container_name: kafka # 容器名称
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。