Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >翻车了,被读者找出 BUG

翻车了,被读者找出 BUG

原创
作者头像
龟仙老人
发布于 2023-06-12 09:34:48
发布于 2023-06-12 09:34:48
2030
举报
文章被收录于专栏:捉虫大师捉虫大师

大家好呀,我是小楼。

本文是上篇文章《使用增强版 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,这两次记录在一个方法中,伪代码是这样:

代码语言:go
AI代码解释
复制
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 层面去解决这个问题,暂时我还没有想到很好的办法,如果读者朋友们有好的方法,欢迎私信我。

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

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


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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
使用增强版 singleflight 合并事件推送,效果炸裂!
最近在工作中对 Go 的 singleflight 包做了下增强,解决了一个性能问题,这里记录下,希望对你也有所帮助。
龟仙老人
2023/05/19
1K0
使用增强版 singleflight 合并事件推送,效果炸裂!
分布式事务saga开源实现_spring分布式事务解决方案
Saga事务模型又叫做长时间运行的事务(Long-running-transaction), 它是由普林斯顿大学的H.Garcia-Molina等人提出,它描述的是另外一种在没有两阶段提交的的情况下解决分布式系统中复杂的业务事务问题。
全栈程序员站长
2022/11/04
5530
分布式事务saga开源实现_spring分布式事务解决方案
PostgreSQL数据库的SSI实现
👆点击“博文视点Broadview”,获取更多书讯 PostgreSQL数据库默认的隔离级别是 Read Committed,它同时支持Repeatable Read和Serializable。在9.1(不含)之前的版本中,PostgreSQL的Serializable级别等价于Snapshot Isolation,而非真正的Serializable。 Snapshot Isolation主要存在写偏序(Write Skew)问题,这个问题在PostgreSQL 9.1中已通过Serializable S
博文视点Broadview
2023/05/06
1.1K0
PostgreSQL数据库的SSI实现
分布式事物的设计与实践
这就是分布式事物问题,当APP要买东西,这个操作会涉及到多个服务,意味着要操作多个数据库,这样本地事物就无法保证数据的一致性,所以就产生了分布式事物问题.
彼岸舞
2021/04/01
4750
分布式事物的设计与实践
编译原理从入门到放弃
大学课程为什么要开设编译原理呢?这门课程关注的是编译器方面的产生原理和技术问题,似乎和计算机的基础领域不沾边,可是编译原理却一直作为大学本科的必修课程,同时也成为了 研究生入学考试 的必考内容。我觉得有了解的必要性,文章由自己理解汇总,以达到考试及格为目的,若有错误,请留言指正,谢谢~
Lcry
2022/11/29
8740
编译原理从入门到放弃
微服务场景下的数据一致性解决方案 - saga
数据一致性是构建业务系统需要考虑的重要问题 , 以往我们是依靠数据库来保证数据的一致性。但是在微服务架构以及分布式环境下实现数据一致性是一个很有挑战的的问题。ServiceComb作为开源的微服务框架致力解决微服务开发过程中的问题。我们最近发起的ServiceComb-Saga项目来解决分布式环境下的数据最终一致性问题。本文将向大家介绍为什么数据一致性如此重要?Saga又是什么?
句幽
2020/07/21
1.1K0
再有人问你分布式事务,把这篇扔给他
不知道你是否遇到过这样的情况,去小卖铺买东西,付了钱,但是店主因为处理了一些其他事,居然忘记你付了钱,又叫你重新付。又或者在网上购物明明已经扣款,但是却告诉我没有发生交易。这一系列情况都是因为没有事务导致的。这说明了事务在生活中的一些重要性。有了事务,你去小卖铺买东西,那就是一手交钱一手交货。有了事务,你去网上购物,扣款即产生订单交易。
纯洁的微笑
2018/08/16
1.2K0
再有人问你分布式事务,把这篇扔给他
通过编写扫雷游戏提高你的 Bash 技巧
我在编程教学方面不是专家,但当我想更好掌握某一样东西时,会试着找出让自己乐在其中的方法。比方说,当我想在 shell 编程方面更进一步时,我决定用 Bash 编写一个扫雷游戏来加以练习。
用户8670130
2021/09/18
1.2K0
不就是分布式事务,这下彻底清楚了😎
大家好,我是老三,上次发文的时候还是上次发文的时候,这篇文章分享分布式事务,看完要是你们不懂,那一定是不明白。
三分恶
2021/09/26
6740
不就是分布式事务,这下彻底清楚了😎
SQL事务隔离实用指南
您可能已经在数据库的文档中看到了隔离级别,感到有些手足无措。很少有日常使用事务的例子真正提到了隔离。大多数使用数据库的默认隔离级别,并希望获得最好的隔离级别。这是一个需要理解的基本话题,如果你花点时间来研究这个指南,你会对SQL事务隔离有深入的认识。 基本的定义 为了正确地理解SQL隔离级别,我们首先应该考虑事务本身。交易的概念来自合同法:法律交易必须是原子的(要么所有的条款都适用,要么没有),一致的(遵守法律协议),并且是持久的(在承诺之后,各方不能收回他们的承诺)。这些属性是数据库管理系统中流行的“AC
CSDN技术头条
2018/02/08
1.2K0
SQL事务隔离实用指南
了解多线程以及如何进行并发编程?
硬件层面软件层面并发和并行JAVA中的线程线程的基础源码分析线程的启动线程的中断异步并发异步 Future异步Callback异步编排 CompletableFuture小结更多
架构探险之道
2020/07/07
7860
了解多线程以及如何进行并发编程?
数据库技术试题
数据库技术试题 第一部分 选择题 一、单项选择题 在每小题列出的四个选项中只有一个是符合题目要求的,请将其代码填在题后的括号内。错选或未选均无分。 1.关系数据库中的视图属于4个数据抽象级别中的( ) A 外部模型 B 概念模型 C 逻辑模型 D 物理模型 2.在下列关于关系的陈述中,错误的是( ) A 表中任意两行的值不能相同 B 表中任意
用户2188327
2020/07/06
8800
分布式事务之TCC与SAGA
在《关于分布式事务的理解》,介绍了可靠消息队列的实现原理,虽然它也能保证最终的结果是相对可靠的,过程也足够简单(相对于 TCC 来说),但现在你已经知道,可靠消息队列的整个实现过程完全没有任何隔离性可言。虽然在有些业务中,有没有隔离性不是很重要,比如说搜索系统。但在有些业务中,一旦缺乏了隔离性,就会带来许多麻烦。Fenix's Bookstore 在线书店的场景事例中,如果缺乏了隔离性,就会带来一个显而易见的问题:超售。
燃192
2023/04/10
7430
分布式事务之TCC与SAGA
微服务:事务管理
几乎所有的信息管理系统都会涉及到事务,事务的目的是为了保证数据的一致性,这里说的一致性是数据库状态的一致性。
oec2003
2022/12/01
4110
微服务:事务管理
分布式事务有哪些解决方案?
数据库事务的特性包括原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durabilily),简称 ACID。
JAVA日知录
2020/04/21
1.4K0
分布式事务有哪些解决方案?
分布式理论与分布式事务
CAP理论又称为布鲁尔定理, 它指出对于一个分布式计算系统来说,不可能同时满足以下三点:
leobhao
2022/06/28
5700
分布式理论与分布式事务
Async Commit 原理介绍
TiDB 提供了原生的分布式事务支持,实现低延迟的分布式事务是持续的优化方向。TiDB 5.0 引入的 Async Commit 特性大大改善了事务提交的延迟,这一特性主要由本文作者陈奕霖(sticnarf),以及赵磊(youjiali1995),Nick Cameron(nrc) 和周振靖(MyonKeminta)实现。
PingCAP
2021/04/30
8320
Async Commit 原理介绍
面试官:来说一下,你们是怎么解决分布式场景下的事务问题?
刚性事务:顾名思义,非常的“刚”,属于硬刚的那种。这个分布式事务要么全成功,要么全回滚,别跟我提什么中间状态,我的人生中不允许出现模棱两可。其中包括:XA、2PC、3PC
爪哇缪斯
2023/05/10
3260
面试官:来说一下,你们是怎么解决分布式场景下的事务问题?
并发编程中的volatile-和锁实现共享变量的同步操作
作者:莫那·鲁道 原文:http://thinkinjava.cn/2018/06/Java-%E5%A6%82%E4%BD%95%E4%B8%8D%E4%BD%BF%E7%94%A8-volatile-%E5%92%8C%E9%94%81%E5%AE%9E%E7%8E%B0%E5%85%B1%E4%BA%AB%E5%8F%98%E9%87%8F%E7%9A%84%E5%90%8C%E6%AD%A5%E6%93%8D%E4%BD%9C/
用户5224393
2019/08/13
6440
并发编程中的volatile-和锁实现共享变量的同步操作
分享10个高级sql写法
本文主要介绍博主在以往开发过程中,对于不同业务所对应的 sql 写法进行归纳总结而来。进而分享给大家。
wayn
2023/03/13
1.3K0
分享10个高级sql写法
相关推荐
使用增强版 singleflight 合并事件推送,效果炸裂!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档