【JAVA探索之路】简单聊聊Kafka

【JAVA探索之路】简单聊聊Kafka

目录

一、Kafka核心概念与架构

核心概念解析

集群架构一览

二、Kafka核心特性与工作原理

顺序I/O与零拷贝

生产者可靠性保证

精确一次语义

三、Kafka关键API与生态系统

四、Kafka运维管理

五、Kafka典型应用场景


一、Kafka核心概念与架构

要掌握 Kafka,必须从理解其精心设计的基本模型开始。

核心概念解析

  • 消息与批次:Kafka 的基本数据单元称为“记录”,包含键、值和时间戳。为提高效率,多条记录会组合成“批次”进行传输。
  • 主题与分区:消息按“主题”进行分类,类似于数据库的表。每个主题可被分割为多个“分区”,这是 Kafka 实现并行处理和横向扩展的基石。消息在分区内按追加顺序存储,并分配一个单调递增的偏移量,从而保证了消息的顺序性。
  • 生产与消费:生产者将消息发布到指定主题的特定分区;消费者则以“拉”的模式从分区读取消息。消费者通过管理“偏移量”来追踪读取进度。
  • 副本与容错:每个分区都有多个副本,分布在不同 Broker 上。其中一个副本被选举为领导者,处理所有读写请求;其他追随者副本则异步地从领导者同步数据,从而在节点故障时提供高可用性保障

集群架构一览

一个典型的 Kafka 集群由多个 Broker(服务器)组成。主题的各个分区及其副本均衡地分布在集群的 Broker 上。在旧版架构中,Kafka 依赖 ZooKeeper 进行元数据管理和控制器选举。而最新的 KRaft 模式​ 已使 Kafka 能够摆脱对 ZooKeeper 的依赖,使用自身协议进行集群元数据管理,简化了部署与运维,标志着 Kafka 走向成熟与自治。


二、Kafka核心特性与工作原理

Kafka 的卓越性能源于其一系列独特的设计选择。

顺序I/O与零拷贝

与传统消息队列将消息保存在内存中不同,Kafka 直接将消息持久化到磁盘日志文件。磁盘的顺序读写速度远超随机访问,这为高吞吐量奠定了基础。结合“零拷贝”技术,Kafka 能够在内核空间直接将磁盘文件数据发送到网卡缓冲区,绕过用户空间的多次拷贝,大幅降低了 CPU 开销和延迟。

生产者可靠性保证

生产者可以选择三种确认模式,在性能和可靠性间取得平衡:

  • acks=0:不等待确认,速度最快,但可能丢失消息。
  • acks=1:仅等待分区领导者确认,是常用折衷方案。
  • acks=all(-1):等待所有同步副本确认,最可靠,但延迟最高。

精确一次语义

Kafka 通过其事务API和生产者的幂等性,支持“精确一次”处理语义,确保消息既不会丢失也不会重复处理,这对金融、计费等关键场景至关重要。


三、Kafka关键API与生态系统

Kafka 的强大不仅在于其核心的消息传递能力,更在于其构建的丰富生态系统。

1. Kafka Connect:可扩展的集成框架

Kafka Connect 简化了Kafka与外部系统(如数据库、搜索引擎、文件系统)的数据同步。它提供了大量现成的连接器,用户可以轻松构建无需编写代码的可靠数据管道

2. Kafka Streams:嵌入式的流处理库

Kafka Streams 是一个客户端库,允许开发者直接在Java/Scala应用中构建高可用的、实时的流处理程序。它提供了高级的DSL和低级的Processor API,支持窗口、连接、聚合等复杂操作,并与Kafka的状态存储紧密集成,实现有状态的、容错的流处理。

3. ksqlDB:基于SQL的流处理

对于熟悉SQL的开发者,ksqlDB 提供了一种声明式的、基于SQL的接口来对Kafka中的数据流进行查询、转换和物化视图构建,极大降低了实时应用开发的门槛。

四、Kafka运维管理

1. 容量规划与性能调优

  • 分区策略:分区数决定了消费者的最大并行度,但并非越多越好。过多的分区会增加元数据开销和客户端延迟。通常建议从较小数量开始,根据吞吐量需求逐步增加。
  • 硬件选择:Kafka 性能严重依赖磁盘吞吐量和网络带宽。建议使用多块磁盘、配置为 RAID 0 或让每个 Broker 使用多个独立日志目录,以获得最佳 I/O 性能。
  • 关键配置:合理设置 log.retention.hours(数据保留时间)、num.replica.fetchers(副本拉取线程数)等参数,以适应业务场景。

2. 监控与告警

全面的监控是保障SLA的前提。需要监控的核心指标包括:

  • 集群健康:离线分区数、未同步副本数、控制器活跃状态。
  • Broker指标:磁盘使用率、网络入出吞吐量、请求处理器空闲率。
  • 生产/消费延迟:各分区生产/消费的端到端延迟、消费者滞后量。
  • 可结合 Prometheus、Grafana 和 Kafka 内置的 JMX 指标构建监控面板。

3. 安全与多租户

在生产环境,尤其是云上,必须启用安全机制:

  • 认证:使用 SSL/TLS 进行网络加密,使用 SASL 进行客户端身份验证。
  • 授权:通过访问控制列表(ACL)细粒度地控制用户/应用对主题的读、写、创建等权限。
  • 配额:为生产者和消费者设置带宽或请求速率配额,防止异常客户端拖垮整个集群。

五、Kafka典型应用场景

Kafka 的灵活性使其在多种架构模式中都能大放异彩:

1. 实时数据管道

这是Kafka最经典的应用。从各种源头(应用日志、数据库变更、传感器)收集数据,发布到Kafka主题,再由下游的流处理引擎(如Flink、Spark Streaming)或数据仓库进行实时分析和存储,构建端到端的实时数据处理链路

2. 微服务间的事件驱动通信

在微服务架构中,Kafka可以作为服务间的通信骨干,实现服务的解耦和异步通信。服务通过发布“领域事件”来通知其他服务状态变更,消费者服务根据自身逻辑决定是否及如何响应,这比同步的RPC调用更具弹性和可扩展性。

3. 活动跟踪与审计

网站或APP上的用户点击、浏览、搜索等行为事件可以实时发送到Kafka,用于用户行为分析、个性化推荐、异常检测和系统审计,为业务决策提供即时数据支持。


制作不易,如果对你有帮助请点赞,评论,收藏,感谢大家的支持

Read more

计算机视觉入门到实战系列(二十二)语义分割之FCN-8s算法

计算机视觉入门到实战系列(二十二)语义分割之FCN-8s算法

语义分割之FCN-8s算法 * 加载ResNet101 * 实现FCN模型 * 初始化部分 * 前向传播过程(关键!) * 双线性核 * 公式解释: * 示例(kernel_size=4): 我们选择ResNet101作为模型的主干网络.之前我们已经实现了ResNet34,这里我们不从零实现ResNet101了,而是直接从模型库里面加载。这里需要注意一般我们考虑两个方面通道数和分辨率,从这两个绝度去思考下面的转化。通道数和分辨率是两码事不要混淆。 加载ResNet101 from torchvision import models # 使用 ResNet101 作为主干网络,模型使用ImageNet预训练 pretrained_net = models.resnet101(pretrained='imagenet') 实现FCN模型

By Ne0inhk
C语言指针与函数的高级应用与底层原理

C语言指针与函数的高级应用与底层原理

C语言指针与函数的高级应用与底层原理 💡 学习目标:掌握指针作为函数参数、返回值的使用方法,理解函数指针的定义与调用逻辑,熟练运用指针函数和函数指针解决模块化开发问题。 💡 学习重点:指针参数的地址传递机制、指针函数的实现与应用、函数指针的定义与回调函数实战、指针与函数的内存底层逻辑。 50.1 指针作为函数参数:地址传递的核心原理 在C语言中,函数参数传递分为值传递和地址传递。值传递仅传递变量的副本,无法修改原变量;而地址传递通过指针直接操作原变量的内存地址,是实现函数修改外部变量的核心手段。 50.1.1 值传递与地址传递的对比 我们通过一个“交换两个整数”的案例,直观对比两种传递方式的差异: #include<stdio.h>// 方式1:值传递 - 无法交换原变量voidswap_value(int a,int b){int temp = a; a = b; b = temp;

By Ne0inhk
哈希的介绍

哈希的介绍

1. unordered系列关联式容器     下面来看哈希,首先看关联式容器unorder_map和unorder_set,它们底层是哈希表,用法和map set一样。下面浅浅过一下,它是单向迭代器,因为没有rbegin和rend。也就是红黑树和哈希表实现的map和set用法几乎相同,区别是:1.unorder系列是单向迭代器。2.unorder系列遍历出来不是有序的。下面演示一下: 它只能去重,不能排序,它也是有multi版本的。再演示一下unorder_map: 2.哈希     下面正式看哈希,什么是哈希呢?我们以前遇到的搜索有这样几类:首先是暴力查找,在一个数组里都查,这样非常慢。于是有人衍生出了有序数组的二分查找,但它的前提是排序,而且增删查改不方便,过程中为了保证有序会涉及大量的数据挪动。因此衍生出了平衡搜索树,此时基础上又出现了新的搜索,这种搜索叫哈希(散列)。它的本质是存储的值跟存储位置建立出一个映射关系,什么意思呢,先来看一个计数排序的样例: 有上面这样的一组值,最小的值是15,最大的值是30,总共开了16个空间。然后存映射关系(次数),15映射第一个位

By Ne0inhk
优选算法《滑动窗口》

优选算法《滑动窗口》

在优选算法的第一章当中我们了解了双指针算法,相信通过那几道算法题的讲解你已经知道该如何灵活的使用双指针了吧,那么接下来我们就接着来学习下一个优选算法——滑动窗口,你这时可能会疑惑这个算法在之前怎么完全没有听说过,没有关系接下来在本篇当中就将带你一步步的了解滑动窗口的算法原理以及在什么情况下适合使用滑动窗口来解决问题,并且还会通过几道算法题的讲解让你进一步的理解滑动窗口。那么接下来就开始本篇的学习吧!!! 1.滑动窗口算法 在此滑动窗口算法其实就是一种双指针中的特殊情况,只不过是因为在这种情况下的双指针有特殊的规律,因此我们就单独的将这种双指针的情况单独命名为一种算法,那么滑动窗口算法是什么情况下的双指针算法呢?接下来我们就来了解看看 在使用双指针当中,若出现两个指针从开始到结束一直都是朝着同一个方向移动的,并且都不会出现超另一个方向移动的情况这种就叫做滑动窗口,在此叫做这种算法是因为两个指针一直朝着同一个方向移动就像一个大小可能会变化的窗口一样。   那么了解了滑动窗口是什么之后,你可能会有疑惑了那滑动窗口该怎么用并且滑动窗口为什么算法逻辑是正确的呢,接下来我们就通过

By Ne0inhk