首页 > 其他分享 >翻车了,被读者找出 BUG

翻车了,被读者找出 BUG

时间:2023-06-12 17:45:07浏览次数:56  
标签:找出 执行 t2 t1 tn 翻车 推送 BUG 事件

大家好呀,我是小楼。

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

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

image

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

image

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

理想状态

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

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

image

对应到代码上是这样:

image

case 1

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

image

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

case 2

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

image

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

image

最后

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

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

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


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

标签:找出,执行,t2,t1,tn,翻车,推送,BUG,事件
From: https://www.cnblogs.com/zhuochongdashi/p/17475691.html

相关文章

  • Bing的bug?
    问题浏览完一个网页,退回到原来的搜索结果里,总是返回顶部解决方案链接具体就是安装新建油猴脚本,内容如下//==UserScript==//@nameFIXfor"BingSearchreturnstothetop"!//@namespacehttp://tampermonkey.net///@version0.12//@description......
  • WRITE-BUG使用指南
    WRITE-BUG是做什么的?WRITE-BUG是北京聚流沙科技有限公司研发的独立开源社区。WRITE-BUG是国内首个面向学生群体的开源社区。奇文共欣赏,疑义相与析。自创建以来,我们旨在为广大学子生创立一个真正自由、开放、免费的学习社区,解决学生的难题,提供给开发者舞台。国内程序er苦付费内容久......
  • 【更新日志 v3.5.1】WRITE-BUG数字空间
    保存草稿功能失效文件贴标签功能失效⚙功能优化圈子排序优化✅v3.4.1        更新日志        2023年4月11日......
  • nginx-clojure debug构建简单说明
    实际上参考了官方的构建参数,提供一个debug模式的文件原始配置configurearguments:--prefix=--sbin-path=nginx--conf-path=conf/nginx.conf--error-log-path=logs/error.log--http-log-path=logs/access.log--pid-path=logs/nginx.pid--lock-path=logs/nginx.......
  • 根据进程找出执行进程的用户
    为了根据进程找出work用户的IP,需要使用以下步骤:执行如下命令列出所有进程以及它们的详细信息:ps-ef在输出结果中,找到工作(work)用户对应的进程,并记录下该进程的PID。执行如下命令查看与该进程相关的网络连接信息:netstat-anp|grep[PID]将[PID]替换为第二步中记......
  • debug.exe的使用
    debug.exe的使用debug.exe是Windows操作系统自带的一个命令行调试工具,用于在DOS环境下进行汇编语言级别的调试操作。它可以让程序员以来自底层的方式逐步执行代码并检查每个寄存器中的值和内存地址。a用法:a用途:输入汇编命令,输完后不输入任何指令,直接回车即可退出编辑......
  • 面试考代码,居然翻车了!
    你好,我是田哥今天早上,一位同学去现场面试,面试官现场写一段代码,请看代码:/***@author公众号:java后端技术全栈*@date2022年11月07日*/publicclassSolution{publicstaticvoidmain(String[]args){intcount=0;for(inti=0;i<10;i++......
  • 算法题:找出阿姆斯壮数
    Armstrong(阿姆斯壮)数是等于其数字的立方数之和的数字, 如153可以满足1*1*1+5*5*5+3*3*3=153,试写出一程序找出所有的三位数Armstrong数。采用穷举法,把数分成三位,遍历从100到999,如果三个数立方数之和等于它自己,则输出。//找出所有三位数的Armstrong数function......
  • awk计算到纳秒级的bug
    在对日志信息进行实时监控分析时,需要对日志中纳秒级的时间进行计算,逻辑比较简单:找出开始时间、结束时间,遇到结束时间后输出时间间隔。日志中的部分数据如下:2016-01-3019:37:301454153850967748663removealivefile2016-01-3019:37:341454153854621122459ro......
  • unsigned_int循环停不下来bug
    目录unsignedint的减法永远不会小于0展开查看:死循环for(unsignedinti=5;i>=0;--i){printf("unsignedint永远不会小于0");}......