👉目录
1 问题细节剖析
2 区分业务场景
3 标识写入数据
4 判断时延要求
5 提供就近访问
6 解决思路总结
问题细节剖析
单写单读,将所有需要写后立即读的请求都路由到唯一的写入点读取,可以保证能够读到最新写入的值; 多写多读,保证写入点个数(W)和读取点个数(R)的和大于节点总数(N),即 N < R + W,也就是 NRW 方案; 读时复制,在读节点收到读请求的时候,检测本节点的被读数据是否是最新的,不是的话,就等把最新的数据复制到位再返回。
如果每次都要读多个节点,那基本上就面临着读请求都要跨城; 如果每次都就近读1个节点,那就要求写入的时候要写入所有节点。
主从复制模式是半同步模式,只要求主写点收到2份数据复制确认,保证在本城之外有一份冗余数据后即提交成功,但是2份数据复制确认具体是哪2个从节点来的,不确定; 数据层为了屏蔽容灾、运营动作导致的读写节点变更对上层调用放透明,通过名字服务提供读写访问,提供了写名字、读名字,写名字指向主写点,读名字指向所有节点提供就近访问能力; 如果要应对写后立即读,那么在做读操作路由的时候,得选择写名字获得主写点进行数据读取。
写源:即写操作的发起来源,大抵可以分两类,一类来源是用户触发,另一类是后台触发。差别在于,用户触发一般是单个细粒度的写更新,后台触发往往是大批量的写更新,结合读需要,二者对于写点的压力是不同的; 架构:在一主N从的存储架构下,数据在主写节点写入之后,还没有同步到某从节点的情况下,读请求打到该从节点上,就产生了读不到新值的问题; 时效:一个是数据写入之后读请求到来之前的时间差,记写后读间隔,也就是“写后立即读”的立即是多立即;另一个是数据写入后和复制到从的时间差,记写复制时延。如果写复制时延大于写后读间隔,就会产生读不到新值的问题。基本上很难保证写复制时延一定小于写后读间隔; 读者:即写入数据的读取使用方,和写源类似,一类是真实用户,一类是后台程序。后台程序基本上都是可以采用异步的方式解决即可,大都不用考虑“立即”的问题,写后立即读重点在于解决用户的“立即读“需要; 场景:一份数据的使用场景基本上都是多样的,并不是所有的场景都有写后立即读的诉求,往往都是解决少量核心场景的需要即可; 范围:在数据全集中,一个时间段内有多少数据是需要面临写后立即读问题?从写源分析来看,用户触发的写显然是小范围的,后台触发的写是大范围的,但是这种大批量往往可以做时间段拆分,可以缩减范围,再考虑真实用户带来的读,也就是小范围的了。“小范围”结合“少场景”,这就是一个典型的“局部性”问题。
区分业务场景; 标识写入数据; 判断时延要求; 提供就近访问。
区分业务场景
服务调用方视角,服务的不同调用方根据需要,在调用服务的时候申明请求是否有写后立即读的诉求,可以通过服务提供方在协议上定义协议字段让调用方申明诉求; 服务提供方视角,服务提供方为不同的调用方分配标识,在服务提供方内部管理调用方属性,将有写后立即读诉求的调用方标识出来; 一般来说,服务提供方视角的方式具有更好的可控可管特性,不太容易被调用方滥用,比较推荐。
标识写入数据
用户触发写入的场景,可以在给用户回包的时候,把写入的信息带上,立即读的时候回带,后台可以直接用来做判断; 不论哪种写操作发起来源,由后台统一记录最近写入的信息,请求到来的时候,先访问一下记录的写入信息,再行判断是否有最近写入。这里可以更进一步,不光记录数据是否有写入的标识,还可以考虑把完整的写入数据也记录下来; 后台统一记录的处理方式更有普适性,上面提到的两种典型场景,不论是用户写后立即读,还是后台写后用户立即读,都能很好应对。
判断时延要求
跨城往返时延大约 30ms,这种时延是否可以接受? 读请求需要读取的数据,是否有多份?多份数据是否都有写后立即读的要求? 多份数据的读取,是有前后依赖需要串行读取?还是可以并发读取? 上面的几个问题,需要综合考虑整个业务多种场景,且适当考虑未来,当前可以满足需要,未来是否依然?
提供就近访问
第2步写入数据之后,就可以并行回包,以及并行写多份就近副本了; 在写就近副本的时候,可以采用轻量的 CAS 写入保障,失败的情况下,可以适当增加重试次数; 增加短时的异步对账,检测就近副本和主写点之间的差异,让失败的影响控制在很小的时间范围之内; 对于异步写入就近副本的方式,可以提供封装好的 API,提供给有需要的服务,降低使用成本。
解决思路总结
如喜欢本文,请点击右上角,把文章分享到朋友圈
如有想了解学习的技术点,请留言给若飞安排分享
因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享
·END·
相关阅读:
一张图看懂微服务架构路线 基于Spring Cloud的微服务架构分析 微服务等于Spring Cloud?了解微服务架构和框架 如何构建基于 DDD 领域驱动的微服务? 微服务架构实施原理详解 微服务的简介和技术栈 微服务场景下的数据一致性解决方案 设计一个容错的微服务架构
作者:熊章俊
来源:腾讯云开发者
版权申明:内容来源网络,仅供学习研究,版权归原创者所有。如有侵权烦请告知,我们会立即删除并表示歉意。谢谢!
我们都是架构师!
关注架构师(JiaGouX),添加“星标”
获取每天技术干货,一起成为牛逼架构师
技术群请加若飞:1321113940 进架构师群
投稿、合作、版权等邮箱:admin@137x.com