首页 > 其他分享 >如何理解微服务体系结构中的 CQRS

如何理解微服务体系结构中的 CQRS

时间:2023-12-04 10:15:45浏览次数:27  
标签:酒店 服务 房间 预订 理解 旅馆 CQRS 体系结构

本文翻译自 How To Understand CQRS In Microservices Architecture,原作者 OLEKSII。

问题描述

在典型的软件应用程序中,有一个负责写入和读取操作的数据存储。通常,应用程序实现一些 CRUD 操作,并且非常简单。你存储了一些东西并读取了相同的结果。

然而,在复杂的应用程序中,情况并不是那么简单。每个操作都需要很多操作和约束。

例如:

  • :数据库是以规范化的方式构造的,以消除数据重复并强制约束。:复杂的读取查询需要大量对性能产生负面影响的联接(joins)/联合(unions)/聚合(aggregations)。
  • :优化查询需要索引。:每次操作都会更新索引。
  • 读/写表示可能不同,这可能是附加逻辑的原因。
  • 在对同一数据进行并行操作期间,可能会发生数据争用。
  • 由于数据库的负载,性能可能很差。

CQRS

上述问题的解决方案是 CQRS(Command Query Responsibility Segregation)。

让我们回顾一下上面的图片。它包含两个服务:旅馆管理服务旅馆预订服务(实际上,如果需要的话,可以有多个不同的预定服务及其各自的数据库)。这些服务之间的数据应该同步。为此,通常使用一些消息代理(例如 Kafka。这些服务的数据格式不同。

旅馆管理服务负责创建/更新/删除操作,每个操作都被描述为一个命令:

  • 生成/批准/拒绝一个酒店创建请求。
  • 添加/更新酒店房间到系统。
  • 更改酒店房间的价格。
  • 预订特定时间段的酒店房间。
  • 请求其他服务。
  • 生成请求留下/批准/拒绝评论。
  • 取消预订。

旅馆预订服务仅负责向用户显示酒店/房间列表:

  • 列出一个城市中所有/可用的酒店房间。
  • 在地图上显示所有酒店(按地理位置过滤)。
  • 向用户显示可用的过滤选项。
  • 通过指定的过滤器过滤酒店房间(例如,显示两个酒店房间,而不是一个多人房间)。

正如你所见,服务提供的责任是不同的。此外,指定服务的性能约束也不同。用户在预订之前通常会经过许多预订选项。因此,在这个系统中,操作的数量远远高于操作的数量。因此,这些服务的缩放将有所不同。

因此,一些 RDBMS 可以用作旅馆管理服务的数据存储,例如 MySQL或 PosgreSQL。RDBMS 将为保持数据安全提供它的所有好处。

旅馆预订服务可以基于一些 NoSQL 解决方案,如 MongoDB或 Elasticsearch。这背后的原因是执行高效搜索查询的能力:反规范化、地理位置搜索支持、索引、水平缩放等。

CQRS 优势

  • 关注点分离。
  • 单个读写服务缩放。
  • 适合读写操作的数据存储及其模式(schema)。
  • 简单高效的查询。

CQRS 劣势

  • 复杂性。
  • 最终一致性。

总结

在本文中,我们回顾了 CQRS 模式。值得一提的是,这种模式的必要性可能发生在复杂的系统中。因此,应谨慎选择,以免给系统带来不必要的复杂性。


欢迎关注我的公众号程序员爱读书

标签:酒店,服务,房间,预订,理解,旅馆,CQRS,体系结构
From: https://www.cnblogs.com/dev2007/p/17874290.html

相关文章

  • 深入理解C++继承(一)
    一、继承的概念及定义1.1继承的概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复......
  • 如何理解 SAP UI5 的 sap.ui.define 函数?
    我们在SAPUI5官网能查到sap.ui.define的详细文档:在一个JavaScript文件中,通常和建议的做法是在文件顶部有一个对sap.ui.define的调用。当通过其模块ID首次请求一个模块时,会根据ID和当前配置来确定对应的资源。该资源将被加载并执行,这将反过来执行顶级的sap.ui.defi......
  • 【C++ Primer Plus】C++11 深入理解右值、右值引用和完美转发
    1.右值引用和移动语义1.1左值和右值左值localvalue:存储在内存中、有明确存储地址(可寻址)的数据(x、y、z)右值 readvalue:不一定可以寻址,例如存储于寄存器中的数据;通常字面量都是右值,除了字符串常量(1、3)intx=1;inty=3;intz=x+y; 对于x++和++x虽然都是自......
  • 空中滑步2.0的理解
    https://www.bilibili.com/video/BV1aC4y1A7Kn/?spm_id_from=333.788.recommend_more_video.4&;vd_source=d68ed178f151e80fea1e02efd205802c这是原始地址.感觉教的很好. 1.上来右脚前右方向滑动. 2.保持右脚抬起状态,同时左脚跳到前面 3.左脚刚刚跳到挡住右脚的......
  • 深入理解虚函数
    深入理解虚函数什么是虚函数我们知道面向对象有三大特性,封装、继承、多态,封装和继承就不多说了,大家比较常用,即使你是写Python的也会用到,但是多态就比较复杂了,在C++里,虚函数是实现多态的一个强大的武器。多态在一些设计模式里比较重要,如模板模式,可以多个不同的模板来呈现同一个......
  • 深入理解Async/Await:从原理到实践的JavaScript异步编程指南
    理解async/await的原理和使用方法是理解现代JavaScript异步编程的关键。这里我会提供一个详细的实例,涵盖原理、流程、使用方法以及一些注意事项。代码注释会尽量详尽,确保你理解每个步骤。实例:使用async/await进行异步操作<!DOCTYPEhtml><htmllang="en"><head><metacha......
  • 软考架构师(1)——计算机组成与体系结构
    一:计算机系统概述1:计算机发展历程2:结构(1)冯诺依曼机:由运算器,控制器,存储器,输入,输出五部分组成,以运算器为中心(2)计算机层次结构:应用程序-高级语言-汇编语言-操作系统-指令集架构层-微代码层-硬件逻辑层3:分类单指令单数据流:冯诺依曼体系结构单指令多数据流:向量处理器多指令单......
  • AOP-@Around环绕增强-理解问题-测试-记录
    来源自定义注解测试切面环绕时,接口测试返回空白。理解关键在于:环绕增强后走的是切面类中的方法,你不给返回值(习惯void)就是空白=-=。@Around它可以包围一个方法或函数的执行,并在执行前后提供额外的逻辑。使用@Around注解,你可以定义一个通知(advice),该通知在目标方法执行之前和......
  • Java函数式接口再理解
    Java函数式接口再理解前言这篇文章主要是我个人对函数式接口的再理解,若有理解偏差或考虑不周的地方,欢迎批评指出,共同进步!这里做下记录,以便日后遗忘查阅;目录目录Java函数式接口再理解前言目录一、什么是函数式接口①概述②一个标准的函数式接口③举例感受函数式接口的作......
  • 记录--组件阅后即焚?挂载即卸载!看完你就理解了
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助前言上家公司有个需求是批量导出学生的二维码,我一想这简单啊,不就是先批量获取学生数据,然后根据QRcode生成二维码,然后在用html2canvas导出成图片嘛。由于公司工具库有现成的生成压缩包方法,我只需要获得对应的图片b......