您当前的位置:首页 > 电脑百科 > 程序开发 > 架构

分布式系统中的数据访问设计模式

时间:2023-11-07 13:30:19  来源:微信公众号  作者:小技术君

在大多数具有简单查询的单体系统中,所有必要的数据可以在单个数据库调用中检索。然而,当数据分散到由不同服务拥有的单独的数据库或模式中时,读操作的数据访问开始变得困难。

分布式系统中的数据访问设计模式

示例

愿望单服务维护客户可能希望最终购买的项目列表,并包括客户ID、项目ID和项目添加日期在相应的愿望单表中。目录服务负责维护公司销售的所有项目,并包括项目ID、项目描述和静态产品维度信息,如重量、高度、长度等。

分布式系统中的数据访问设计模式

在这个示例中,当客户请求显示他们的愿望单时,项目ID和项目描述(item_desc)都会返回给客户。然而,愿望单服务的表中没有项目描述;该数据由目录服务拥有,在提供更改控制和数据所有权的紧密形成的有界上下文中。

服务间通信模式

服务间通信模式是分布式系统中最常见的用于访问数据的模式。如果一个服务(或系统)需要读取它无法直接访问的数据,它只需通过某种远程访问协议向拥有该数据的服务或系统请求数据。

请注意,对于每个获取客户愿望单的请求,愿望单服务必须进行远程调用以从目录服务获取项目描述。这种模式出现的第一个问题是由于网络延迟、安全延迟和数据延迟而导致的性能较慢。

  • 网络延迟是到达和从服务的分组传输时间。
  • 安全延迟发生在需要额外授权才能执行请求的目标服务的端点。
  • 数据延迟描述了需要进行多次数据库调用以检索传递给最终用户所需信息的情况。

分布式系统中的数据访问设计模式

这种模式的另一个重要缺点是服务耦合。因为愿望单必须依赖于目录服务是否可用,所以这两个服务在语义上和静态上都是耦合的,这意味着如果目录服务不可用,愿望单服务也不可用。此外,由于愿望单服务与目录服务之间的紧密静态耦合,愿望单服务随着需求量的增加而扩展,目录服务也必须扩展。

列模式复制模式

使用列模式复制模式,列被复制到表格中,从而复制数据并使其可用于其他有界上下文。

数据同步和数据一致性是与列模式复制数据访问模式相关的两个最大问题。每当创建产品、从目录中删除产品或更改产品描述时,目录服务必须以某种方式通知愿望单服务(和任何其他复制数据的服务)进行更改。通常,通过使用队列、主题或事件流进行异步通信来完成这一点。

分布式系统中的数据访问设计模式

这种模式的另一个挑战是很难管理数据所有权。因为数据复制在属于其他服务的表格中,这些服务可以更新数据,即使它们并没有正式拥有数据。这反过来又带来了更多的数据一致性问题。

尽管一般情况下我们警告不要在愿望单服务和目录服务示例等情况下使用这种数据访问模式,但在某些情况下可能需要考虑使用它,例如数据聚合、报告或其他数据访问模式不适合的情况,因为数据量大,响应要求高或容错要求高。

复制缓存模式

这种模式利用复制的内存缓存,使其他服务所需的数据可用于每个服务,而无需请求它们。复制缓存与其他缓存模型不同,因为数据保留在每个服务的内存中,并持续同步,以便所有服务在任何时候都具有相同的数据。

让我们与其他缓存模型进行比较,以更好地理解它。单个内存缓存模型是最简单的缓存形式,其中每个服务都有自己的内部内存缓存。使用这种缓存模型,内存数据在缓存之间不进行同步,这意味着每个服务都有其自己的特定于该服务的唯一数据。尽管这种缓存模型有助于提高每个服务内部的响应性和可伸缩性,但由于缺乏缓存之间的同步,对于共享数据而言并不有用。

分布式系统中的数据访问设计模式

在分布式架构中使用的另一种分布式缓存。正如此缓存模型所示,数据不存储。

在每个服务的内存中,而是存储在缓存服务器中。服务使用专有协议向缓存服务器发出请求以检索或更新共享数据。请注意,与单个内存缓存模型不同,数据可以在服务之间共享。

分布式系统中的数据访问设计模式

使用复制缓存,每个服务都有自己的内存数据,在服务之间保持同步,允许多个服务之间共享相同的数据。

分布式系统中的数据访问设计模式

那么复制缓存是如何工作的呢?为了解决分布式数据访问问题,让我们回到愿望单服务和目录服务的示例。目录服务拥有产品描述的内存缓存(这意味着它是唯一可以修改缓存的服务),愿望单服务包含相同缓存的只读内存副本。

分布式系统中的数据访问设计模式

有了这种模式,愿望单服务不再需要调用目录服务以检索产品描述 — 它们已经在愿望单服务的内存中。当目录服务对产品描述进行更新时,缓存产品将更新愿望单服务中的缓存以使数据一致。

复制缓存模式的明显优势在于响应性、容错性和可伸缩性。由于服务之间不需要明确的服务间通信,数据随时在内存中可用,提供了对不拥有数据的服务最快的数据访问。

这种模式的第一个权衡是与缓存数据和启动时间相关的服务依赖性。由于目录服务拥有缓存并负责填充缓存,所以在初始愿望单服务启动时,目录服务必须在运行时。如果目录服务不可用,初始愿望单服务必须进入等待状态,直到与目录服务建立连接。

这种模式的第二个权衡是数据量。如果数据量太大(如超过500 MB),则这种模式的可行性会迅速减小,特别是对于需要数据的多个服务的多个实例。

第三个权衡是,如果数据的更改率(更新率)太高,复制缓存模型通常不能在服务之间保持数据完全同步。

总结

  • 服务间通信模式:这是最常见的分布式系统中的数据访问模式,其中一个服务需要读取其他服务拥有的数据时,通过远程访问协议向拥有数据的服务请求数据。然而,这种模式存在性能较慢、服务耦合等问题。
  • 列模式复制模式:这个模式涉及将数据列复制到不同的表中,以使数据可用于其他有界上下文。但它面临数据同步和数据一致性的挑战,因为数据的更改需要异步通信来通知其他服务,这可能导致数据一致性问题。
  • 复制缓存模式:这种模式利用内存缓存,使多个服务能够共享相同的数据,而无需显式请求。这提供了高响应性、容错性和可伸缩性,但也带来了服务依赖性和数据量等权衡问题。

每种模式都有其适用的场景和权衡,选择合适的数据访问模式取决于具体的需求和约束。



Tags:分布式   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
在Redis中如何实现分布式锁的防死锁机制?
在Redis中实现分布式锁是一个常见的需求,可以通过使用Redlock算法来防止死锁。Redlock算法是一种基于多个独立Redis实例的分布式锁实现方案,它通过协调多个Redis实例之间的锁...【详细内容】
2024-02-20  Search: 分布式  点击:(47)  评论:(0)  加入收藏
手动撸一个 Redis 分布式锁
大家好呀,我是楼仔。今天第一天开工,收拾心情,又要开始好好学习,好好工作了。对于使用 Java 的小伙伴,其实我们完全不用手动撸一个分布式锁,直接使用 Redisson 就行。但是因为这些...【详细内容】
2024-02-19  Search: 分布式  点击:(39)  评论:(0)  加入收藏
雪花算法详解与Java实现:分布式唯一ID生成原理
SnowFlake 算法,是 Twitter 开源的分布式 ID 生成算法。其核心思想就是:使用一个 64 bit 的 long 型的数字作为全局唯一 ID。在分布式系统中的应用十分广泛,且 ID 引入了时间戳...【详细内容】
2024-02-03  Search: 分布式  点击:(50)  评论:(0)  加入收藏
Python分布式爬虫打造搜索引擎
简单分布式爬虫结构主从模式是指由一台主机作为控制节点负责所有运行网络爬虫的主机进行管理,爬虫只需要从控制节点那里接收任务,并把新生成任务提交给控制节点就可以了,在这个...【详细内容】
2024-01-25  Search: 分布式  点击:(58)  评论:(0)  加入收藏
分布式事务框架选择与实践
分布式事务是处理跨多个服务的原子操作的关键概念,而选择适合应用场景的框架对于确保事务一致性至关重要。以下是几个常见的分布式事务框架,并讨论它们的使用和实践。1. XA协...【详细内容】
2024-01-05  Search: 分布式  点击:(96)  评论:(0)  加入收藏
分布式场景下的事务机制
事务消息是RocketMQ的一个非常特色的高级特性,它的基础诉求是通过RocketMQ的事务机制,来保证上下游的数据⼀致性。我们在单机版本下面只需要在业务方法上加上对应的事务就可以...【详细内容】
2023-12-26  Search: 分布式  点击:(120)  评论:(0)  加入收藏
分布式存储系统在大数据处理中扮演着怎样的角色?
如果存储节点本身可以定制,则通常会让其支持部分计算能力,以利用数据的亲和性,将部分计算下推到相关的存储节点上。如果存储是云上的 S3 等对象存储,无法定制,则通常会将数据在计...【详细内容】
2023-12-19  Search: 分布式  点击:(48)  评论:(0)  加入收藏
MongoDB与大数据处理:构建高性能分布式数据库
MongoDB是一种非关系型数据库,具有高度灵活性和可扩展性。在处理大量数据时,索引的优化是提升查询性能的关键。下面将介绍一些MongoDB索引优化的指南,帮助用户更好地利用索引来...【详细内容】
2023-12-18  Search: 分布式  点击:(71)  评论:(0)  加入收藏
聊一聊雪花算法与分布式ID生成
生成全局唯一ID的雪花算法原理雪花算法是一种用于生成全局唯一ID的算法,最初由Twitter开发,用于解决分布式系统中生成ID的问题。其核心思想是将一个64位的长整型ID划分成多个...【详细内容】
2023-12-12  Search: 分布式  点击:(132)  评论:(0)  加入收藏
Redis分布式锁常见坑点分析
日常开发中,基于 Redis 天然支持分布式锁,大家在线上分布式项目中都使用过 Redis 锁。本文主要针对日常开发中加锁过程中某些异常场景进行讲解与分析。本文讲解示例代码都在 h...【详细内容】
2023-12-11  Search: 分布式  点击:(111)  评论:(0)  加入收藏
▌简易百科推荐
对于微服务架构监控应该遵守的原则
随着软件交付方式的变革,微服务架构的兴起使得软件开发变得更加快速和灵活。在这种情况下,监控系统成为了微服务控制系统的核心组成部分。随着软件的复杂性不断增加,了解系统的...【详细内容】
2024-04-03  步步运维步步坑    Tags:架构   点击:(5)  评论:(0)  加入收藏
大模型应用的 10 种架构模式
作者 | 曹洪伟在塑造新领域的过程中,我们往往依赖于一些经过实践验证的策略、方法和模式。这种观念对于软件工程领域的专业人士来说,已经司空见惯,设计模式已成为程序员们的重...【详细内容】
2024-03-27    InfoQ  Tags:架构模式   点击:(13)  评论:(0)  加入收藏
哈啰云原生架构落地实践
一、弹性伸缩技术实践1.全网容器化后一线研发的使用问题全网容器化后一线研发会面临一系列使用问题,包括时机、容量、效率和成本问题,弹性伸缩是云原生容器化后的必然技术选择...【详细内容】
2024-03-27  哈啰技术  微信公众号  Tags:架构   点击:(10)  评论:(0)  加入收藏
DDD 与 CQRS 才是黄金组合
在日常工作中,你是否也遇到过下面几种情况: 使用一个已有接口进行业务开发,上线后出现严重的性能问题,被老板当众质疑:“你为什么不使用缓存接口,这个接口全部走数据库,这怎么能扛...【详细内容】
2024-03-27  dbaplus社群    Tags:DDD   点击:(11)  评论:(0)  加入收藏
高并发架构设计(三大利器:缓存、限流和降级)
软件系统有三个追求:高性能、高并发、高可用,俗称三高。本篇讨论高并发,从高并发是什么到高并发应对的策略、缓存、限流、降级等。引言1.高并发背景互联网行业迅速发展,用户量剧...【详细内容】
2024-03-13    阿里云开发者  Tags:高并发   点击:(6)  评论:(0)  加入收藏
如何判断架构设计的优劣?
架构设计的基本准则是非常重要的,它们指导着我们如何构建可靠、可维护、可测试的系统。下面是这些准则的转换表达方式:简单即美(KISS):KISS原则的核心思想是保持简单。在设计系统...【详细内容】
2024-02-20  二进制跳动  微信公众号  Tags:架构设计   点击:(36)  评论:(0)  加入收藏
详解基于SpringBoot的WebSocket应用开发
在现代Web应用中,实时交互和数据推送的需求日益增长。WebSocket协议作为一种全双工通信协议,允许服务端与客户端之间建立持久性的连接,实现实时、双向的数据传输,极大地提升了用...【详细内容】
2024-01-30  ijunfu  今日头条  Tags:SpringBoot   点击:(9)  评论:(0)  加入收藏
PHP+Go 开发仿简书,实战高并发高可用微服务架构
来百度APP畅享高清图片//下栽のke:chaoxingit.com/2105/PHP和Go语言结合,可以开发出高效且稳定的仿简书应用。在实现高并发和高可用微服务架构时,我们可以采用一些关键技术。首...【详细内容】
2024-01-14  547蓝色星球    Tags:架构   点击:(115)  评论:(0)  加入收藏
GraalVM与Spring Boot 3.0:加速应用性能的完美融合
在2023年,SpringBoot3.0的发布标志着Spring框架对GraalVM的全面支持,这一支持是对Spring技术栈的重要补充。GraalVM是一个高性能的多语言虚拟机,它提供了Ahead-of-Time(AOT)编...【详细内容】
2024-01-11    王建立  Tags:Spring Boot   点击:(124)  评论:(0)  加入收藏
Spring Boot虚拟线程的性能还不如Webflux?
早上看到一篇关于Spring Boot虚拟线程和Webflux性能对比的文章,觉得还不错。内容较长,抓重点给大家介绍一下这篇文章的核心内容,方便大家快速阅读。测试场景作者采用了一个尽可...【详细内容】
2024-01-10  互联网架构小马哥    Tags:Spring Boot   点击:(115)  评论:(0)  加入收藏
站内最新
站内热门
站内头条