【踩坑日记】SpringBoot集成Kafka,消息没有按照顺序消息问题【已解决】

背景

作为一个合格的码农,当然要学会CV大法了,可是CV也是有风险的,别以为前任写的已经上线那么久了没有问题…
我们需要将埋点信息上报到一个三方平台(S2S)接口,三方平台对时间有要求,同一个用户上报同一个埋点事件的时间只能按照顺序上报,如果后面上报的事件的时间早于之前已经上报的埋点事件时间,那么会被拒绝。

系统:

  • 定时任务系统(负责查询数据、发送kafka消息)
  • Kafka消费系统(负责消费kafka消息,对消息进行业务处理)
    我在查询数据时就已经对时间进行排序了,保证查询出来的列表是根据时间进行排序的,然后进行for循环一条一条的发送kafka消息。然后再kafka消费系统进行消费消息进行上报给平台,通过日志看到有很多报错日志提示:上报事件的时间早于之前上报的事件时间,奇了怪了。我甚至怀疑到kafka消费是不是顺序消费,但是通过分析之后,发现:是发送kafka消息出现了问题…

发送消息 – 错误示例

在这里插入图片描述
要是,不了解springboot集成的kafka 默认的方法 send(String topic, @Nullable V data) 发送消息底层逻辑,他也是和我一样的懵逼的。
这个问题就出现在发送kafka的身上…

发送消息-- 正确示例

在这里插入图片描述

总结:

为什么kafka发送消息无法保证顺序问题?

kafka使用send方法,不调用get()的话,默认是进行异步批量发送消息的(这是kafka高吞吐量的一个手段之一),这样是无法保证你先调用send方法发送的消息先发送的情况,需要进行get方法进行获取到响应(也就是同步的意思),达到发送的消息有序性的效果。当然:同步消耗的性能和时间肯定是没有异步更快的。

为什么kafka消费是可以保证消费消息的有序性?

这是个不准确的问题
因为只有在同一个topic下的同一个partition(分区)下的消息才能保证有序性,原因:每个主题(Topic)可以被分割成多个partition 分区,而消息在发布时会被分区器(Partitioner)根据某个属性key进行路由追加到某个partition分区上。而每个partition分区会保证消息的顺序来进行存储,因此保证了分区内的消息顺序性。
然后kafka消费会根据partition(分区)下存储的消息进行按照顺序从前往后进行消费,消费后进行提交offset(偏移量),用于确认消费到哪条消息。

实现消息的顺序消费办法:

1、在一个topic中,只创建一个partition,这样这个topic下的消息都会按照顺序保存在同一个
partition中,这就保证了消息的顺序消费。
2、发送消息的时候指定partition,如果一个topic下有多个partition分区,我们可以把需要保证顺序
的消息都发送到同一个partition中,也能做到顺序消费,所以上述代码中,我需要对同一个用户的事件进行生成一个key,保证发送到同一个分区上,确保负载均衡和消息的顺序性。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle 数据迁移同步优化(三)

简述 CloudCanal 最近再次对其 Oracle 源端数据同步进行了一系列优化,这些优化基于用户在真实场景中的反馈,具备很强的生产级别参考意义。 本文将简要介绍这些优化项,希望带给读者一些收获。 增量事件 SCN 乱序问题MISSING_SCN 事件干扰新…

clickhouse与oracle传输数据

参考 https://github.com/ClickHouse/clickhouse-jdbc-bridge https://github.com/ClickHouse/clickhouse-jdbc-bridge/blob/master/docker/README.md clickhouse官方提供了一种方式,可以实现clickhouse与oracle之间传输数据,不仅仅是oracle&#xff0…

使用JavaScript及HTML、CSS完成秒表计时器

案例要求 1.界面为一个显示计时面板和三个按钮分别为:开始&#xff0c;暂停&#xff0c;重置 2.点击开始&#xff0c;面板开始计时&#xff0c; 3.点击暂停&#xff0c;面板停止 4.点击重置&#xff0c;计时面板重新为0 案例源码 <!DOCTYPE html> <html lang"…

淘宝(天猫)|京东|1688商品详情数据接口在自有电商平台的应用!

在电商市场的日益成熟下&#xff0c;越来越多的电商参与者上线了自主研发的电商平台。这主要是因为&#xff0c;在电商销售中&#xff0c;品牌在自有电商平台售卖商品的优势颇多&#xff1a; 自有的电商平台能够赋予品牌更大的灵活性和自由度等&#xff0c;品牌商品销售时无需…

Linux驱动开发——(九)platform设备驱动

目录 一、Linux驱动的分离 二、Linux驱动的分层 三、platform平台驱动模型简介 3.1 platform_driver结构体 3.2 device_driver结构体 3.3 platform驱动API函数 四、驱动代码 一、Linux驱动的分离 对于Linux这种庞大而复杂的系统&#xff0c;需要非常注重代码的重用性&a…

IntelliJ IDEA - Lombok supports: OpenJDK javac, ECJ

问题描述 java: You arent using a compiler supported by lombok, so lombok will not work and has been disabled.Your processor is: com.sun.proxy.$Proxy26Lombok supports: OpenJDK javac, ECJ 解决方案 在 IDEA 设置中 File -> Settings 中找到配置如下&#xff1…

从系统到模块,逐步深入PLL设计

锁相环&#xff08;PLL&#xff09;电路广泛存在于各种应用之中&#xff0c;大到手机&#xff0c;服务器&#xff0c;小到智能手表&#xff0c;家用MCU。时钟信号的合成&#xff0c;数据的采样还原都需要PLL电路的深度参与。 何为锁相环&#xff08;PLL&#xff09;&#xff1…

由于找不到xinput1_3.dll,无法继续执行代码的详细修复方法

在日常使用电脑进行工作或娱乐时&#xff1a;系统突然弹出一个错误提示&#xff0c;明确指出“xinput1_3.dll文件丢失”。这个问题可能会导致游戏无法正常运行。为了解决这个问题&#xff0c;我通过查阅资料和实践总结出了以下五种解决方法&#xff0c;希望能对遇到类似问题的朋…

Mysql基础(三)DDL之create table语句

一 create table 创表 说明&#xff1a; create table相关语句从功能上进行讲解补充&#xff1a; 前面已经讲解过相关的约束,已进行相关的铺垫声明&#xff1a; 参考价值较少,了解即可 ① 基本语法 思考&#xff1a; 约束加在哪里? ② 创建新表 强调&#xff1a;使…

任务调度xxljob的使用记录

1.基本使用 a.下载代码&#xff0c;地址&#xff1a;https://gitee.com/xuxueli0323/xxl-job.git b.执行sql&#xff0c;修改配置&#xff0c;启动任务调度中心的代码 启动代码后任务调度中心访问地址&#xff1a;http://localhost:8080/xxl-job-admin&#xff08;自己机器…

岚图汽车与东软睿驰签署战略合作协议

4月26日,东软睿驰与岚图汽车正式签署战略合作协议,双方将结合在各自领域拥有的产业资源、技术研发和资本运作等优势,聚焦智能化产品和应用,建立长期共赢的战略合作伙伴关系,通过不断探索未来新技术、新产业、新业态和新模式,围绕用户需求共同打造极致的智能出行体验。 图为岚图…

Rust Web开发实战:打造高效稳定的服务端应用

Rust Web开发实战&#xff1a;打造高效稳定的服务端应用 本书将带领您从零开始构建Web应用程序&#xff0c;无论是API、微服务还是单体应用&#xff0c;都将一一涵盖。您将学到如何优雅地对外开放API&#xff0c;如何连接数据库以安全存储数据&#xff0c;以及如何对应用程序进…

VPN的基本概念

随着互联网的普及和应用的广泛&#xff0c;网络安全和隐私保护越来越受到人们的关注。在这个信息爆炸的时代&#xff0c;我们的个人信息、数据通信可能会受到各种威胁&#xff0c;如何保护自己的隐私和数据安全成为了一个迫切的问题。而VPN&#xff08;Virtual Private Network…

Quarto Dashboards 教程 3:Dashboard Data Display

「写在前面」 学习一个软件最好的方法就是啃它的官方文档。本着自己学习、分享他人的态度&#xff0c;分享官方文档的中文教程。软件可能随时更新&#xff0c;建议配合官方文档一起阅读。推荐先按顺序阅读往期内容&#xff1a; 1.quarto 教程 1&#xff1a;Hello, Quarto 2.qu…

混合注意力 ACmix | On the Integration of Self-Attention and Convolution

论文名称&#xff1a;《On the Integration of Self-Attention and Convolution》 论文地址&#xff1a;2111.14556 (arxiv.org) 卷积和自注意力是两种强大的表示学习技术&#xff0c;通常被认为是两种截然不同的并列方法。在本文中&#xff0c;我们展示了它们之间存在一种强烈…

history命令显示时间戳、IP地址、用户名

一、前置知识 history命令的功能是显示和管理用户所执行过的所有命令记录。这些记录默认被Linux系统保存。用户可以使用history命令查阅这些记录&#xff0c;也可以对其记录进行修改和删除操作。 history命令的常用参数如下&#xff1a; -a: 保存命令记录-c: 清空命令记录-d:…

JavaScript 如何理解柯里化函数结构及调用

文章目录 柯里化函数是什么逐步理解柯里化函数 柯里化函数是什么 柯里化&#xff08;Currying&#xff09;函数&#xff0c;又称部分求值&#xff0c;是一种函数转换技术。这种技术将一个接受多个参数的函数转换为一系列接受单一参数的函数。具体来说&#xff0c;一个柯里化的…

2024 java使用Graceful Response,告别自己去封装响应,可以接收数据异常,快看我这一篇,足够你用!

参考官网手册地址&#xff1a;快速入门 | Docs 一、导入依赖&#xff08;根据springboot查看对应依赖版本&#xff09; <!-- Graceful --><dependency><groupId>com.feiniaojin</groupId><artifactId>graceful-response</artifactId&g…

微信小程序与web-view网页进行通信的尝试

首先&#xff0c;微信小程序向web-view传递数据一般通过地址栏传参的形式&#xff08;给src赋值或者修改hash&#xff09;&#xff0c;这样一般就已经能够满足实际开发需求了&#xff0c;所以这里主要探讨web-view向微信小程序传参。下面&#xff0c;我们从官方文档入手&#x…

基于51单片机智能窗帘仿真设计( proteus仿真+程序+设计报告+讲解视频)

基于51单片机智能窗帘仿真设计( proteus仿真程序设计报告讲解视频&#xff09; 基于51单片机智能窗帘仿真设计 1. 主要功能&#xff1a;2. 讲解视频&#xff1a;3. 仿真设计4. 程序代码5. 设计报告6. 原理图7. 设计资料内容清单资料下载链接&#xff1a; 仿真图proteus8.9及以上…