《微服务架构设计模式》第七章 在微服务架构中实现查询

news2024/12/23 23:56:13

内容总结自《微服务架构设计模式》

在微服务架构中实现查询

    • 一、使用API组合模式查询
      • 1、简介
      • 2、设计形式
      • 3、弊端
    • 二、使用CQRS进行查询
      • 1、简介
      • 2、利弊
    • 三、CQRS架构
      • 1、设计
      • 2、存储
      • 3、数据访问模块
    • 四、总结



一、使用API组合模式查询

1、简介

这是最简单的方法,应尽可能使用。它的工作原理是让拥有数据的服务的客户端负责调用服务,并组合服务返回的查询结果,实现从多个服务检索数据的查询。

2、设计形式

选择由谁来扮演查询操作的API组合器这个角色,通常有三种选择。这里可以类比设计模式中的门面模式


方式一:

方式二:

方式三:


3、弊端

1、增加了额外的开销

它需要调用多个服务和查询多个数据库,这带来了额外的开销。在单体应用程序中,客户端可以使用单个请求检索数据,这通常会执行单个数据库查询。相比之下,使用API组合模式会涉及多个请求和多个数据库查询。因此,它需要更多计算和网络资源,运行应用程序的成本也相应增加。

2、可用性降低

操作的可用性随着所涉及的服务数量而下降。因为查询操作的实现涉及多个服务:API组合器和至少两个提供方服务,其可用性将显著小于单个服务的可用性。例如,如果单个服务的可用性为99.5%,则调用四个提供方服务的findOrder ()接口的可用性为99.5%(4+1)=97.5% !

3、缺乏事务数据一致性

单体应用程序通常使用一个数据库事务执行查询操作。ACID事务受制于隔离级别的约束,可以确保应用程序具有一致的数据视图,即使它执行多个数据库查询。相反,API组合模式则是针对多个数据库执行查询。这种方式存在一种风险,即查询操作将返回不一致的数据。




二、使用CQRS进行查询

命令查询职责隔离模式它比API组合模式更强大,但也更复杂。它维护一个或多个视图数据库,其唯一目的是支持查询。使用事件来维护从多个服务腐之数据的只读视图,借此实现对来自多个服务的数据的查询(即读写分离

1、简介

它将持久化数据模型和使用数据的模块分为两部分:命令端和查询端。命令端模块和数据模型实现创建、更新和删除操作(缩写为CUD,例如:HTTP POST、PUT和DELETE)。查询端模块和数据模型实现查询(例如HTTP GET)。查询端通过订阅命令端发布的事件,使其数据模型与命令端数据模型保持同步。


2、利弊

优势:

1、在微服务架构中高效地实现查询

使用API组合模式实现查询有时会导致大规模数据集的昂贵、低效的内存中连接。对于那些查询,使用易于查询的CQRS视图更有效,该视图预加载(并预处理)来自两个或更多服务的数据。

2、高效地实现多种不同的查询类型

尝试使用单个持久化数据模型支持所有查询通常具有挑战性,并且在某些情况下是不可能的。一些NoSQL数据库具有非常有限的查询功能。即使数据库具有支持特定类型查询的扩展,使用专用数据库通常也更有效。CQRS模式通过定义一个或多个视图来避免单个数据存储的限制,每个视图都有效地实现特定查询。

3、在基于事件溯源技术的应用程序中实现查询

事件存储库仅支持基于主键的查询。CQRS模式订阅由基于事件溯源的聚合发布的事件流,可以保持最新的聚合的一个或多个视图,由此解决此限制。这也是基于事件溯源的应用程序总是使用CQRS的原因。

4、更进一步地实现问题隔离

领域模型及其相应的持久化数据模型不必同时处理命令和查询。CQRS模式为服务的命令端和查询端定义了单独的代码模块和数据库模式。通过隔离问题,命令端和查询端可能更简单,更易于维护。


弊端:

1、更加复杂的架构

开发人员必须编写更新和查询视图的查询端服务。管理和运维额外的数据存储库提高了运维的复杂性。此外,应用程序可能使用不同类型的数据库,这进一步增加了开发人员和运维人员面临的复杂性。

2、处理数据复制导致的延迟

在命令端发布事件和在查询端处理该事件以及更新视图之间存在延迟。更新聚合然后立即查询视图的客户端应用程序可能会看到聚合的先前版本。它必须避免用向用户暴露潜在的不一致性的方式编写CQRS的查询端。




三、CQRS架构

1、设计

CQRS视图模块包括由一个或多个查询操作组成的API。它通过订阅由一个或多个服务发布的事件来更新它的数据库视图,从而实现这些查询操作。视图模块包含视图数据库和三个子模块。

2、存储

可以使用数据结构更加灵活的NoSQL进行存储

3、数据访问模块

数据访问模块需要具备以下特点:

1、支持并发处理

2、具备幂等处理业务逻辑




四、总结

  1. 实现从多个服务检索数据的查询具有挑战性,因为每个服务的数据都是私有的。
  2. 有两种方法可以实现这些类型的查询:API组合模式和命令查询职责隔离(CQRS)模式。
  3. 从多个服务获取数据的API组合模式是实现查询的最简单方法,应尽可能使用。
  4. API组合模式的局限性是某些复杂查询需要大型数据集的低效内存连接。
  5. 使用视图数据库实现查询的CQRS模式功能更强大,但实现起来更复杂。
  6. CQRS视图模块必须处理并发更新以及检测和丢弃重复事件。
  7. CQRS有助于改善问题隔离,服务不必为自己拥有的数据实现查询功能。
  8. 客户必须处理CQRS 视图的最终一致性。

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

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

相关文章

WebDAV之π-Disk派盘 + PDF Expert

PDF Expert 支持WebDAV方式连接π-Disk派盘。 PDF Expert是一款macOS上的办公软件,它具有专业的PDF编辑功能,可以快速从邮件、网页支持PDF打开,支持用户进行阅读、批注等功能,用户可以直接在PDF上进行编辑文字图片,表单文档、创建笔记、添加书单等自定义使用,大大提高工…

手写JAVA线程池

前言 手写一个简单的java线程池:重点关注,如何确保一直有运行的线程?如何确保线程消费提交的任务信息?。一直保存有运行的线程底层使用的是死循环。使用消息队列确保信息的提交和消费。消息队列使用先进先出原则。 步骤 线程池…

漏洞复现 || OpenSNS远程命令执行漏洞

免责声明 技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律,遵守公共秩序,尊重社会公德,不得危害网络安全,不得利用网络从事危害国家安全、荣誉和利益,未经授权请勿利用文章中的技术资料对任何计…

力扣 | 二分查找模板

力扣:二分查找 文章目录 📚二分查找📚模板I👉x 的平方根👉猜数字大小👉搜索旋转排序数组 📚模板II👉第一个错误的版本👉寻找峰值 📚模板III👉在排…

photoshop制作法线和凹凸贴图

做个选区 Ctrlj 法线贴图 生成凹凸贴图

Vue实现多语言(i18n)

第一步 安装i18n插件。 npm install vue-i18n第二步 在src目录下,创建一个【language】文件夹,并创建两个语言包js文件。 中文语言包:【zh.js】 英文语言包:【en.js】 第三步 完善en.js文件和zh.js文件。两个文件的结构要相…

系统架构设计师-项目管理

目录 一、盈亏平衡分析 二、进度管理 1、WBS工作分解结构 2、进度管理流程 (1)活动定义 (2)活动排序 (3)活动资源估算: (4)活动历时估算: (5&…

谷歌浏览器添加首页快捷方式,并设置默认搜索引擎为百度

目录 1、添加首页快捷方式 ​2、谷歌浏览器设置默认搜索引擎 1、添加首页快捷方式 (1)首先要保证当前的默认搜索引擎为Google才可以添加首页的快捷方式。 (2)回到首页即可添加和自定义快捷方式的url (3)默…

Linux——系统文件IO(文件操作符 详解+代码)

文件操作符 1.回顾C语言文件接口总结 2.系统文件IO2.1 open函数介绍2.2代码测试2.3Q :fd为什么是3&#xff1f;012去哪里了&#xff1f;A: 3.如何理解Linux下一切皆文件 1.回顾C语言文件接口 写文件 #include <stdio.h> #include <string.h> int main() { FILE *…

【双指针】24. 两两交换链表中的节点

24. 两两交换链表中的节点 解题思路 dummyNode指向22 指向11 指向3然后移动指针 开始交换 3 4 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* L…

OpenAI GPT-4 Code Interpreter测试

OpenAI GPT-4 Beta版本Code Interpreter功能分析 OpenAI最近在GPT-4中推出了Code Interpreter功能的Beta版本&#xff0c;它是ChatGPT的一个版本&#xff0c;可以编写和执行Python代码&#xff0c;并处理文件上传。以下是对其表现的基本分析。 主要功能 文件信息获取&#xf…

Flutter入门教程(一),2023最新版包含安装,初始化!简单易懂!

Flutter入门教程&#xff08;一&#xff09;&#xff0c;2023最新版包含安装&#xff0c;初始化&#xff01;简单易懂&#xff01; Flutter介绍 首先&#xff0c;在一切的开始之前我们来介绍一下什么是Flutter&#xff0c;Flutter 是一个由 Google 开发的开源移动应用程序开发…

Openlayers实战:加载静态图片作为底图

我们经常会看到一些商场地图或者其他的静态图展示的情况,在Openlayers实战中,我们加载静态图片,使其成为底图,通过缩放,来展示各个部分。 效果图 源代码 /* * @Author: 大剑师兰特(xiaozhuanlan),还是大剑师兰特(CSDN) * @此源代码版权归大剑师兰特所有,可供学习或…

回首2023上半年:成长、思考、感恩

文章目录 每日一句正能量前言一、目标达成情况总结二、工作和学习成果总结三、下半年规划总结四、个人想法 后记附录 每日一句正能量 做一个向日葵族&#xff0c;面对阳光&#xff0c;不自艾自怜&#xff0c;每天活出最灿烂的自己。曾经拥有的&#xff0c;不要忘记。不能得到的…

【JAVA】定时任务之借阅到期自动催还

该篇主要以定时任务为主&#xff0c;通知略为记录 一. 定时任务逻辑代码 定时任务文件 TaskScheduling.java package org.springblade.modules.task;import lombok.extern.slf4j.Slf4j; import org.springblade.modules.archiveAdvantage.service.IArchiveBorrowService; im…

Pytorch基本使用—激活函数

✨1 介绍 ⛄ 1.1 概念 激活函数是神经网络中的一种数学函数&#xff0c;它被应用于神经元的输出&#xff0c;以决定神经元是否应该被激活并传递信号给下一层。常见的激活函数包括Sigmoid函数、ReLU函数、Tanh函数等。 &#x1f384; 1.2 性质 激活函数是神经网络中的一种重…

Markdown基本用法

目录 1 字体倾斜 1.1 加* 1.2 加_ 2 字体加粗 2.1 加** 2.2 加__ 3 字体上带删除线 4 文字变标题 5 超链接 5.1 直接输入地址 5.2 将超链接改成文字 5.2.1 同行写法 5.2.2 不同行写法 6 文字前加 6.1 号 6.2 *号 6.3 -号 7 有序列表 8 …

【微信小程序创作之路】- 小程序常用页面样式

【微信小程序创作之路】- 小程序常用页面样式 第四章 微信小程序用页面样式 文章目录 【微信小程序创作之路】- 小程序常用页面样式前言一、总体样式--全局样式and局部样式1.全局样式2.局部样式 二、Flex布局&#x1f349;&#x1f349;&#x1f349;rpx单位 三、样式导入四、…

HEGERLS四向穿梭车的调度算法如何解决同层多车时车辆路径规划和避让的问题?

纵观全球&#xff0c;消费需求正在发生转变&#xff0c;无论是个体消费还是企业消费&#xff0c;呈现出个性化、定制化、网络化的趋势。因此生产企业面临着产品多样化、订单碎片化、服务定制化的新挑战&#xff0c;仓储密集存储、超大拆零作业量需求愈加明显&#xff0c;且竞争…

苹果平板用不用买原装笔?ipad平替电容笔排行榜

我们应该都知道&#xff0c;第一款ipad早诞生于十年前&#xff0c;如今已是家喻户晓的平板电脑产品。ipad版本系列的更新非常迅速&#xff0c;销售也非常火爆。其中&#xff0c;iPad的配件起到了很大的作用&#xff0c;比如我们今天要介绍的这款电容笔&#xff0c;这款ipad的配…