kafka

本文深入解析消息队列的基本概念,包括点对点模式和发布/订阅模式,阐述了消息队列的优势,并详细介绍了Kafka这一高吞吐量的分布式发布订阅消息系统的工作原理、架构及配置。

一、消息队列(MQ)

1.1,消息队列是消息的传输过程中保存消息的容器。它有两种模式:

(1)点对点模式:一对一,消费者主动拉取数据,消费速度由自己控制,消息收到后消息清除。

         缺点:只能一个消费者消费,且消费者需要主动监听队列。

(2)发布/订阅模式:一对多,数据生产后,主动推送给所有订阅者。

         缺点:不同客户端消费消息的速度可能不一样,而队列推送消息的速度是一样的,可能造成资源的浪费。

1.2,消息队列的优点

解耦、冗余、扩展、灵活性、可恢复性、顺序保证(先进先出)、缓冲、异步通信。

二、什么是kafka

2.1,概念

Kafka是一种高吞吐量的分布式发布订阅消息系统(集群),它可以处理消费者在网站中的所有动作流数据。kafka对消息保存时根据Topic分类(保存在Topic中),发送消息者成为Producer,消息接收者为Consumer。此外,kafka集群有多个kafka实例组成,每个实例(Server)称为broker。无论是kafka集群还是consumer,都依赖域zookeeper集群保存一些meta信息,保证系统的可用性。

2.2,kafka架构

Partition(分区):负载均衡,提高并发,提高效率,可以向不同的区生产消息,同一个组的消费者不可以消费同一个分区的 消息。

Leader(主) 复制给Follower,一个broker一个Leader,生产者生产消息和消费者消费消息首先都是找Leader

Follower(从):存备份,当有Leader挂了时,Follower工作

Zookeeper:kafka集群搭建依赖于Zookeeper。消费者消费到哪条消息的标记(offset)存在zookeeper(老版本kafka这样处理的),新版本将offset存在Topic

2.3,kafka常用配置文件

(1)解压kafka

(2)配置文件

(3)修改config/server.properties文件

broker.id:节点id,整型唯一,我们三台分别设置0、1、2

delete.topic.enable=true:默认false,是否允许删除topic

log.dirs:除了存储日志文件,我们的发送的消息也存储在这个目录(可以自定义目录)

log.retention.hours:kafka消息保存时间(默认7天),超过被删除

log.segment.bytes:kafka消息保存大小(默认1个G),超过被删除

zookeeper.connect:连接的zookeeper集群

kafka集群是依赖于zookeeper集群的,要搭建启动kafka集群,必须先启动zookeeper集群。

三、kafka工作流程

3.1,生产数据流程

3.1.1,写入方式

        producer采用(push)模式将消息发布到broker,每条消息都被追加到分区(partition)中,属于顺序写磁盘(顺序写磁盘效率要比随机写内存高,保证kafka吞吐率)。

3.1.2,分区(Partition)

消息发送时都被发送到一个topic,其本质是一个目录,而topic是由一些Partition Logs(分区日志)组成,其组织结构如下图所示:

我们可以看到,每个Partition中的消息都是有序的,生产的消息被不断追加到Partition log上,其中的每一个消息都被赋予了一个唯一的offset值。每个消费者也维护者唯一的offset,消费者A消费完消息,数据还是存在topic中的,还可以供消费者B消费,A自己不可以再重复消费了。

3.1.3,分区规则

(1)指定了partition,则直接使用

(2)未指定了partition但制定key,通过对key的value进行hash出一个partition

(3)partition和key都未指定,使用轮询选出一个partition

3.1.4,副本(Replication)

同一个partition可能会有多个副本(Replication),副本作用是做备份,Leader—>Follower(Leader和Follower不在同一台broker),生成和消费都是找Leader,当broker挂了之后从Follower中选举出Leader,保证高可用。

3.1.5,producer写入流程

ack机制(三种情况):

(1)当参数设置为0时:Producer不管leader响应(leader到底有没有收到消息),只管发送,效率最高,最不安全,容易丢数据

(2)当参数设置为1时:只要Leader收到消息时,给Producer发送ACK(不管有没有备份到followers),Producer就继续发送吓一跳数据

(3)当参数设置为all(-1)时:如上图所示,只有当leader收到消息且备份给所有followers(leader收到所有备份的ack后并向producer发送ack),producer收到ack后才发送下一条消息。效率低,但不会丢失数据

3.2,Broker保存消息

物理上把topic分成一个或多个partition(对应server.properties中的num.partition=3配置),每个partition物理上对应一个文件夹(该文件夹存储该partition的所有消息和索引文件)

3.3,kafka消费过程

kafka提供了两套consumer API,高级consumer API和低级consumer API。

1,高级consumer API优点:不需要自行管理offset,系统通过zookeeper自行管理。也不需要管理分区、副本等情况。

   缺点:不能自行控制offset(特殊需求:重复消费数据)、不能细化控制分区、副本、zk等

2,低级consumer API优点:能然开发者自己控制offset,想从哪读取就从哪读取。自行控制连接分区,对分区自定义进行负载均衡

   缺点:太过复杂,需要自行控制offset,连接哪个分区,找到leader等

3.3.1,消费方式

consumer采用pull(拉取)方式从broker读取数据。

         push(推)模式很难适应消费速率不同的消费者,因为消息发送速率是有broker决定的,它的目标是尽可能以最快速度传递消息,容易造成consumer来不及处理,典型的表现就是拒绝服务以及网络拥塞。而pull模式可以根据consumer的消费能力以适当的速率消费消息(同时还可以自己控制消费方式—批量消费还是逐条消费)。pull模式缺点在于:如果kafla没有数据,消费者可能陷入循环中,一直等待数据到达。为了避免,在我们拉请求当中有参数,允许消费者请求在等待数据到达的 “长轮询” 中进行阻塞。

 

 

### Kafka入门教程及使用场景 #### 一、Kafka简介 Apache Kafka 是一种分布式流处理平台,能够实现高吞吐量的消息传递系统。它最初由 LinkedIn 开发并开源,现已成为 Apache 软件基金会的一部分[^1]。 #### 二、Kafka的安装与配置 以下是基于 Docker 的 Kafka 安装方法: ```yaml version: "1" services: kafka: image: 'bitnami/kafka:latest' hostname: kafka ports: - 9092:9092 - 9093:9093 volumes: - 'D:\Docker\Kafka\data:/bitnami/kafka' networks: - kafka_net environment: # KRaft settings - KAFKA_CFG_NODE_ID=0 - KAFKA_CFG_PROCESS_ROLES=controller,broker - KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@kafka:9093 # Listeners - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093 - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://192.168.2.51:9092 - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT - KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER - KAFKA_CFG_INTER_BROKER_LISTENER_NAME=PLAINTEXT networks: kafka_net: driver: bridge ``` 运行命令如下: ```bash docker-compose -f .\docker-compose.yml up -d ``` 上述 YAML 文件定义了一个简单的 Kafka 集群环境,并通过 `docker-compose` 启动服务[^1]。 #### 三、Kafka的基础概念 在 Kafka 中,消息被存储在主题(Topic)中,而每个 Topic 又分为若干分区(Partition)。每个分区有一个 Leader 和零个或多个 Follower。Leader 负责读写操作,Follower 则同步数据以提供冗余支持。当创建一个新的 Topic 时,Kafka 自动将 Partition 的 Leader 均匀分布到各个 Broker 上,从而提高系统的可靠性和性能[^2]。 #### 四、可视化管理工具 Offset Explorer 是一款常用的 Kafka 数据管理和监控工具,可以帮助开发者更直观地查看和分析 Kafka 主题中的偏移量和其他元数据信息[^1]。 #### 五、Kafka的主要使用场景 1. **日志收集**:Kafka 可用于集中式日志采集方案,实时捕获来自不同服务器的日志文件。 2. **消息队列**:作为传统 MQ 替代品,Kafka 提供高性能异步通信机制。 3. **活动跟踪**:记录用户的在线行为轨迹,便于后续数据分析挖掘价值。 4. **指标监测**:构建企业级运营状态仪表盘,展示关键业务指标变化趋势。 5. **ETL流程优化**:连接多种数据库之间复杂的数据转换过程,提升效率减少延迟。 #### 六、总结 通过对 Kafka 的基本原理理解及其实际应用场景探讨,可以更好地掌握如何利用这一强大技术解决现实世界中的挑战性问题。 问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值