范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

如何保证缓存与数据库双写时的数据一致性?第2部分

  这是该系列的最后一篇文章。上一篇我们介绍了为什么需要缓存,也介绍了 Read Aside的 流程和潜在的问题,当然也解释了如何提高 Read Aside 的一致性。尽管如此, Read Aside 还不足以满足高一致性要求。
  Read Aside 会导致问题的原因之一是因为所有用户都可以访问缓存和数据库。当用户同时操作数据时,由于操作顺序的各种组合而导致不一致。
  那么我们就可以通过限制操作数据的行为来有效避免不一致,这就是后面几个方法的核心概念。 通读
  读取路径 从缓存中读取数据 如果缓存数据不存在 通过缓存 从数据库读取 缓存返回给应用客户端
  写入路径 无所谓,通常与 Write Through 或 Write Ahead 结合使用。
  潜在问题
  这种方式最大的问题是不是所有的缓存都支持,本文的Redis例子不支持这种方式。
  当然,有些缓存是支持的,比如NCache,但是 NCache 也有它的问题。
  首先,它不支持很多客户端 SDK。 .NET Core 是原生支持语言,剩下的选项不多了。
  另外,它分为开源版和企业版,但是要知道,如果开源版的人用的不是很多,那么出了问题就悲剧了。即便如此,企业版不仅需要支付基础设施费用,还需要支付软件许可证费用。
  如何提高
  NCache的成本很高,是否可以自己实现 Read Through ?答案是肯定的。
  对于应用程序来说,我们并不关心它背后有什么样的缓存,只要它足够快地为我们提供数据,这就是我们所需要的。因此,我们可以将 Redis 封装为一个独立的服务,称为数据访问层(DAL),内部有一个 API 服务器来协调缓存和数据库。
  应用程序只需要使用定义的 API 从 DAL 中获取数据,而不需要关心缓存如何工作或数据库在哪里。 直写
  读取路径 不用管,实际工作一般都是通过 Read Through 完成的。
  写入路径 只为缓存而写的数据 通过缓存 更新数据库
  潜在问题
  与 Read Through 一样,并非每个缓存都受支持,必须自行实现。
  此外,缓存并非设计用于数据操作。很多数据库都有缓存不具备的能力,尤其是关系型数据库的ACID保证。
  更重要的是,缓存不适合数据持久化。当应用程序写入缓存并认为更新已完成时,缓存可能仍会因为"某种原因"而丢失数据。然后,当前的更新将永远不会再发生。
  如何提高?
  与 Read Through 一样,必须实施 DAL,但 ACID 和持久性问题仍未克服。于是,
  Write Ahead 诞生了。 提前写
  读取路径 不用管,实际工作一般都是通过 Read Through 完成的。
  写入路径 只为缓存而写的数据 通过缓存 更新数据库
  潜在问题
  同样,许多缓存也不支持 Write Ahead 。尽管读取路径和写入路径看起来与Write Through 相同,但其背后的实现却大不相同。
  Write Ahead是为了解决Write Through 的问题而产生的,所以先介绍一下。
  我们还将实现一个 DAL,但与 Write Through 不同,它实际上是一个内部消息队列而不是缓存。从上图可以看出,整个DAL架构变得更加复杂。要正确使用消息队列,需要更多的领域知识和更多的人力资源来设计和实现。
  如何提高?
  通过使用消息队列,可以有效保证变化的持久性,同时消息队列也保证了一定的原子性和隔离性,虽然没有关系型数据库那么完备,但仍然具有基本的可靠性。
  此外,消息队列可以将碎片化的更新合并成批次。例如,当一个应用程序想要更新三个缓存以便发送三个消息时,DAL worker 可以将这三个消息合并为一个 SQL 语法以减少对数据库的访问。
  需要注意的是必须使用消息队列来保证消息的顺序,因为对于数据库的更新来说,先插入再删除和先删除再插入的意义是截然不同的。 每个消息队列确保消息顺序的方法略有不同  :
  1)Kafka ,可以通过使用正确的分区键来实现。
  2)RocketMQ,可以基于队列(分区)的 顺序消费, 顺序消费,分为全局顺序消费,和局部顺序消费。
  全局顺序消费  :只能有一个数据队列(queue),和一个消费者实例。原因是RocketMQ只提供在单个queue上使用FIFO顺序的有序消息。多个queue之间并不能保证消息的严格先后性。
  局部顺序消费  :通常在实际应用中,我们需要将同一个订单号的相关操作,按照规则(可以是hash或取模等)发送到同一个queue上(使用MessageQueueSelector ),然后消费者实例,使用顺序消费模式消费消息(使用MessageListenerOrderly)
  然而,实现Write Ahead 的复杂度非常高。如果您负担不起这样的复杂性,那么 Read Aside 是更好的选择。 双重删除
  我们已经讨论了两种主要类型的缓存模式,它们是 读一边 通读、通写、预写
  这两种类型之间最根本的区别是实现的复杂性。 以Read Aside 为例,实现起来非常容易,做对也非常简单。但是, Read Aside 在很多交互下很容易产生各种 corner case。
  另一方面,通过实现 DAL 可以避免 corner cases,但是正确实现 DAL 非常困难,并且需要广泛的领域知识才能正确实现,这进一步使 DAL 难以实现。
  那么,DAL 是减少极端案例数量的唯一方法吗?不,不是真的。
  这就是 Double Delete 模式试图解决的问题。
  读取路径 从缓存中读取数据 如果缓存数据不存在 改为从数据库读取 并写回缓存
  该过程与Read Aside 完全相同。
  写入路径 先清除缓存 然后将数据写入数据库 稍等片刻,然后再次清除缓存
  潜在问题
  Double Delete 的目的是尽量减少因 Read Aside  corner cases而导致灾难的时间。
  整个不一致完全取决于等待时间,等于最大等待时间。
  但如何等待也是一个棘手的实际问题。如果让client本来就开始处理,那么corner case 2的killed场景还是解决不了。如果其他人以异步的方式执行,那么这之间的通信契约和工作流控制就会很复杂。
  如何提高
  与Read Aside 相同的极端情况 2 ,但同样,它可以通过正常关闭来减少。 结论
  在这篇文章中,我们介绍了很多提高一致性的方法。通常,当一致性不是关键要求时, 缓存过期 就足够了并且需要非常低的实现工作量。事实上,广泛使用的 CDN 只是使用 Cache Expiry 的其中一种情况。
  随着场景越来越关键,对一致性要求越来越高,那就考虑用 Read Aside 甚至 Double Delete 来实现。这两种方法的正确实现足以使一致性满足大多数场景。
  然而,随着一致性要求的不断提高,需要更复杂的实现,例如 Read Through 和 Write Through 甚至 Write Ahead 。 虽然这可以提高一致性,但成本也很高。首先,它需要足够的人力和领域知识来实施。此外,实施的时间成本和事后的维护成本也明显更高。此外,运营这样的基础设施还有额外的费用。
  为了进一步提高一致性,需要使用更先进的技术,如 共识算法  ,以多数共识的方式保证缓存和数据库内容的一致性。这也是TAO背后的理念,但我不打算介绍这么复杂的做法,毕竟我们不是Meta,至少我不是。
  在一般的组织中,对一致性的要求没有那么严格,比方说,10个或更多的9,一般的组织无法操作如此复杂和庞大的架构。
  因此,在本文中,我选择了我们都可以实现的做法,但即使是简单的做法,如果正确实施,也已经具有足够高的一致性。

为什么感觉老交易员都不愿意谈论技术指标,也不愿意讨论行情?如果开始炒股就算交易员,那我已经有17年交易股龄,应该算是老交易员之一了。作为一个老交易员,很少开口讨论行情,听别人说的多,经常就是一笑置之。炒股时间越久,越不愿意和别人讨论行情,芯片设计商把设计图纸交给代工厂制造的时候会不会被窃取技术?我可以肯定的告诉你不能!!!当芯片公司把设计好的图纸交给代工厂输入计算机里一定要设计公司亲自参与。然后代工厂按照设计厂的程序逻辑去生产,打工厂只是出设备出技术,加工完成后一定会把设山东泰山队是不是中超联赛最稳定的俱乐部?怎么说呢,这个赛季广州垮了,苏宁解散了,山东拿冠军了,很多人才开始表扬山东,过往那十年很多人去干嘛了呢?山东的确是中超豪门,但是应该是最被低估的豪门,近十年话题最多的还是广州,国安如果奥尼尔有姚明的罚球技术,他能成为NBA历史得分王吗?终其NBA生涯,奥尼尔得到28596分位居NBA历史第8位,距榜首的贾巴尔(38387分)差9791分。奥尼尔生涯罚球命中率为52。7(罚球出手11252次,命中5935球),而姚李霄鹏执教中国男足,男足会起死回生吗?不可能!!!他只不过是救火教练。让中国足球真正崛起,就要从足协的彻底改革做起。中国足球成绩不好,球迷媒体人整天吵吵嚷嚷要求换教练,只能说中国球迷媒体人太荒唐很操蛋,明明是中国球员技您如何评价世预赛中国男篮双杀日本?在11月27日11月28日中国男篮在世预赛小组赛中双杀东道主日本队,首战7963,第二场10673,两场净胜日本队49分,特别是第二场比赛106分的破百成绩,在国家队的国际比赛中应为什么现在中国学生得抑郁症的人那么多?跟家长是否有直接关系?这跟国家的计划生育有关,因为一对夫妻只生育一个小孩的政策的孩子们已经慢慢长大了,面临升中考或者是高考的升学压力。因为只有一个子女,他(她)们集万千宠爱于一身,受挫能力差,一旦遇到不世乒赛夺冠的王曼昱首轮出局是太过劳累还是太过轻敌?王曼玉出局是大出意外,杜凯琹原是首钢乓乒队员,对国内顶尖队员情况熟悉,交过手,又是世界排名第八,亚锦标赛女单亚军,奥运团体铜牌的得主。有澳洲公开赛的混双冠军。杜凯琹技术独到,她的他古玩市场中,袁大头为什么那么值钱?虽然袁大头价值高,但没有这种说法(样币除外)。袁像侧面银币,俗称袁大头,民国三年民国政府颁布国币条例,为统一银元铸造,根据条例对银元重量,成色规定,天津,南京等造币厂开始铸造袁大头历史上跟日本人动手的霍元甲和叶问,结局怎么样?陈真真的不是霍元甲的徒弟吗?历史当中习武的人不少,但是真正能够出名的人却不多。不过也出了霍元甲叶问等几位大师,那么他们当年经历了什么东西?有没有和日本人打过?霍元甲吓跑两个大力士,但没和日本人动手。霍元甲自幼WTT世界杯,杜凯琹30横扫王曼昱,属于超水平发挥吗?WTT世界总决赛第一轮,杜凯琴3比O横扫王曼玉,是正常发挥。不存在超水平发挥的问题。是王曼玉不适应杜凯琹的特别前台有加力加旋转,推拦前冲弧圈球,专克制王曼王大力拧拉扣杀球,冲力有减
高尔夫新知靠捡高尔夫球14年赚1500万美元,中国也有这职业伴随着一记帅气的强力挥杆,小小的高尔夫球以300公里的初速飞向天际,划过一道美妙的彩虹,不紧不慢地掉落在草地上,缓缓地向前滚动,直到掉进池水中。在比赛中,女子中巡的职业球手也会有把库伦作用促进有机框架中的阴阳离子共储研究亮点1)提出了构建多离子共储有机框架的化学设计原则次级电化学活性模块(SEBUs)组装策略2)阴阳离子库仑作用促进了有机框架电极中的离子扩散与储存,从而大幅提高电极容量和动力学不当泡脚误伤身体!当心给身体悄悄埋雷中医讲究春天泡脚,升阳固脱夏天泡脚,祛湿除暑秋天泡脚,润肺濡肠冬天泡脚,丹田温灼。因为,我们人体的脚底有许多穴位,热水泡脚可以加速我们的血液循环,还可以刺激脚底的穴位,达到保健的功2月14日乌克兰俄罗斯足球运动员在土耳其酒店发生大规模斗殴俄罗斯和乌克兰在战场上打的不可开交,而足球运动员碰面后场面也火爆异常。土耳其皇家塞吉努斯酒店。乌克兰足球运动员与俄罗斯运动员共同居住到了这家酒店,于是冲突不可避免的发生了。事情的起11款护手霜对比测试美加净配方剔除刺激性防腐剂,欧舒丹茱莉蔻含可致敏香精按选购护手霜时,你会关注产品含什么防腐剂吗?这两年除了口罩用得多,手也快洗秃噜皮了吧,洗手不光需要洗手液,洗完少不了要涂护手霜。护手霜一般规格为30ml75ml,每次洗完手后需要重开学了,建议别太节省,多给孩子准备八道菜,补脑益智长身体大家好,这里是邱哥说美食,立春一过,年也正式过完了,家里有小孩子的,也陆陆续续迎来了春季开学季。她们有的开心,也有的不开心的,还有的很无奈,都将依依不舍地背起书包,告别家人,迎来新古代官员上朝常手持笏板,其作用是什么?君君臣臣,父父子子这是孔子对齐景公的劝诫,也主张了孔子在其位,就谋其政,不在其位,不谋其政的思想。的确,在古代伴君如伴虎,大臣稍有不慎便可能招致灭顶之灾,作为臣子需要时刻警醒自己,身体堵了?中医调理来疏通保持身体通畅对于健康来说十分重要,对于鼻塞不通咽部异物感毛孔粗糙大便干结等堵塞问题,不妨通过一些中医方法来调理。肠道堵润肠食疗疏通肠道经过气候干燥的秋季,不少人出现津液亏损的情况。didoR40无创血糖智能手环六种身体数据监测,实时守护健康三年的新冠疫情让人们对健康更加重视,即便平常再忙也要时刻关注自己的身体健康,毕竟身体是革命的本钱,没有一个好身体,其他一切都是浮云。根据权威机构发布的多项研究报告显示,中国人的心血利润暴跌89,称霸30年的快餐之王败退中国!2月8日,百胜中国发布2022年四季度及2022年全年财报。数据显示,2022年百胜中国实现收入95。7亿美元,同比下滑3净利润为4。42亿美元,同比下跌55。其中,四季度经营数据犹如一幅春日油画!一起领略花开中国园博园紫花马缨丹盛开眼下,在广西南宁市园博园,5000多平方米的紫花马缨丹竞相开放。紫花马缨丹喜欢湿润温暖的环境,南宁园博园在荷塘周围种满了紫花马缨丹,还在花圃中设置了步道,一直延