CQRS 和 Event Sourcing 的区别2025年3月7日 | 阅读6分钟 事件溯源 是一种编程方式,它似乎为回应上述声明提供了希望,但也存在技术世界混乱的现状。其次,事件溯源可能不像其他数据处理方式那样广为人知,但它有一种可以极大地丰富系统的视角。 CQRS 代表命令查询职责分离(Command Question Duty Segregation),它是一种设计模式,用于分离系统中数据的读写职责。在全球 CQRS 软件设计中,这种形状分为几个组件。第一部分用于更新和删除(写版本)。第二部分是读取,查询模型只负责读取。CQRS 的工作方式与传统的 CRUD 方法(只使用单个数据库)大不相同,相反,CQRS 将使用两个 数据库,或者至少是分开的表。双方都设计用于读写运动数据。CQRS 可以与事件溯源结合使用来解决问题。在这种架构中,通过命令触发的事件将被记录在事件存储中。当事件被转换为适合模型时,它们会被发布到一个单独的查询数据存储中。这种方法在解决 CQRS 引起的一些可伸缩性问题方面特别有趣。因此,本文旨在讨论 CQRS 与事件溯源的区别。但是,在争论是什么区分了这两个概念之前,我们应该回顾一下 CQRS 和事件溯源的优缺点。 什么是事件溯源?CQRS 通常不与事件溯源配对,而事件溯源经常与 CQRS 一起使用。尽管这两种方式都有美好的目标和功能,但它们可以很好地互补。在事件溯源中,机器信息的*.main*文件被保存为捕获事件并调整其状态的事件日志。在 CQRS 的情况下,一个事件溯源的数据库结构由所有成功完成的命令的按时间顺序排列的存储库组成。 与主要在其数据库中保存命令效果记录的系统相比,事件溯源的系统遵循一种不同的方法。例如,在一个传统的博客平台上,数据库保存了一组文章,每次更新命令都会更改特定的条目。相反,一个事件溯源的系统存储了一个名为“文章活动”的表,该表记录了每一个创建、修改和删除命令作为单独条目。 事件溯源的优点事件溯源的几个优点如下: 事件溯源的主要优点之一是能够在任何给定时间通过重放从头开始尽可能多的指令来重新创建设备的状态。如果指令以某种方式准备好存储设备(带有 oldValue 和 newValue 对),我们可以随时平滑地播放和倒带命令流。 此外,我们可以对活动进行有逻辑的重处理,以生成数据的替代视图,根据*.minute*数据计算更改,或估算最多活跃发帖者的数量。 事件溯源的缺点事件溯源的几个缺点如下: 事件溯源的缺点是,要确定设备的状态,我们需要从头开始重放事件。我们通常通过使用 CQRS 模式来生成摘要来处理这个问题。事件溯源的一个常见例子是银行账户。在一个*.real*银行系统中,一个账户不是保存在一个只有余额区域的表中的单个条目。相反,有一个记录了对该账户进行的所有*.credit*和*.debit*交易的整个银行的分类账。 什么是 CQRS?我们了解到,事件溯源提供了一种数据存储方法,它维护事件记录,而不是依赖于会修改、访问和删除的传统表。此外,我们知道通过事件溯源检索数据需要一个额外的过程。 本质上,我们必须输入所有事件,然后采取额外的步骤来按时间顺序对其进行优化,以达到当前状态。这样,我们就可以收集我们的事件,同时转换过程确保您的应用程序逻辑以所需格式获取数据,例如购物车的*.concise*表格表示。 当事件数量很大时,这种设置会出现问题。大量的事件会减慢*.reduction*操作的速度,并消耗比预期更多的*.clock cycles*。虽然对于小型购物车来说这可能不是问题,但如果我们试图对整个银行账户历史记录应用*.chronological reduction*,例如,这可能会非常耗时。 命令查询职责分离 (CQRS) 解决了这个问题。这种方法在数据写入时执行计算,而不是在读取时执行。因此,每次计算*.only once*,无论数据*.later on*访问多少次。 命令和查询想象一下我们有一个简单的博客应用程序,我们想要一个文章的 CRUD API。在一个纯 RESTful API 中,我们会有一个像 /api/article/ 这样的端点,我们可以在其中
当我们创建一个*.writing*时,我们不应该被要求提供所有将从服务器检索到的信息。例如,创建日期或发布状态应由服务器设置,而不是由客户端设置。我们也可能无法访问*.comments*列表或*.views*数量等信息。 主要区别在于简单的 GET 请求格式与更复杂的创建或更新操作。这类似于区分查询和命令。 查询用于从设备或载体检索事实,通常是所有可用信息。命令用于修改信息,在大多数情况下,我们不希望提供所有可读信息,因为我们不拥有它,或者我们不允许修改它。 优点
CQRS 和事件溯源之间的主要区别CQRS 和事件溯源之间有几个主要区别。一些主要区别如下:
|
JavaScript 和 Node.js 编程中的强大而优雅的链式方法允许在单个语句中将多个函数调用链接在一起。这种模式通过消除对大量嵌套结构的需求并简化操作顺序来帮助提高可读性并增强代码的可维护性...
5 分钟阅读
在本文中,我们将讨论 Node.js fs.stat() 方法及其语法、参数和示例。fs.stat() 方法是什么?在 Node.js 中,“fs.stat()”方法是“fs”模块的一部分。它用于获取文件或目录的状态,并提供有关它的信息……
5 分钟阅读
Node.js 和 StatsD 配合良好,可以衡量和监控现代应用程序的性能。开发人员越来越频繁地使用微服务架构和云原生解决方案。可靠的监控工具对于维护系统的功能、可靠性和性能至关重要。Node.js 提供的事件驱动和非阻塞 I/O 范例...
阅读 4 分钟
在 Node.js 中,我们可以使用 process.kill 方法列出所有正在运行的进程,过滤掉 Node.js 进程,然后使用 process.kill 来终止每个已识别的进程。在本文中,我们将讨论如何使用其语法、参数和示例终止 Node.js 中的所有进程。什么是...
阅读 4 分钟
在本文中,我们将学习其语法和示例。介绍:在现代虚拟技术中,从网站访问和获取信息对于许多用途(包括机构智能、自动化以及研究和评估)变得越来越重要。网络抓取是一种以编程方式提取和...
7 分钟阅读
在本文中,我们将讨论 Node.js process.stdout() 属性,包括其语法、参数和示例。Node.js process.stdout() 属性是什么?在 Node. js 中,process.stdout 是每个对象都存在的一个对象属性,并且该概念用于将数据写入标准输出...
阅读 3 分钟
Node.js 是一个高效、跨平台的运行时环境,提供了服务器端的 JavaScript 执行环境。Node.js 在 Google Chrome 浏览器和 V8 JavaScript 虚拟机上执行 JavaScript 代码。Node.js 还以其事件驱动、非阻塞 I/O 模型而闻名,这使得...
阅读 6 分钟
将 FFmpeg 的功能与 Node.js 相结合,以处理各种多媒体活动的音频和视频,可以轻松地自动化*.difficult*过程。本文将引导我们完成在 Node.js 环境中安装和操作 FFmpeg 所需的*.procedures*。什么是 FFmpeg?它是一个*.comprehensive*跨平台解决方案……
7 分钟阅读
在本文中,我们将讨论其工作原理、功能、示例和用例。什么是?node.js 中的 process.finalization.register(ref, callback) 函数是一个新增的全局内置函数。它的作用是执行与对象终止操作相关的工作...
阅读 3 分钟
简介 Node.js 是一项开源、跨平台、服务器端 JavaScript 技术,用于构建高度可扩展的网络应用程序。此外,在文件系统(fs)等基本模块中,有一些用于文件和目录操作的实用程序。作为功能的一个子集,fs-extra 库是一个增强和...
阅读 4 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India