翻车了,被读者找出 BUG

这篇具有很好参考价值的文章主要介绍了翻车了,被读者找出 BUG。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

大家好呀,我是小楼。

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

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

翻车了,被读者找出 BUG

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

翻车了,被读者找出 BUG

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

理想状态

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

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

翻车了,被读者找出 BUG

对应到代码上是这样:

翻车了,被读者找出 BUG

case 1

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

翻车了,被读者找出 BUG

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

case 2

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

翻车了,被读者找出 BUG

期望的是 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''

翻车了,被读者找出 BUG

最后

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

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

最后感谢能抽空看到这里,如果你能点赞在看分享,我会更加感激不尽~文章来源地址https://www.toymoban.com/news/detail-480157.html


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

到了这里,关于翻车了,被读者找出 BUG的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用 fastjson 又又又翻车了,莫名其妙多了属性。。

    有一位同事说使用 fastjson 进行 JSON 序列化存储到数据库后,发现 JSON 字符串“莫名其妙地”多了一些属性!帮看了下代码,看到基本类型的布尔类型以 is 开头的属性,再看到 fastjson ,就有点想笑。 定义 MyClass 编写测试代码: 结果: 我们发现多了一个 active 属性,少了一个

    2024年02月16日
    浏览(44)
  • Stable Diffusion WebUI 图生图 DeepBooru反推提示词 结果翻车了

    图生图界面,上传图片,点击“DeepBooru反推提示词”  图形界面没有反应,终端日志 github网络不通导致 手动处理 日志 成功获取 Stable Diffusion WebUI 集成 LoRA模型,给自己做一张壁纸 Ubuntu22.04 rtx2060 6G_hkNaruto的博客-CSDN博客 参考上文,下载模型,添加上LoRA模型参数,名称参考如

    2024年02月16日
    浏览(41)
  • 拒绝翻车!网购手机验机指南!如何防止买到后封机、退货机、翻新机

    网购手机怕翻车,比如说什么后封机、或者说退货机、或者说翻新机呀,如果你特别担心的话,5步,教你怎样买到新机之后自己检验,非常全面 一、检查外包装 当我们收到快递的时候,检查这个手机盒有无拆封,还有就是污渍或者说是划痕的痕迹,如果有的话呢,建议你拒

    2024年02月11日
    浏览(43)
  • Django框架完成读者浏览书籍,图书详情页,借阅管理

    前情回顾: 使用Django框架实现简单的图书借阅系统——完成图书信息管理 向读者展示所有图书数据,本质上和图书管理一样,向数据库查询图书数据,返回给前端,如果是前后端分离项目,可以合成一个API,但是这次项目没有用到前后端,所以要另外提供一个函数,返回给

    2024年02月02日
    浏览(44)
  • 【操作系统-进程】PV操作——读者写者问题

    读者写者问题,其本质就是连续多个同类进程访问同一个临界资源的问题。 第一个进程开始访问临界资源前,需要对资源加上互斥锁,后面的进程再访问时就不用再对资源加互斥锁了,直到最后一个进程访问完后,发现自己是最后一个进程,就解锁互斥锁。这就像一种情况:

    2024年01月16日
    浏览(52)
  • 用信号量机制解决读者-写者问题C语言实现

    文章目录 介绍 一、什么是进程同步,进程互斥 二、读者-写者问题概述 1.概念图 2.实例代码 总结 通过实验模拟读者和写者之间的关系,了解并掌握他们之间的关系及其原理。由此增加对进程同步的问题的了解。具体如下:   1)掌握基本的同步互斥算法,理解读者和写者模型

    2024年02月02日
    浏览(41)
  • 【lesson59】线程池问题解答和读者写者问题

    单例模式是一种 “经典的, 常用的, 常考的” 设计模式. IT行业这么火, 涌入的人很多. 俗话说林子大了啥鸟都有. 大佬和菜鸡们两极分化的越来越严重. 为了让我们这些菜鸡们不太拖大佬的后腿, 于是大佬们 针对一些经典的常见的场景, 给定了一些对应的解决方案 , 这个就是设

    2024年02月21日
    浏览(37)
  • 【答读者问56】backtrader如何输出持仓时候的每日收益率

    有个读者咨询如何在运行策略之后,能够输出来特定的数据到csv文件中,比如持仓期间每个bar的收益率等相关信息? 简单方法 要解决这个问题有很简单的方法,比如初始化的时候创建一个容器(比如列表)用来保存每个bar运行的数据,在next中尝试获取相关的信息,添加到容器

    2024年02月10日
    浏览(79)
  • 近万读者杂志200期精华文章ACCESS\EXCEL数据库

    今天这份数据库的内容是《读者》1-200期精华版,共收录从第一期至第二百期《读者》中的文章9953篇,并且具备24个分类栏目。具体看截图: 详细的分类情况统计:1文苑(1498)、2杂谈随想(574)、3人物(639)、4社会之窗(214)、5在国外(419)、6青年一代(346)、7科海揽胜(99)、8知识窗(6

    2024年02月07日
    浏览(34)
  • linux线程池、基于线程池的单例模式、读者写者问题

    线程池: 一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度。

    2024年02月03日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包