Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >微服务架构中的数据库设计

微服务架构中的数据库设计

作者头像
jack.yang
发布于 2025-04-05 07:40:57
发布于 2025-04-05 07:40:57
1270
举报

1. 简介

微服务架构在不断发展。它带来了很多好处,尤其是相对于过时的单体架构。另一方面,使用微服务开发项目时存在多种挑战。最重要的问题之一是数据库设计。在数据设计方面,有两个关键问题。如何组织数据以及在哪里存储数据?

在本教程中,我们将尝试回答它们。

2. 每个服务的数据库

使用微服务体系结构时,有两个主要选项可用于组织数据库:

  1. 每个服务的数据库
  2. 共享数据库

在本节中,我们将介绍第一个。

2.1. 基础知识

根据定义,微服务在开发和部署方面应该是松散耦合、可扩展和独立的。因此,每个服务的数据库是首选方法,因为它完全满足这些要求。让我们看看它的外观:

这个想法很简单。每个微服务都有自己的数据存储(整个架构或表)。其他服务无法访问它们不拥有的数据存储。这样的解决方案带来了很多好处。

首先,对单个数据库的更改不会影响其他服务。因此,应用程序中不存在单点故障。可以这么说,该应用程序更具弹性。

其次,单个数据存储更易于扩展。此外,域的数据封装在微服务中。因此,从整体上理解服务及其数据更容易。这对于开发团队的新成员尤其重要。他们将花费更少的时间和精力来完全了解他们负责的领域。

最后,对于每个服务的数据库,我们能够使用多语言持久性。这意味着我们可以对不同的微服务使用不同的数据库技术。因此,一个服务可能使用 SQL 数据库,另一个服务使用NoSQL数据库。该功能允许根据服务要求和功能使用最有效的数据库。

2.2. 缺点

尽管有所有这些好处,但每个服务方法的数据库也存在一些严重的缺点和挑战。如前所述,每个微服务只能直接访问自己的数据存储。因此,服务需要一种通信方法来交换数据。因此,每个服务都必须提供清晰的 API

因此,需要一种故障保护机制,以防通信失败。假设我们将付款请求从服务 A 发送到服务 B。服务 A 等待响应以根据结果执行适当的操作。在此期间,服务 B 将脱机。我们需要处理这种情况,并在 B 重新联机时通知服务 A 结果。断路器机制可以在这里提供帮助。

下一个重要问题是交易。跨微服务跨越事务可能会对一致性和原子性产生负面影响。类似的缺点与复杂查询有关。没有一种简单的方法可以在多个数据存储上执行联接查询。

最后,如果出现任何问题,跨微服务的数据相关操作可能难以调试。

3. 共享数据库

共享数据库被视为反模式。虽然,这是值得商榷的。关键是,使用共享数据库时,微服务会失去其核心属性:可伸缩性、弹性和独立性。因此,共享数据库很少与微服务一起使用。

当共享数据库似乎是微服务项目的最佳选择时,我们应该重新考虑是否真的需要微服务。也许巨石会是更好的选择。让我们看看共享数据库方法是什么样子的:

将共享数据库与微服务一起使用的用例并不常见。例如,将整体架构迁移到微服务时的临时状态。共享数据库相对于每个服务的主要优点是事务管理。无需跨越服务上的事务。

此外,数据完全受限,并保留适当的辐射。随后,冗余减少。我们可以轻松地使用连接执行复杂的查询。

另一个重要的事情是无需在微服务之间交换存储的数据。因此,API 得到了简化,并且在通信失败的情况下数据和状态的一致性没有问题。不过也有一些严重的缺点。

具有共享数据库的微服务无法轻松扩展。更重要的是,数据库将是单点故障。与数据库相关的更改可能会影响多个服务。此外,微服务在开发和部署方面不会独立,因为它们连接到同一数据库并在同一数据库上运行。

在以下情况下可以考虑此模式:

  • 应保留现有数据存储
  • 不应更改现有数据层代码库
  • 事务对应用程序至关重要

4. 数据相关模式

有多种模式可用于管理微服务体系结构中的数据。在本节中,我们将简要介绍基本内容。

4.1. Saga模式

我们之前提到过,跨微服务的事务可能会有问题。简单来说,只有当所有相关服务都成功执行自己的部分时,事务才会成功。如果一个服务出现故障,整个事务应失败。此外,在这种情况下,已经尽其所能的服务应该回滚更改。

一般来说,这就是传奇模式的原因。Saga 模式是表示单个分布式事务的一系列本地事务。每个服务执行一个本地事务。如果本地事务成功结束,则会发布触发序列中下一个本地事务的事件或消息。如果发生故障,saga 会提供回滚更改的补偿事务。

有两种类型的实现 saga 模式:

  • 编排 – 中央控制器(编排器)管理微服务之间的所有交互
  • 编舞 – 广播活动的分散技术

4.2. CQRS

CQRS(命令查询责任分离)有助于实现另一个重要功能:从多个数据存储查询相关数据。此外,它通过分离关注点来简化业务逻辑的复杂性。此外,它还有助于微服务的可伸缩性。

这个想法很简单。我们将数据层与业务逻辑层分开。此外,类只能写入数据库(命令)或从中读取(查询)。因此,单个类不能同时做到这两点。这种方法带来了许多好处。代码更清晰,更易于维护或扩展。不同的组件可以单独优化、开发,尤其重要的是,可以扩展。

随后,组件松散耦合,工作可以在开发人员或团队之间有效地分配。最后,划分为组件的应用程序更易于测试。没有一种正确的方法来实现CQRS模式。实现可以基于领域、需求、框架、项目的实际状态等。CQRS 通常与事件溯源模式一起使用。让我们描述一下那个。

4.3. 事件溯源

许多现代应用程序出于各种目的依赖于事件。例如,如前所述,saga 序列中的服务以原子方式更新数据库并发布事件或消息。事件溯源利用应用程序事件。

事件溯源是一种通过持久化状态更改事件来表示状态的技术。每次业务实体更改时,事件都会保留在事件存储中。

顾名思义,事件站点是事件的数据库。它可以是SQL,NoSQL或任何其他适合项目的方式。此外,事件存储可以充当消息代理。所有感兴趣的组件都订阅它。持久保存事件时,事件存储会将信息传递给所有订阅者。发布事件是单个原子操作。因此,它提供了跨微服务的数据库操作的可靠性和原子性。

此外,它还会创建一个完整的审核日志。如果出现任何问题或错误,可以轻松研究状态更改并最终恢复有效状态。因此,调试不太复杂。此外,事件溯源可以避免面向对象数据和关系数据之间的阻抗不匹配。总而言之,事件溯源在微服务架构或任何事件驱动的应用程序中都有很大的帮助。

5. 如何选择数据库?

在微服务中规划数据库设计的第一步是选择模型。我们已经提到了每个服务的数据库和共享数据库模型。此外,我们还考虑了它们的优缺点和常见用例。

第二步是选择对项目或服务最有效的特定数据库技术(或技术)。为此,我们需要考虑一些属性。

第一个重要参数是读取性能。读取性能可以是每秒的操作数或提取查询的速度。与电子商务,CRM,银行软件相关的应用程序或服务通常包含需要快速,经常获取数据的功能。

第二个重要属性是写入性能。它与前一个相似。只是,在这种情况下,我们是在写入数据库,而不是从中读取。如果服务需要保留大量数据,甚至存储大型 blob,这可能是一个核心参数。

下一个是延迟。这是用户操作和服务器响应之间的延迟。这在与用户体验相关的组件中尤其重要。很好的例子是实时流媒体应用程序或实时游戏。

另一个重要属性是资源效率。通常,消耗的资源越少越好。这可能会导致更快的执行速度、减少主机负载和最终成本,具体取决于平台。

最后但并非最不重要的一点是,我们应该考虑配置效率。通常,它是数据库如何影响微服务的开发、部署和测试。正如我们之前已经提到的,微服务在这些方面的独立性非常重要。

5.1.SQL vs. NoSQL

大多数情况下,项目或服务会考虑两种技术:SQL 和 NoSQL。基本上,它更复杂,特别是当涉及到NoSQL时。有各种各样的NoSQL数据库实现,即。虽然,在本文中,我们不会详细说明数据库的低级实现。让我们比较一下SQL和NoSQL。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2014-09-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
微服务架构10个最重要的设计模式
自从软件开发的早期(1960年代)以来,解决大型软件系统中的复杂性一直是一项艰巨的任务。多年来,软件工程师和架构师为解决软件系统的复杂性进行了许多尝试:David Parnas的模块化和信息隐藏(1972),Edsger W. Dijkstra的关注分离(1974),面向服务的体系结构(1998)。
肉眼品世界
2021/01/06
1.1K0
微服务架构10个最重要的设计模式
微服务架构中10个常用的设计模式
从软件开发早期(1960 年代)开始,应对大型软件系统中的复杂性一直是一项令人生畏的任务。多年来为了应对软件系统的复杂性,软件工程师和架构师们做了许多尝试:David Parnas 的模块化和封装 (1972), Edsger W. Dijkstra (1974)的关注点分离以及 SOA(1988)。
架构之家
2022/07/12
9910
微服务架构中10个常用的设计模式
微服务架构:10个实用设计模式
从软件开发早期(1960 年代)开始,应对大型软件系统中的复杂性一直是一项令人生畏的任务。多年来为了应对软件系统的复杂性,软件工程师和架构师们做了许多尝试:David Parnas 的模块化和封装 (1972), Edsger W. Dijkstra (1974)的关注点分离以及 SOA(1988)。
程序员皮皮林
2024/11/21
6580
微服务架构:10个实用设计模式
微服务架构及其最重要的10个设计模式
微服务架构,独享数据库、事件驱动、CQRS、Saga、BFF、API 网关、Strangler、断路器、外部化配置、消费端驱动的契约测试
深度学习与Python
2021/01/06
1.3K0
「微服务架构」微服务架构中的数据一致性
在微服务中,一个逻辑上原子操作可以经常跨越多个微服务。即使是单片系统也可能使用多个数据库或消息传递解决方案。使用多个独立的数据存储解决方案,如果其中一个分布式流程参与者出现故障,我们就会面临数据不一致的风险 - 例如在未下订单的情况下向客户收费或未通知客户订单成功。在本文中,我想分享一些我为使微服务之间的数据最终保持一致而学到的技术。
架构师研究会
2019/05/06
1.1K0
「微服务架构」微服务架构中的数据一致性
事件驱动的微服务数据管理
微服务和分布式数据管理的问题 单体应用程序通常具有单个关系数据库。 使用关系数据库的一个主要优点是您的应用程序可以使用ACID事务,这些事务提供了一些重要的保证: 原子性 - 原子性变化 一致性 - 数据库的状态总是一致的 隔离 ----即使并发执行事务,它似乎是连续执行的 持久性 - 一旦交易已经提交,它不会被撤销 因此,您的应用程序可以简单地开始事务,更改(插入,更新和删除)多个行,并提交事务。 使用关系数据库的另一大优点是它提供SQL,它是一种丰
用户1263954
2018/01/30
1.8K0
事件驱动的微服务数据管理
微服务数据一致性的演进:SAGA,CQRS,Event Sourcing的由来和局限
原题:Data consistency in microservices architecture
yuanyi928
2018/11/30
2.5K0
微服务数据一致性的演进:SAGA,CQRS,Event Sourcing的由来和局限
微服务架构设计和其设计模式介绍
之前在推上看到一张图片,感觉总结的挺好,在我也展开总结了之后发现了这张图的原文,所以整体翻译了一遍。还是非常有价值的,值得学习。
黑光技术
2023/02/23
8750
微服务架构设计和其设计模式介绍
微服务架构及设计模式
点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路,很肝~ 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件 TCC-Transaction
芋道源码
2022/06/14
5760
微服务架构及设计模式
微服务中数据CQRS操作的事务处理
本文的主要主题是描述如何使用事件源(event sourcing)和CQRS将事件驱动的体系结构与微服务集成。
程序你好
2019/03/08
1.3K0
微服务的几种设计模式
定义:微服务架构是将软件系统分解为可独立部署的自治单元,这些单元通过轻量级、与语言无关的方式进行通信,并共同实现业务目标
素履coder
2022/02/17
9390
微服务的几种设计模式
模式:每个服务一个数据库
如用微服务架构模式开发一个在线商店应用程序。大多数服务需要在某种数据库中持久化数据。如,订单服务存储订单信息,而客户服务存储客户信息。
JavaEdge
2025/06/01
760
模式:每个服务一个数据库
微服务的设计模式
微服务架构已成为现代应用程序开发的事实上的选择。虽然它解决了某些问题,但它不是灵丹妙药。它有几个缺点,在使用这种架构时,必须解决许多问题。这就需要学习这些问题中的常见模式并用可重用的解决方案来解决它们。因此,需要讨论微服务的设计模式。在深入研究设计模式之前,我们需要了解微服务架构的构建原则:
终码一生
2022/04/15
4790
【微服务架构】一文读懂单片到微服务架构的模式和最佳实践
在本文中,我们将学习如何使用设计模式、原则和最佳实践来设计微服务架构。我们将使用正确的架构设计模式和技术。 在本文结束时,您将了解如何在微服务分布式架构上设计系统以实现高可用性、高可扩展性、低延迟和对网络故障的弹性,从而处理数百万个请求。 Event-Driven Architecture 本课程将是软件架构设计的旅程,逐步将架构单片演变为事件驱动的微服务。 我们将从设计处理少量请求的电子商务整体架构开始软件架构的基础知识。 Journey of Design Architectures 之后逐步演
架构师研究会
2022/03/30
9670
微服务:如何拆分共享数据库?
在分解单体应用程序到微服务体系架构时,重点考虑独立数据库拆分是很重要的。您需要想出一个可靠的策略,将您的数据库分割为多个与应用程序对齐的小型数据库。简而言之,您需要将您的应用程序/服务从使用单一的共享数据库中拆分出来。
程序你好
2018/10/18
3.4K0
微服务:如何拆分共享数据库?
如何快速搞定微服务架构?
如今,微服务架构已经成为了现代应用开发的首选。虽然它能够解决大部分的程序问题,但是它并非一颗百试不爽的“银弹”。
Java架构技术
2018/11/16
5850
10个微服务设计模式
微服务设计模式是一种指导微服务架构设计和开发的一系列原则和实践。微服务设计模式的目的是为了解决微服务架构中遇到的一些常见的问题和挑战,比如服务划分、服务通信、服务治理、服务测试等。微服务设计模式可以帮助我们构建出高效、可靠、可扩展、可维护的微服务系统。
wayn
2023/08/22
6570
[译] 微服务的设计模式
微服务架构已经成为现代应用程序开发中公认的技术选择。尽管它解决了某些问题,但不是灵丹妙药。它有几个缺点,使用这种体系架构时,还需要解决许多问题。这就需要学习这些问题的通用模式,并通过可重用的解决方案来解决它们。因此,有必要讨论微服务的设计模式。在深入研究设计模式之前,我们需要了解微服务架构的构建原理: 1.可扩展性 2.可用性 3.弹性 4.独立自治性 5.去中心化治理 6.失败隔离 7.自动配置 8.通过DevOps持续交付
东溪陈姓少年
2020/08/06
6810
微服务架构设计概要及CAP、BASE理论应用体现
- 根据业务功能和边界,将整个系统划分为多个有明确职责的微服务。每个微服务应专注于单一业务领域,如用户管理、订单处理、库存管理等,实现高内聚、低耦合。
用户7353950
2024/04/30
2510
微服务架构设计概要及CAP、BASE理论应用体现
5、事件驱动数据管理
本书主要介绍如何使用微服务构建应用程序,这是本书的第五章。第一章介绍了微服务架构模式,讨论了使用微服务的优点与缺点。第二和第三章描述了微服务架构内通信方式的对比。第四章探讨了与服务发现相关的内容。在本章中,我们稍微做了点调整,研究微服务架构中出现的分布式数据管理问题。
Java架构师历程
2018/09/26
1.1K0
5、事件驱动数据管理
相关推荐
微服务架构10个最重要的设计模式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档