kafka消息发送几种方式

同步发送 or 异步发送

       消息发送根据是否需要处理发送的结果分为同步发送、异步发送。

同步发送:等待发送结果返回,这种方式是可靠的,因为异常能及时处理,但同步发送需要阻塞等待一条消息发送完才处理下一条,吞吐量差。


异步发送:发送是异步的,不关心发送的结果,吞吐量最高,但可能存在发送失败的情况。

    本质上kafka 客户端提供的发送接口都是异步的,因为发送接口返回的是一个Future对象。对于同步发送通过future.get获取发送结果。异步发送则忽略send 返回值。

ListenableFuture<SendResult> future = kafkaTemplate.send(topic, content);try {SendResult sendResult = future.get();} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}

发送完成回调

有没有办法既要异步发送还要能处理发送失败的场景,这就是第三种,发送完成时,执行相应的回调方法。这是折中方案,兼顾效率且保证发送失败能被监控到。

producer.send(record, new Callback() {
@Override
public void onCompletion(RecordMetadata recordMetadata, Exception e) {if(e != null){System.out.println("send error ");
}else {System.out.println("send result  topic ="+recordMetadata.topic() + " partition=" + recordMetadata.partition() + "  offset=" + recordMetadata.offset() );
}}
});

发送异常

       有些发送异常可以通过重试几次后解决,比如网络异常,对于有些异常比如消息太大超出kafka配置的最大消息字节数,这类异常重试也会失败,所以这类异常KafkaProducer 不会进行任何重试。对于可重试异常可以配置重试次数

spring.kafka.producer.retries=10

SpringBoot 集成简单介绍

     参考上篇文章SpringBoot 集成配置(pom依赖、application配置),简单讲解SpringBoot 几个重要自动装配类。

KafkaAutoConfiguration

KafkaAutoConfiguration给我们自动配置了几个类

KafkaTemplate:可以通过KafkaTemplate进行发送消息,本质上内部还是使用的KafkaProducer发送消息的。

ProducerFactory:KafkaProducer工厂,通过createProducer()方法可以获取(KafkaProducer) 进行发送消息,避免直接new KafkaProducer

使用方式也很简单,由于直接KafkaAutoConfiguration已经定义了相关Bean, 使用时注入Bean即可

图片

@Autowired
private KafkaTemplate kafkaTemplate;@Autowired
private ProducerFactory producerFactory;

具体代码

同步发送、异步发送的方式直接使用 kafkaTemplate即可完成,同步发送结果处理:这里简单的打印出消息的topic partition offset 等信息如下图

ListenableFuture<SendResult> future = kafkaTemplate.send(topic, content);
SendResult sendResult = future.get();
RecordMetadata recordMetadata = sendResult.getRecordMetadata();
System.out.println("send result  topic ="+recordMetadata.topic() + " partition=" + recordMetadata.partition() + "  offset=" + recordMetadata.offset() );
 

                                   

图片

发送回调kafkaTemplate没有对应api , 需要通过Producer发送,我们通过producerFactory获取。

ProducerRecord record = new ProducerRecord(topic,content);Producer producer = producerFactory.createProducer();producer.send(record, new Callback() {@Overridepublic void onCompletion(RecordMetadata recordMetadata, Exception e) {if(e != null){System.out.println("send error ");}else {System.out.println("send result  topic ="+recordMetadata.topic() + " partition=" + recordMetadata.partition() + "  offset=" + recordMetadata.offset() );}}});

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

计算机网络基础 - 应用层(3)

计算机网络基础 应用层P2P 应用P2P 体系结构的扩展性BitTorrent 协议torrenl 洪流BitTorrent 运行的过程 P2P文件共享应用非结构化 P2PDHT 结构化 P2P&#xff08;了解&#xff09; 视频流和内容分发网视频流化服务HTTP 流和 DASH内容分发网 CDN面临挑战CDN 概述CDN 操作过程集…

nonlocal本质讲解(前篇)——从滤波到Nonlocal均值滤波

线性滤波 → \rightarrow →高斯滤波 → \rightarrow →高斯滤波 → \rightarrow →双边滤波 → \rightarrow →Nonlocal均值滤波 平均 高斯 双边 Nonlocal 目录 线性滤波高斯滤波双边滤波Nonlocal均值滤波 滤波最初是频域的概念&#xff0c;由于频域乘积对应空域卷积&am…

Maven和Springboot初识

&#xff08;一&#xff09;Maven Maven是一个项目管理工具&#xff0c;通过一小段描述信息来管理项目的构建&#xff0c;报告和文档的项目管理工具 &#xff08;可以通过pom.xml文件的配置来获取jar包&#xff0c;而不用手动添加&#xff09; Maven可以提高我们的开发效率减少…

深度学习自编码器 - 使用自编码器学习流形篇

序言 在数据科学的浩瀚宇宙中&#xff0c;深度学习如同一颗璀璨的星辰&#xff0c;引领着我们对复杂数据内在规律的探索。其中&#xff0c;自编码器作为深度学习家族中的一位独特成员&#xff0c;以其非凡的能力——通过无监督学习捕捉数据的有效表示&#xff0c;而备受瞩目。…

从数据仓库到数据飞轮:数据技术演进的探索与思考

引言 在当今的数字化浪潮中&#xff0c;数据被视为一种极具价值的资源&#xff0c;类似于传统工业时代的石油&#xff0c;它为企业挖掘出深邃的洞察力&#xff0c;并成为决策过程中不可或缺的基石。随着技术的不断演进&#xff0c;数据管理的策略与架构也经历了显著的变革&…

Linux C高级 day1

1、 2、ubuntu中桥网络桥接模式配置流程&#xff1a; 首相需保证虚拟机提供了《桥接模式》 从菜单栏打开“虚拟机”选项卡下的“设置” &#xff0c;如图设置虚拟机网络连接模式 此处无需勾选“复制物理网络连接状态” 而后 从菜单栏选择“编辑”下的“虚拟网络编辑器” &a…

leetcode75-9 压缩字符串 双指针原地算

题目太复杂了 没做出来 计算过程大概是双指针处理数组&#xff0c; 其中两个知识点一个是length 字符数组直接加 不用加括号 还有就是数字转字符需要转换 数字转换成字符 不能直接转换&#xff01; 需借助数字转字符串&#xff0c; 首先将数字转为字符串&#xff0c;…

徒增成本,还是有备无患?说说4G模组SIM双卡切换

初学开发的小伙伴提出疑问&#xff1a; 手机双卡可以理解&#xff0c;人情世故各种缘由…… 物联网设备有必要双卡吗&#xff0c;会不会太浪费&#xff1f; 实际应用中&#xff0c;双卡可不是徒增成本的摆设&#xff0c;而是有备无患的必需。 在使用4G模组双卡功能的场景下&a…

掌握MySQL性能监控 · performance_schema 使用快速入门

performance_schema 使用快速入门 在数据库性能调优的过程中&#xff0c;performance_schema 是一个非常有用的工具&#xff0c;它可以帮助我们深入分析 MySQL 内部的性能表现。通过合理使用 performance_schema&#xff0c;我们可以发现数据库中的性能瓶颈并做出优化。本文将…

STM32快速复习(十二)FLASH闪存的读写

文章目录 一、FLASH是什么&#xff1f;FLASH的结构&#xff1f;二、使用步骤1.标准库函数2.示例函数 总结 一、FLASH是什么&#xff1f;FLASH的结构&#xff1f; 1、FLASH简介 &#xff08;1&#xff09;STM32F1系列的FLASH包含程序存储器、系统存储器和选项字节三个部分&…

XML映射器-动态sql

01-动态sql 1.实现动态条件SQL 第一种方法在sql语句中加入where 11其他条件都加and就行,这样就可以根据if条件来判断要传递的参数可以有几个 第二种方法用where标签给if语句包起来 where标签的作用如下图 第三种方法用trim标签解释如下图 用choose也可以实现条件查询如下图,…

pycharm连接远程linux服务器上的docker进行深度学习训练

实习过程中由于GPU都在服务器上&#xff0c;编辑代码很麻烦。并且服务器上配置了docker的环境&#xff0c;所以用pycharm连接远程服务器的docker进行深度学习&#xff0c;这样在本地调用远程服务器的GPU和环境&#xff0c;更方便一点&#xff0c;将这个过程记录下来&#xff0c…

高效开发,从暗藏玄机的文件系统开始—合宙Air201资产定位模组LuatOS

超低功耗、精准定位、快速量产——迷你小巧的合宙Air201&#xff0c;正给越来越多的行业客户带来高效开发体验。 4G-Cat.1模组的文件系统关乎数据传输速度、存储效率&#xff0c;以及数据安全性等等诸多因素&#xff0c;在应用开发中极为重要。 本期&#xff0c;我们来学习合…

QT 带箭头的控件QPolygon

由于对当前项目需要绘制一个箭头控件&#xff0c;所以使用了QPainter和QPolygon来进行绘制&#xff0c;原理就是计算填充&#xff0c;下面贴出代码和效果图 这里简单介绍下QPolygon QPolygon是继承自 QVector<QPoint>那么可以很简单的理解为&#xff0c;他就是一个点的…

比特币10年价格数据(2014-2024)分析(进阶2_时间序列分析)

数据入口&#xff1a;【每周挑战】比特币10年价格数据可视化和量化分析 - Heywhale.com 本数据集包含 2014 - 2024 的比特币美元价格数据&#xff0c;具体包含比特币每日的开盘价、最高价、最低价、收盘价以及成交量等关键信息。数据说明如下&#xff1a; 字段说明Date日期&a…

MES管理系统在智能制造中的重要应用

在智能制造的浪潮席卷之下&#xff0c;MES管理系统犹如一位精通生产艺术的智者&#xff0c;以其独到的洞察力和卓越的能力&#xff0c;引领着制造业向更加智能化、高效化的未来迈进。它不仅仅是一个数据汇聚的容器&#xff0c;更是信息处理的引擎、决策制定的伙伴&#xff0c;以…

游戏开发引擎__游戏场景(灯光,摄像机)

1.灯光 重要参数介绍 类型: 控制灯光的类型&#xff0c;有“定向”“点”“区域”和“聚光”4种模式。颜色: 控制灯光的颜色。模式: 控制灯光的光照模式&#xff0c;有“实时”“混合”和“烘焙”3种模式。强度: 控制灯光的明亮程度。间接乘数: 改变间接光的强度。阴影类型: …

亚信电子于IAS 2024展出最新IO-Link主站设备软件协议栈解决方案

亚信电子即将于IAS 2024展示最新的亚信IO-Link主站/设备软件协议栈、集成亚信IO-Link主站软件协议栈的AX58400 EtherCAT转IO-Link网关&#xff0c;以及AXM57104A TSN PCIe千兆以太网卡解决方案。 [台湾新竹讯, 2024年9月18日] 亚信电子&#xff08;ASIX Electronics Corporat…

Golang | Leetcode Golang题解之第415题字符串相加

题目&#xff1a; 题解&#xff1a; func addStrings(num1 string, num2 string) string {add : 0ans : ""for i, j : len(num1) - 1, len(num2) - 1; i > 0 || j > 0 || add ! 0; i, j i - 1, j - 1 {var x, y intif i > 0 {x int(num1[i] - 0)}if j &g…

二叉树的层序遍历(含十道leetcode相关题目)

文章目录 二叉树层序遍历模板102. 二叉树的层序遍历 二叉树层序遍历模板 我们之前讲过了关于二叉树的深度优先遍历的文章&#xff1a;前中后序遍历的递归法和迭代法。 接下来我们再来介绍二叉树的另一种遍历方式&#xff1a;层序遍历。 层序遍历一个二叉树。就是从左到右一层…