Kafka 架构深度解析:生产者(Producer)和消费者(Consumer)

Apache Kafka 作为分布式流处理平台,其架构中的生产者和消费者是核心组件,负责实现高效的消息生产和消费。本文将深入剖析 Kafka 架构中生产者和消费者的工作原理、核心概念以及高级功能。

Kafka 生产者(Producer)

1 发送消息到 Kafka

Kafka 生产者负责将消息发布到指定的主题。以下是一个简单的生产者示例代码:

// 示例代码:创建 Kafka 生产者
Properties properties = new Properties();
properties.put("bootstrap.servers", "localhost:9092");
properties.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
properties.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

Producer<String, String> producer = new KafkaProducer<>(properties);

// 发送消息到主题 "my-topic"
producer.send(new ProducerRecord<>("my-topic", "key", "Hello, Kafka!"));

// 关闭生产者
producer.close();

2 生产者参数配置

了解如何配置生产者参数是保障生产者性能和可靠性的关键。示例代码:

// 示例代码:配置 Kafka 生产者参数
properties.put("acks", "all");
properties.put("retries", 3);
properties.put("batch.size", 16384);
properties.put("linger.ms", 1);

Kafka 消费者(Consumer)

1 从 Kafka 消费消息

Kafka 消费者负责从指定的主题订阅消息并进行处理。以下是一个简单的消费者示例代码:

// 示例代码:创建 Kafka 消费者
Properties properties = new Properties();
properties.put("bootstrap.servers", "localhost:9092");
properties.put("group.id", "my-group");
properties.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
properties.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");

Consumer<String, String> consumer = new KafkaConsumer<>(properties);

// 订阅主题 "my-topic"
consumer.subscribe(Collections.singletonList("my-topic"));

// 消费消息
while (true) {
    ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));
    for (ConsumerRecord<String, String> record : records) {
        System.out.println("Received message: " + record.value());
    }
}

// 关闭消费者
consumer.close();

2 消费者组和 Offset

了解消费者组和 Offset 的概念对于实现可伸缩的消息处理系统至关重要。示例代码:

// 示例代码:创建消费者组
properties.put("group.id", "my-group");

// 获取消费者组的当前 Offset
bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --group my-group --describe

消费者的 Exactly Once 语义

Kafka 提供了强大的消息传递保证,包括至多一次和精确一次。了解如何配置消费者以实现 Exactly Once 语义:

// 示例代码:设置消费者的消息传递语义
properties.put("isolation.level", "read_committed");

扩展话题:生产者和消费者的高级用法

除了基本的消息发送和接收之外,Kafka 生产者和消费者还支持一系列高级用法,可以更灵活地满足各种复杂场景的需求。

1 生产者的事务支持

Kafka 从版本0.11开始引入了事务支持,使得生产者可以实现原子操作,确保消息的可靠性。

// 示例代码:使用 Kafka 事务
producer.initTransactions();
try {
    producer.beginTransaction();
    producer.send(new ProducerRecord<>("my-topic", "key", "value"));
    producer.send(new ProducerRecord<>("my-other-topic", "key", "value"));
    producer.commitTransaction();
} catch (ProducerFencedException | OutOfOrderSequenceException | AuthorizationException e) {
    producer.close();
} catch (KafkaException e) {
    producer.close();
    throw e;
}

2 消费者的多线程处理

在高吞吐量的场景下,多线程消费消息是提高效率的重要手段。消费者可以通过多线程同时处理多个分区的消息。

// 示例代码:多线程消费者
properties.put("max.poll.records", 500);
properties.put("max.poll.interval.ms", 300000);

Consumer<String, String> consumer = new KafkaConsumer<>(properties);

// 订阅主题 "my-topic"
consumer.subscribe(Collections.singletonList("my-topic"));

// 多线程消费消息
int numberOfThreads = 5;
ExecutorService executor = Executors.newFixedThreadPool(numberOfThreads);
while (true) {
    ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));
    for (ConsumerRecord<String, String> record : records) {
        executor.submit(() -> processRecord(record));
    }
}

// 关闭消费者
consumer.close();
executor.shutdown();

3 自定义序列化和反序列化

Kafka 默认提供了一些基本的序列化和反序列化器,但你也可以根据需求自定义实现。这在处理复杂数据结构时非常有用。

// 示例代码:自定义序列化器
public class CustomSerializer implements Serializer<MyObject> {
    @Override
    public byte[] serialize(String topic, MyObject data) {
        // 实现自定义序列化逻辑
    }
}

最佳实践和注意事项

在使用 Kafka 生产者和消费者时,需要注意一些最佳实践:

  • 配置合理的参数: 生产者和消费者的性能和行为受到各种参数的影响,需要根据实际场景进行合理配置。

  • 避免阻塞: 长时间的阻塞可能影响整体性能,需要确保消费者在处理消息时是高效而迅速的。

  • 处理异常和错误: 生产者和消费者在运行中可能会遇到各种异常和错误,需要实现适当的异常处理逻辑以确保系统的稳定性。

总结

Apache Kafka 架构中的生产者和消费者是构建实时数据流系统的关键组件,本文深入剖析了它们的工作原理、核心概念以及高级用法。对于生产者而言,不仅介绍了基本的消息发送,还详细探讨了参数配置和事务支持,使得开发者能更好地利用其强大功能。消费者部分不仅涵盖了消息的接收和消费,还深入讨论了消费者组、Offset、以及如何实现 Exactly Once 语义。文章进一步扩展到高级话题,包括生产者的事务支持、消费者的多线程处理和自定义序列化,使大家能够灵活应对不同的业务需求。

最后,本文总结了最佳实践和注意事项,强调了合理配置参数、避免阻塞、处理异常等方面的重要性。通过深刻理解这些核心组件,以及在实践中的灵活应用,开发者能够更好地构建高效、可靠的实时数据流系统。生产者和消费者作为 Kafka 生态系统的基石,为处理大规模、高并发的数据流提供了强大的工具。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/214663.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++】异常处理 ⑦ ( 异常类的继承层次结构 | 抛出 / 捕获 多个类型异常对象 | 抛出子类异常对象 / 捕获并处理 父类异常对象 )

文章目录 一、抛出 / 捕获 多个类型异常对象1、抛出 / 捕获 多个类型异常对象2、操作弊端3、完整代码示例 二、异常类的继承层次结构1、抛出子类异常对象 / 捕获并处理 父类异常对象2、完整代码示例 - 抛出子类异常对象 / 捕获并处理 父类异常对象 自定义的 异常类 , 可能存在 …

prometheus部署及与grafana结合应用

一、prometheus 介绍 prometheus server 是 Prometheus组件中的核心部分&#xff0c;负责实现对监控数据的获取&#xff0c;存储以及查询。它会定期从静态配置的监控目标或者基于服务发现自动配置的自标中进行拉取数据&#xff0c;当新拉取到的数据大于配置的内存缓存区时&…

Python 入门

目录 编译性语言 解释型语言 Python语言介绍 Python安装 配置环境变量 Pycharm安装 Pycharm基本使用 编译性语言 解释型语言 计算机是不能理解高级语言的&#xff0c;更不能直接执行高级语言&#xff0c;它只能直接理解机器语言&#xff0c;所以使用任何高级语言编写的程…

vue3项目脚手架如何使用swiper, ‘vue-awesome-swiper‘报错解决(简单示例)

目录 前言 使用方法 效果图 1.下载swiper 2. 写入需要的页面 3.在对应页面引入组件 4.推荐页完整代码 前言 Vue3和Vue2在使用swiper时是有差别的&#xff0c;Vue3引入swiper需要注意Vu3的版本和swiper的版本&#xff0c;如果不匹配通常会报错 如下&#xff1a;当引用版本过…

canvas基础:绘制虚线

canvas实例应用100 专栏提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。 canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重要的帮助。 文章目录 示例…

【深度学习实验】图像处理(四):PIL——自定义图像数据增强操作(图像合成;图像融合(高斯掩码))

文章目录 一、实验介绍二、实验环境1. 配置虚拟环境2. 库版本介绍 三、实验内容0. 导入必要的库1. PIL基础操作2~4. 随机遮挡、随机擦除、线性混合5. 图像合成5.1 原理5.2 实现5.3 效果展示 6. 图像融合6.1 原理6.2 实现6.3 效果展示 一、实验介绍 在深度学习任务中&#xff0c…

【数据库原理】函数依赖、三范式、视图、事务、数据库设计(概念、逻辑、物理结构设计,实施)、数据流图、数据字典、存储过程、触发器、备份与还原【我统统拿下!】

函数依赖 函数依赖是关系数据库中的重要概念&#xff0c;用于描述关系中属性之间的依赖关系。 在关系数据库中&#xff0c;如果关系 R 中的某个属性或属性组的值能够唯一确定关系中其他属性的值&#xff0c;那么我们就说这个属性或属性组对其他属性具有函数依赖关系。 举个例…

“此应用专为旧版android打造,因此可能无法运行”,问题解决方案

当用户在Android P系统上打开某些应用程序时&#xff0c;可能会弹出一个对话框&#xff0c;提示内容为&#xff1a;“此应用专为旧版Android打造&#xff0c;可能无法正常运行。请尝试检查更新或与开发者联系”。 随着Android平台的发展&#xff0c;每个新版本通常都会引入新的…

人工智能发展史

人工智能&#xff08;AI&#xff09;的发展史是一段跨越数十年的旅程&#xff0c;涵盖了从早期理论探索到现代技术革新的广泛内容。人工智能的发展历程展示了从最初的概念探索到现代技术突破的演变。尽管经历了多次起伏&#xff0c;但AI领域持续进步&#xff0c;不断拓展其应用…

springBoot整合task

springBoot整合task 文章目录 springBoot整合task开开关设置任务&#xff0c;并设置执行周期定时任务的相关配置 开开关 设置任务&#xff0c;并设置执行周期 Component public class MyBean {Scheduled(cron "0/1 * * * * ?")public void print(){System.out.prin…

Maven的安装与配置本地仓库,镜像源,环境变量详细步骤

参考视频&#xff1a; 黑马程序员2023新版JavaWeb开发教程&#xff0c;实现javaweb企业开发全流程 【小飞非系列】最新Maven实战教程-项目实战构建利器 文章目录 一.下载Maven安装包二.配置Maven的本地仓库(本机仓库)三.配置镜像源&#xff08;加速jar包的下载)四.配置Maven的环…

【Java 基础】17 集合

文章目录 1.基本概念2.核心接口3.常见实现1&#xff09;List 接口的实现类ArrayListLinkedListVector 2&#xff09;Set 接口的实现类HashSetLinkedHashSetTreeSet 3&#xff09;Queue 接口的实现**类**ArrayQueue 4&#xff09;Map 接口的实现类HashMapLinkedHashMapTreeMap 4…

监控之Spring Boot Admin

目录 一、Spring Boot Admin 简介 官方网址 简介 二、Spring Boot Admin的使用 启动SBA server 微服务端配置SBA server地址 查看监控信息 一、Spring Boot Admin 简介 官方网址 GitHup网址&#xff1a;GitHub - codecentric/spring-boot-admin: Admin UI for administ…

ChaoJi充电连接装置典型试验案例分析 GB/T 20234.1充电连接装置型式试验变化分析

GB/T 20234.1充电连接装置典型试验变化分析 1、ChaoJi充电连接装置典型试验案例分析 1.1、大功率直流充电接口 1.2、枪线尺寸、重量、面积数据对比 1.3、枪线温升对比试验 1.4、chaoji 枪线温升试验 1.5、chaoji枪线防护等级试验 1.6、GB/T 20234.4项目列表 1.7、小结 ✓ 通…

关于媒体查询不能生效的原因

问题 今天写媒体查询&#xff0c;遇到了个问题&#xff0c;卡了很久&#xff0c;引入三个样式&#xff1a;mainPageCommon.css、mainPageBig.css、mainPageSmall.css。其中的两个样式可以生效&#xff0c;但是小尺寸的媒体查询不能生效&#xff0c;这里很奇怪&#xff01;&…

Cairo编程语言

文章目录 Cairo编程语言一、背景二、什么是Cairo工作原理 三、Solidity 和 Cairo 的区别四、开发 Starknet 智能合约的工具链protostarstarknet-foundryScarb安装Scarb 安装starknet-foundry通过snfoundryupStarknet Foundry的snforge 命令行工具如何创建新项目、编译和测试snc…

Linux驱动开发学习笔记2《LED驱动开发试验》

目录 一、Linux下LED灯驱动原理 1.地址映射 二、硬件原理图分析 三、实验程序编写 1.LED 灯驱动程序编写 2.编写测试APP 四、运行测试 1.编译驱动程序和测试APP &#xff08;1&#xff09;编译驱动程序 &#xff08;2&#xff09;编译测试APP 2.运行测试 一、Linux下…

jsp高校教师调课管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 高校教师调课管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysq…

9. 双向队列

在队列中&#xff0c;我们仅能删除头部元素或在尾部添加元素。如下图所示&#xff0c;双向队列(double-ended queue)提供了更高的灵活性&#xff0c;允许在头部和尾部执行元素的添加或删除操作。 9.1 双向队列常用操作 双向队列的常用操作如下表所示&#xff0c;具体的方法名称…

Ubuntu 22.04安装mysql-server 8.0.34(使用bundle.tar)

《Ubuntu 20.04 使用mysql-server_8.0.31-1ubuntu20.04_amd64.deb-bundle.tar安装MySQL 8.0.31》是我以前写的博客。 https://downloads.mysql.com/archives/community/是社区版的官网&#xff0c;可以选择版本下载。 sudo wget -c https://downloads.mysql.com/archives/ge…