探讨篇(四):分布式数据访问解决方案

京东云开发者
• 阅读 337

背景

如果数据在同一个服务的同一个数据库,通过SQL即可查询相对比较简单,但当数据被分布到不同服务不同的数据库中时,访问组合数据的操作就变的比较困难。 针对这个问题,本文描述了服务读取不同服务的数据库的几种方法:服务间通信模式、数据缓存模式、数据复制模式、数据共享模式

本文的观点源自我在日常学习与实践过程中的思考,尚处于不断探索和验证的阶段。希望能“抛砖引玉”,激发更多的讨论与交流。让我们共同进步,在探讨与实证中寻求真知。

一、服务通信模式

如果一个服务需要读取它无法直接访问的数据库,只需要使用远程调用比如RPC协议访问另外一个服务即可,这也是很多团队采用的一种方式,如下图:

这看起来很简单,但技术充满挑战问题

•首先是数据网络延迟导致服务A性能下降。

•服务之间的耦合,为了满足服务A的访问量,B服务必须随着A服务的流量规模变化而变化。

二、数据缓存模式

在上面服务通信的基础上加上缓存,这是很多团队使用的第二种方式。数据保存在每个服务的内存中并持续同步,因此服务拥有完全相同的数据。缓存又分为本地缓存+分布式缓存的组合关系。

1.单机本地缓存,每个服务都包含自己的数据。这种模式对应服务之间无法共享,比如服务启动加载数据到本地缓存。

2.分布式缓存:数据服务之间共享。但这种模式不是有效的复制缓存模式,因为它不能解决服务间通信模式下存在的容错性问题,获取数据从服务调用变成了缓存服务。其次由于缓存数据是中心化及共享的,打破数据所有权,并且可能导致缓存和数据库数据不一致。

以下是每种实现方式优缺点如下:

实现方式一: 本地缓存/分布式缓存+RPC远程调用

实现方式二: 通过RPC服务通讯同步推送数据+本地缓存

实现方式三: 通过定时任务worker,服务A通过RPC调用服务B拉数据

实现方式四: 通过异步MQ获取数据

缓存模式优缺点:

三、数据复制模式

在数据复制模式中,表之间会进行数据复制,也就是在数据库A冗余数据库B数据。这样可以确保服务A直接访问数据库A获取到数据库B的数据。可以通过很多种实现方式:

但这同样存在如下问题:如何管理数据所有权?到处都有这种数据,数据一致性问题

这种方案改善了上面服务通信的性能,容错性,可伸缩性问题。某些场景可用,比如聚合,报表或者其他不适合高性能需求,高容错性的时候

四、数据共享模式

如果上面的3种方式都不行,那可以用兜底方式,用创建数据领域,把数据组合到共享的数据库,让服务A和服务B都能访问。

服务之间完全解耦,解决了可用性依赖,响应性,吞吐量和可伸缩性问题

总结

1.通过本文的探讨,大家可以更全面地了解分布式数据访问的挑战和可能的解决方案

2.每种模式都有其优势和不足以及应用场景,本文旨在通过对比分析,为实际应用中的选择提供指导。

3.如果以上文案有问题或者还有更好的方案,欢迎评论区留言补充完善,谢谢

点赞
收藏
评论区
推荐文章
京东面试官:呦,你对中间件 Mycat了解的还挺深~
1.数据切分概念数据的切分根据其切分规则的类型,可以分为两种切分模式。一种是按照不同的表(或者Schema)来切分到不同的数据库(主机)(https://jq.qq.com/?wv1027&k0IsBuUb0)之上,这种切可以称之为数据的垂直(纵向)切分;另外一则是根据表中的数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库(主机)上面,这种切
Peter20 Peter20
3年前
Redis集群的三种模式
一、主从模式通过持久化功能,Redis保证了即使在服务器重启的情况下也不会损失(或少量损失)数据,因为持久化会把内存中数据保存到硬盘上,重启会从硬盘上加载数据。但是由于数据是存储在一台服务器上的,如果这台服务器出现硬盘故障等问题,也会导致数据丢失。为了避免单点故障,通常的做法是将数据库复制多个副本以部署在不同的服务器上,这样即使有一台服务器出现故障,其他
Stella981 Stella981
2年前
SpringBoot项目的限流
开发访问量比较大的系统是,爬虫的目的就是解决访问量大的问题;缓存穿透是为了保护后端数据库查询服务;计数服务解决了接近真实访问量以及数据库服务的压力。架构图!(https://oscimg.oschina.net/oscnet/c6239218a4445e605e95620cb79979d7f89.png)限流
Wesley13 Wesley13
2年前
JAVA架构设计,JAVA大型网站架构设计,JAVA高级和架构师数据库,分布式事务,大型分布式综合电商项目实战等视频教程
JAVA高级和架构师进阶,微服务架构,亿级高并发,分布式架构,源码剖析系列,项目实战,设计模式实战,数据结构与算法,消息中间件,并发编程多线程,服务器系列,数据库,分布式事务,大型分布式综合电商项目实战等视频教程
Stella981 Stella981
2年前
SequoiaDB 巨杉数据库
如今,大型企业的应用平台正在向微服务架构进行转型。在微服务架构下,应用程序和数据库等底层平台的关系将会被重构,新一代分布式数据库必须支持弹性扩张、资源隔离、多租户、可配置一致性、多模式(支持各类SQL协议)、集群内可配置容灾策略等一系列功能。传统单点数据库的容量瓶颈,仅仅是分布式数据库所解决的问题之一。更重要的是在未来微服务化应用开发以及云化
Easter79 Easter79
2年前
SpringBoot项目的限流
开发访问量比较大的系统是,爬虫的目的就是解决访问量大的问题;缓存穿透是为了保护后端数据库查询服务;计数服务解决了接近真实访问量以及数据库服务的压力。架构图!(https://oscimg.oschina.net/oscnet/c6239218a4445e605e95620cb79979d7f89.png)限流
Wesley13 Wesley13
2年前
mysql可扩展第二部分
  数据分片主要是将数据按照一定的规则分为几个完全不同的数据集合的方式成为数据分片。数据的切分可以是数据库内的,将数据库中的一张表切分为几个不同的数据库表。也可以是数据库级别的,将数据库中的表划分为多个表,这些表存储在不同的数据库服务器上。该部分主要用来介绍数据库级的数据分片。切分规则将具有相关的数据保存在同一个分片上可以提高数据查询效率。数据库分片的路由规
Stella981 Stella981
2年前
CoralCache:一个提高微服务可用性的中间件
摘要:当数据库出问题时能降级从本地缓存的数据中查询数据,CoralCache就是这样一个提高微服务可用性的中间件。背景有些场景下,微服务依赖数据库中一些配置项或者数量很少的数据,但当数据库本身有问题时候,即使数据量很少,这个服务是不能正常工作;因此需要考虑一种能支持全量极少变更的全局数据的场景,当数据库出问题时能降级从本
天翼云分布式缓存服务(Redis)的几个核心概念
天翼云官方网站的Redis产品服务的定义如下:天翼云分布式缓存服务(DistributedCacheService,CTDCS)是天翼云打造的分布式keyValue数据库服务,兼容Redis协议,主要用于持久化数据的存储或缓存数据的存储。Redis本质上是一个KeyValue类型的内存数据库,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库
京东云开发者 京东云开发者
8个月前
Mybatis 拦截器实现单数据源内多数据库切换 | 京东物流技术团队
物流的分拣业务在某些分拣场地只有一个数据源,因为数据量比较大,将所有数据存在一张表内查询速度慢,也为了做不同设备数据的分库管理,便在这个数据源内创建了多个不同库名但表完全相同的数据库,如下图所示:现在需要上线报表服务来查询所有数据库中的数据进行统计,那么现