翻车了,被读者找出 BUG

news2024/11/25 23:38:49

大家好呀,我是小楼。

本文是上篇文章《使用增强版 singleflight 合并事件推送,效果炸裂!》的续集,没看过前文必须要先看完才能看本文,实在不想看,拉到文章末尾,给我点个赞再退出吧~Doge

上篇文章发出后,有一位读者朋友给我发私信,写了一大段话:

一开始,没太看懂,于是就细问了一下

在看了解释之后,感觉好像有点懂了,再三思考后,确认了,这里面有 BUG。

理想状态

为了描述简单,这里我用字母本身表示事件发生,如 A,用字母加一撇表示事件开始执行,如 A',用字母加两撇表示事件执行结束后的状态,如 D''

如下表示我们之前思考的理想状态:A 事件到来便执行,在执行结束前又先后来了 B、C、D 三个事件,先 Hold 住,待 A 执行完成后,B、C、D 同时进入 sigleflight group 中抢执行,最终结果是 D’',感觉非常完美。

对应到代码上是这样:

case 1

但这位读者提出了一个疑问,如果在 B、C、D 执行的时候又来一个 E 事件,那这个 E 事件将会重走 A 事件的路,如果这个 E 事件执行的比较快,先于 B、C、D 事件完成,那不就有问题了?

E 事件最后到,我们期望的结果应该是 E’‘,但按这个推理,最终结果是 D’',显然不符合预期。

case 2

同理,如果在 E 事件执行期间累积了 F、G 事件,且 F、G 也比较争气,在 B、C、D 完成之前完成了:

期望的是 G’‘,但最终结果是 D’'。

线上有问题吗?

这两个场景确实很难测试到,如果不幸遇到,还是有风险的。我们复盘了自己的系统,发现我们的系统是可以解这个问题的。

我们的系统会针对推送下去不一致的数据会定期补偿,具体怎么做的呢?

在推送之前,针对同一种推送,也就是相同的 key 生成(存在则更新)同一条记录,该记录包含两个时间 t1、t2,推送的开始时间 tn(精确到纳秒)记录到 t1,推送完成后将 tn 记录到 t2,这两次记录在一个方法中,伪代码是这样:

tn := time.Now().UnixNano()
markT1(key, tn)
push(key)
markT2(key, tn)

如果 t1 = t2 则说明推送没有问题,如果 t1 != t2 则说明这条推送需要补偿,每 10s 扫描一次需要补偿的事件进行重新下发推送

我们以 case 1 为例,按照时间顺序

  • A 执行完成时,t1= ta,t2 = ta
  • D 开始执行,t1 = td
  • E 开始执行,t1 = te,E 执行结束 t2 = te
  • D 执行结束,t1 = te,t2 = td
  • 10s 后发现 t1 != t2,于是触发重新下发逻辑,重新推送最新数据为 E’’

最后

还好我们线上系统有一层保护机制,否则可能要出事。如果在 singleflight 层面去解决这个问题,暂时我还没有想到很好的办法,如果读者朋友们有好的方法,欢迎私信我。

不得不说读者朋友们当中还是有不少读了我的文章,而且认真思考了的,在此表示感谢,也欢迎大家指出文章中的错误。

最后感谢能抽空看到这里,如果你能点赞在看分享,我会更加感激不尽~


  • 搜索关注微信公众号"捉虫大师",后端技术分享,架构设计、性能优化、源码阅读、问题排查、踩坑实践

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

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

相关文章

如何进行App性能测试?SoloPi是最佳选择!

目录 引言 SoloPi简介 SoloPi特点 SoloPi的主要功能 下载SoloPi 安装SoloPi 使用SoloPi进行性能测试 性能数据查看与记录 环境加压 响应耗时计算工具 注意事项 Solopi提供的各项性能指标介绍 引言 大家好!我是凡哥。 今天我想跟你们分享一下如何进行A…

Python的接口自动化-读写excel文件

目录 引言 一、xlrd、xlwt以及xlutils安装 二、xlrd操作excel文件的数据读取 三、xlwt向excel文件写入数据 四、xlutils操作excel文件 五、封装操作excel读和写的类 引言 使用python进行接口测试时常常需要接口用例测试数据、断言接口功能、验证接口响应状态等&#xff0…

Mysql升级8.0后日期类型兼容性问题

背景 最近对原有项目数据库进行升级,从MySQL 5.7 升级到8.0,因此项目种的驱动程序也要做相应升级。 问题 一、 升级后报:java.time.LocalDateTime cannot be cast to java.util.Date 该问题是因为代码中使用Map类型获取查询返回值&#xf…

lightdb检测不兼容工具CheckUnsupportOracle使用说明

oracle有很多特性在lightdb无法使用,使用该工具可以即时扫描某个在线数据库或本地文件夹中有哪些不兼容特性,-a -x对oracle不兼容特性有所区别,扫描范围可参考后续表格。 0、使用限制 默认扫描存储过程,函数及包默认仅支持oracl…

19JS10——预解析

文章目录 一、预解析二、变量预解析和函数预解析三、预解析案例1、案例1:结果是几?2、案例2:结果是几?3、案例3:结果是几?4、案例4:结果是几? 目标: 1、预解析 2、变量预…

电脑连上wifi但显示无网解决方案分享,轻松搞定电脑上网问题

有的时候我们会遇到这样的问题:电脑明明连接了网络但仍不能上网,并且出现错误提示“WiFi已连接但没有互联网”。遇到这种情况,我们可以先使用另一台设备访问网络,看看你能否正常上网。如果也不能上网,可以尝试重新启动…

七牛云存储开启referer防盗链后,微信小程序访问提示403

点击七牛云存储存储桶绑定的加速域名 配置站点域名和微信小程序域名 是否允许空Referer一定要打开,否则小程序上的视频或图片访问时将提示403

# 如何在Git上更改本地分支名称和远程分支名称

有时候我们需要修改git分支名称,例如不合理的分支名称。本篇文章分享了如何轻松地修改Git本地分支名称和修改远程分支名称。 在Git中,通常使用分支来使开发与您的主要工作流程分开。在软件工程团队中,通常要实施特定的工作流程。例如&#x…

[C语言实现]数据结构之《关于我转生成队列这档事》

🥰作者: FlashRider 🌏专栏: 数据结构 🍖知识概要:详解队列的概念、顺序队列和链式队列的优点和缺点,以及代码实现。 目录 什么是队列? 选择什么结构来实现队列? 链式队列的实现 队列的结构…

在UE中使用Stencil功能

Stencil是指利用深度buffer的后8位数据进行bit mask信息的绘制,从而制作类似角色mask遮罩等效果,下面就在UE中进行制作。 1.首先在Project Settings项目设置中开启stencil,搜索stencil关键字在Custom Depth Stencil Pass选项中设置为Enabled…

PNAS:勘探地球物理学论文

阅读 《Sensing prior constraints in deep neural networks for solving exploration geophysical problems dendrimers》 题目译为《深度神经网络中用于解决勘探地球物理问题的感知先验约束》 研究意义 该研究提出三种可能的策略,以有效地讲地质和/或地球物理约…

面试官再问分布式事务,三天吃透这份至尊级学习笔记怼他

分布式事务就是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。简单的说,就是一次大的操作由不同的小操作组成,这些小的操作分布在不同的服务器上,且属于不同的应用,分布式…

ABAP 新语法--Open SQL(草稿)

1. 常量 1.1 常量赋值 常量字段可以用来为内表中的部分字段赋初始值,字段类型和长度依据输入常量的值决定 SELECTmara~matnr, " 物料号mara~matkl, " 物料组mara~mtart, " 物料类型 AS lkenz, " 删除标识,常量空字符串123 AS fla…

QCon高分演讲:火山引擎容器技术在边缘计算场景下的应用实践与探索

近日,火山引擎边缘云原生团队的同学在QCon全球软件开发大会上分享了火山引擎容器技术在边缘计算场景下的应用实践与探索,并在一众AIGC、LLM等当下热门议题中脱颖而出,入选观众满意度投票中“叫好又叫座议题Top5”。 以下是演讲全文&#xff1…

论文阅读 Interpretable Unified Language Checking

本文提出了一种新的方法来解决多种自然语言处理任务中的问题,包括公平性检查、事实检查、虚假新闻检测和对抗攻击检测等。该方法基于大型语言模型和少量人类标注的提示信息,通过在模型中引入相应的提示,来提高模型的性能和可解释性。该论文的…

数据库索引及优化

索引 1.索引简介 1.1 概念 MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。索引的本质:索引是数据结构。 注:在数据之外,数据库系统还维护着满足特定查找算法的数据结构&…

第二章---感知机

🌞欢迎来到深度学习的世界 🌈博客主页:卿云阁 💌欢迎关注🎉点赞👍收藏⭐️留言📝 🌟本文由卿云阁原创! 🙏作者水平很有限,如果发现错误&#xff…

centos各个版本jenkins部署

目录 官网安装方法 安装java,**注意java版本,新版本jenkins只支持jdk11及以上 安装jenkins Jenkins启动失败的七个问题 jenkins 部署脚本 Nginx转发jenkins服务 官网安装方法 Redhat Jenkins Packages (jenkins-ci.org)https://mirrors.jenkins-c…

微信朋友圈怎么定时发送?微信朋友圈定时发送有什么优势?

刷朋友圈已经成为大部分人日常中不可缺少的一件事,同时也是企业用来触达客户的重要渠道。下面一起来了解一下微信朋友圈定时发送的优势有哪些,还有怎么定时发朋友圈吧。 定时发朋友圈的优势有哪些? 1、让企业能够更好地管理自己的宣传信息 …

HttpRunner 接口自动化测试框架实战,打造高效测试流程

简介 2018年python开发者大会上,了解到HttpRuuner开源自动化测试框架,采用YAML/JSON格式管理用例,能录制和转换生成用例功能,充分做到用例与测试代码分离,相比excel维护测试场景数据更加简洁。在此,利用业…