纠正一个错误,分布式系统关注点第17篇


这里是Z哥的个人公众号

每周五早8点 按时送达

当然了,也会时不时加个餐~

我的第「78」篇原创敬上



今天来加个餐,紧急纠正一个错误。先和大家说一声抱歉:D


昨晚睡觉前,惯例打开「订阅号助手」回复一些留言。有一位小伙伴提了一个问题,问题来源于《分布式系统关注点》专题的第17篇《先写DB还是「缓存」?》中。


下面就是提出问题的这位小伙伴,@L。这次非常感谢他。


640?wx_fmt=png


文章的原文是这样的:


-------------原文开始-------------


先DB再缓存


数据库操作成功,缓存操作的失败的情况该怎么解?(主要在用到redis,memcached这种进程外缓存的时候,由于网络因素,失败的可能性大增


办法也是有的,在操作数据库的时候带一个事务,如果缓存操作失败则事务回滚。大致的代码意思如下:


begin trans	var isDbSuccess = write db;	if(isDbSuccess){	var isCacheSuccess = write cache;	if(isCacheSuccess){	return success;	}	else{	rollback db;	return fail;	}	}	else{	return fail;	}	catch(Exception ex){	rollback db;	}	
end trans

如此一来就万无一失了吗?并不是。除了由于事务的引入,增加了数据库的压力之外,在极端场景下可能会出现rollback db失败的情况。是不是很头疼?


解决这个问题的方式就是write cache的时候做delete操作,而不是set操作。如此一来,用多一次cache miss的代价来换rollback db失败的问题。


640?wx_fmt=png

就像图上所示,哪怕rollback失败了,通过一次cache miss重新从db中载入旧值。


-------------原文结束-------------


如果没看出来问题或者已经遗忘的小伙伴可以去原文地址看下:分布式系统关注点——先写DB还是「缓存」?



也不知道当时咋了,脑子昏了。其实这里的「rollback db失败」表述应该换成「commit db失败」


而且顺带图也画错了……


正确逻辑图应该是这样。


640?wx_fmt=png


虽然数据库操作有XA规范的保证,但是由于需要进行二次确认,而确认又需要经过网络,所以在网络不稳定的情况下,的确会出现commit失败的情况。


这个时候delete的好处就出来了。


假如真的commit失败了,最多就是从db里再捞一份旧数据出来。


如果使用set的话,缓存中就会存在脏数据了,必须得再多做一次set,将旧数据set回去。并且,这个操作还有可能出现失败。



好了,这次要说的就那么多,周五早上8点再见吧:D




推荐阅读:

  • 分布式系统关注点——360°的全方位监控

  • 8个月打磨,一份送给程序员的「分布式系统」合集



原创不易,如果你觉得这篇文章还不错,就「在看」或者「分享」一下吧。鼓励我的创作 :)


如果有希望我写一下什么主题的话,欢迎在后台给我留言哦~


640?wx_fmt=jpeg

如果你有关于软件架构、分布式系统、产品、运营的困惑

可以试试点击「阅读原文

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

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

相关文章

【NOI2016】国王饮水记【贪心】【斜率优化】【决策单调性】

传送门 首先比h1h_1h1​小的肯定没用&#xff0c;直接无视 然后考虑合并的顺序 ①在无限制的情况下&#xff0c;合并多个不如一个一个合并 a<b<ca<b<ca<b<c时&#xff0c;ab2c2>abc3{{ab \over 2}c\over 2}>{{abc}\over 3}22ab​c​>3abc​ ②先…

CF946D Timetable 背包dp + 思维转换

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; n,m,k≤500n,m,k\le500n,m,k≤500 思路&#xff1a; 将其转换成背包的模型&#xff0c;就可以想出来一个很明显的dpdpdp状态&#xff1a;f[i][j]f[i][j]f[i][j]表示前iii行花费了jjj的最小代价&#xff0c;…

.NET开发框架(三)-高可用服务器端设计

我们对框架功能作了简述&#xff0c;演示视频请点击 这里查看 &#xff0c;本章节&#xff0c;我们专门讲解一下&#xff0c;如何在Window服务器下&#xff0c;设计高可用的框架。我们的框架设计采用的是Window版本的服务端设计&#xff1a;整体框架图如下&#xff0c;为什么我…

P1537 弹珠 背包可行性dp

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 疯狂水文章。 这个很明显是个背包&#xff0c;我们开一个布尔数组&#xff0c;之后枚举每组的个数&#xff0c;让后枚举1−61-61−6&#xff0c;再枚举容量kkk&#xff0c;注意顺序不能错了…

.NET Core 3.0中的WinForms创建集中式拉取请求中心

Windows 窗体&#xff08;或简称 WinForms&#xff09;&#xff0c;多年来被用于开发具有丰富和交互式界面的基于 Windows 的强大应用程序。各类企业对这些桌面应用程序的投入量非常巨大&#xff0c;每月有大约 240 万开发人员使用 Visual Studio 创建桌面式应用。利用和扩展现…

CF296B dp\容斥

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; n≤1e5n\le1e5n≤1e5 思路&#xff1a; 求方案数基本就是考虑dpdpdp了&#xff0c;看到nnn这么大可以考虑一下分情况讨论的dpdpdp状态。 设f[i][j]f[i][j]f[i][j]表示到了第iii个&#xff0c;状态为jjj的方…

asp.net core 自定义异常处理中间件

Intro在 asp.net core 中全局异常处理&#xff0c;有时候可能不能满足我们的需要&#xff0c;可能就需要自己自定义一个中间件处理了&#xff0c;最近遇到一个问题&#xff0c;有一些异常&#xff0c;不希望记录错误日志&#xff0c;目前主要是用户请求取消导致的 TaskCanceled…

CF786B Legacy 线段树优化建图

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 实现如下连边后跑最短路。 思路&#xff1a; 优化建图板子题&#xff0c;优化思路就是将区间分割成若干个线段树上的线段&#xff0c;与线段树分治有点类似&#xff0c;由于有点向区间也有区间向点的边&a…

【ZJOI2015】幻想乡 Wi-Fi 搭建计划【几何】【贪心】【dp】

传送门 题意&#xff1a;一个x∈(−∞,∞),y∈[0,R]x\in(-\infin,\infin),y\in[0,R]x∈(−∞,∞),y∈[0,R]的矩形中有nnn个点&#xff0c;矩形外有mmm个半径均为RRR的圆&#xff0c;有独立的代价cic_ici​。求覆盖最多的点所需的最小代价。 n,m≤100n,m\leq100n,m≤100 显然先…

.NET架构开发应知应会

.NET程序是基于.NET framework、.NET Core、Mono、UWP【.NET实现】开发和运行的 &#xff0c;定义以上【.NET实现】的标准规范称为.NET StandardL1&#xff1a;.NET Standard.NET标准是一组API集合&#xff0c;由上层三种【.NET实现】的Basic Class Library实现&#xff0c;更正…

几个冷门字符串算法的学习笔记(最小表示法,exKMP,Lyndon Word)

所有下标均从1开始 最小表示法 给定一个串&#xff0c;求字典序最小的循环同构。 我们把串复制一遍接在后面&#xff0c;然后求出[1,N][1,N][1,N]开始的长为NNN的子串中最小的 先设i1,j2i1,j2i1,j2 然后暴力找出iii和jjj往后匹配的第一个不同的位置&#xff0c;记为ikikik…

.NET Core IdentityServer4实战 第Ⅴ章-单点登录

OiDc可以说是OAuth的改造版&#xff0c;在最初的OAuth中&#xff0c;我们需要先请求一下认证服务器获取下Access_token&#xff0c;然后根据Access_token去Get资源服务器, 况且OAuth1 和 2 完全不兼容&#xff0c;易用性差&#xff0c;而OIDC可以在登陆的时候就把信息返回给你&…

【CF594E】Cutting the Line 【贪心】【Lyndon Word】【扩展kmp】

传送门 题意&#xff1a;给一个字符串SSS和正整数kkk&#xff0c;将SSS分成最多kkk段&#xff0c;每段不变或翻转&#xff0c;使得最后的字典序最小。 ∣S∣≤5106|S|\leq5\times10^6∣S∣≤5106 发现不翻转可以看成拆成若干单字符分别翻转&#xff0c;所以先分析一下必须翻转…

一份好的工作总结才能帮你升职加薪

这里是Z哥的个人公众号每周五早8点 按时送达当然了&#xff0c;也会时不时加个餐&#xff5e;我的第「79」篇原创敬上最近有点忙&#xff0c;搬出之前攒的一篇文章来应急一下。一篇能助你挣更多钱的文章。好了&#xff0c;下面开始。我的读者们大部分是互联网行业的&#xff0c…

腾讯开源软件镜像站上线

腾讯开源软件镜像站(Tencent Open Source Mirror Site)已于近日上线&#xff0c;其官方名称为「腾讯云软件源」&#xff0c;由腾讯云提供支持。官方表示搭建此开源镜像站的目的在于宣传自由软件的价值&#xff0c;提高自由软件社区文化氛围&#xff0c;推广自由软件在国内的应用…

ASP.NET Core on K8S学习初探(2)

“ [LOG] ASP.NET Core on K8S Starting...”在上一篇《单节点环境搭建》中&#xff0c;通过Docker for Windows在Windows开发机中搭建了一个单节点的K8S环境&#xff0c;接下来就是动人心弦的部署ASP.NET Core API到K8S了。但是&#xff0c;在部署之前&#xff0c;我还是把基本…

Educational Codeforces Round 96 E. String Reversa 线段树模拟序列交换

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 与上一篇题解大同小异&#xff0c;无非就是不需要枚举排列了。 // Problem: E. String Reversal // Contest: Codeforces - Educational Codeforces Round 96 (Rated for Div. 2) // URL:…

ASP.NET Core on K8S学习初探(1)

“ [LOG] ASP.NET Core on K8S Starting...”01—写在之前当近期的一个App上线后&#xff0c;发现目前的docker实例&#xff08;应用服务BFF中台服务工具服务&#xff09;已经越来越多了&#xff0c;而我司目前没有专业的运维人员&#xff0c;发现运维的成本逐渐开始上来&#…

.NET Core IdentityServer4实战 第Ⅳ章-集成密码登陆模式

回顾下ClientCredentials模式&#xff0c;在ReSourceApi中定义了我们公开服务&#xff0c;第三方网站想要去访问ReSourceApi则需要在身份验证服务中获取toekn&#xff0c;根据token的内容&#xff0c;硬编码去访问公开服务&#xff08;ResApi&#xff09;,这个还是非常简单的&a…

Codeforces Round #656 (Div. 3) F. Removing Leaves 贪心 + 模拟

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 首先有一个贪心策略就是每次都找一个叶子节点最多的点&#xff0c;让后删掉他的kkk个叶子节点&#xff0c;现在我们就来考虑如何模拟这个过程。 我们整一个vector<set<int>>ve…