1.简介
Microservices体系结构是不断地增长.它带来了很多好处,特别是相对于过时的整体架构而言。另一方面,在开发一个使用微服务的项目时,会遇到很多挑战。最重要的关注点之一是数据库设计。谈到数据设计,有两个关键问题。如何组织数据以及在哪里存储数据?
在本教程中,我们将尝试回答这些问题。
2.每服务数据库
在使用微服务架构时,有两种主要的数据库组织方法:
- 每服务一个数据库
- 共享数据库
在本节中,我们将描述第一个。
2.1.基本面
根据定义,微服务在开发和部署方面应该是松散耦合的、可伸缩的、独立的.因此,每个服务使用一个数据库是首选的方法,因为它完全满足了这些需求。让我们看看它是什么样子的:
这个想法很简单。每个微服务都有自己的数据存储(整个模式或一个表)。其他服务不能访问它们不拥有的数据存储。这样的解决方案带来了很多好处。
首先,对单个数据库的更改不会影响其他服务。因此,应用程序中不存在单点故障。可以说,应用比较多有弹性的.
其次,单个数据存储更容易扩展.此外,域的数据被封装在微服务中。因此,从整体上理解服务的数据更容易。这对于开发团队的新成员来说尤其重要。让他们完全了解他们所负责的领域将花费更少的时间和精力。
最后,使用每个服务的数据库,我们可以使用多语言持久性。这意味着我们可以为不同的微服务使用不同的数据库技术。因此,一个服务可能使用SQL数据库,而另一个使用SQL数据库NoSQL数据库。该特性允许根据服务需求和功能使用最高效的数据库。
2.2.缺点
尽管有这些好处,但每个服务一个数据库的方法仍然存在一些严重的缺点和挑战。正如我们前面提到的,每个微服务只能直接访问自己的数据存储。因此,服务需要一种通信方法来交换数据。因此,每个服务必须提供一个清晰的API。
因此,在通信失败的情况下,需要一个故障保护机制.假设我们将付款请求从服务A发送到服务b。服务A等待响应,以便根据结果执行适当的操作。在此期间,服务B下线。我们需要处理这个情况,并在B重新上线后通知服务A结果。雷竞技app官网网站的断路器机制可以帮助解决这个问题。
下一个重要的问题是交易.跨微服务跨越事务会对一致性和原子性产生负面影响。一个类似的缺陷与复杂的查询有关。没有一种简单的方法可以在多个数据存储上执行连接查询。
最后,如果出现问题,跨微服务的数据相关操作可能很难调试。
3.共享数据库
共享数据库被认为是反模式。尽管,这是有争议的。重点是当使用共享数据库时,微服务将失去其核心属性:可伸缩性、弹性和独立性.因此,共享数据库很少用于微服务。
当共享数据库似乎是微服务项目的最佳选择时,我们应该重新考虑是否真的需要微服务。也许巨石是更好的选择。让我们看看共享数据库的方法是怎样的:
在微服务中使用共享数据库的用例并不常见。一个例子是将整体迁移到微服务时的临时状态。与单个服务相比,共享数据库的主要好处是事务管理。不需要在服务上跨事务。
此外,数据是完全受限的,并且保留了适当的辐射。随后,冗余度降低。我们可以很容易地使用连接执行复杂的查询。
另一个重要的事情是不需要在微服务之间交换存储的数据。因此,API被简化了,即使通信失败,数据和状态的一致性也没有问题。不过也有一些严重的缺陷。
具有共享数据库的微服务不容易扩展.更重要的是,数据库将是单点故障。与数据库相关的更改可能会影响多个服务。此外,微服务在开发和部署方面不会是独立的,因为它们连接到同一个数据库并在同一个数据库上操作。
这种模式可以在以下情况下考虑:
- 应该保留现有的数据存储
- 现有的数据层代码库不应更改
- 事务对应用程序至关重要
4.数据相关模式
在微服务体系结构中,有多种模式可用于管理数据。在本节中,我们将简要介绍一些基本功能。
4.1.传奇模式
我们前面提到过,跨微服务的事务跨越可能会有问题。简单地说,只有当所有相关服务成功地执行它们自己的部分时,事务才会成功。如果一个服务失败,整个事务都应该失败。此外,在这种情况下,已经完成其职责的服务应该回滚更改。
一般来说,这就是传奇模式的作用。的传奇模式本地事务序列是否代表单个分布式事务.每个服务执行一个本地事务。如果本地事务成功结束,则发布事件或消息,触发序列中的下一个本地事务。在失败的情况下,saga提供回滚更改的补偿事务。
有两种类型的saga模式实现:
- 编配——中央控制器(编配器)管理微服务之间的所有交互
- 编排-分散的广播事件技术
4.2.CQRS
CQRS(命令查询责任隔离)帮助实现另一个重要特性:从多个数据存储中查询相关数据。此外,它通过分离关注点简化了业务逻辑的复杂性。此外,它还有助于微服务的可伸缩性。
这个想法很简单。我们将数据层与业务逻辑层分离。而且,类只能写入数据库(命令)或从数据库读取(查询)。因此,单个类不能同时做这两件事。这种方法有很多好处。代码更清晰,更容易维护或扩展。不同的组件可以分别进行优化、开发,尤其重要的是可以进行扩展。
随后,组件是松散耦合的,并且工作可以在开发人员或团队之间有效地分割。最后,将应用程序划分为组件更容易测试。方法的实现没有一种正确的方法CQRS模式。实现可以基于领域、需求、框架、项目的实际状态等。CQRS通常与事件的采购模式。让我们来描述一下。
4.3.事件的采购
许多现代应用程序都依赖于事件来实现各种目的。例如,如前所述,以saga序列排列的服务原子地更新数据库并发布事件或消息。事件源利用应用程序事件。
事件源是一种通过持久化状态变化事件来表示状态的技术.每当业务实体发生更改时,事件都会持久化在事件存储中。
顾名思义,事件站点是一个事件数据库。它可以是SQL、NoSQL或任何适合项目的其他方式。此外,事件存储可以充当消息代理。所有感兴趣的组件都订阅它。当事件被持久化时,事件存储区将信息传递给所有订阅者。发布事件是一个单一的原子操作。因此,它提供了跨微服务的数据库操作的可靠性和原子性。
此外,它还创建了一个完整的审计日志。在出现任何问题或错误时,很容易研究状态变化并最终恢复有效状态。因此,调试不那么复杂。此外,事件源可以避免面向对象数据和关系数据之间的阻抗不匹配.总而言之,事件源在微服务架构或其他架构中有很大的帮助事件驱动的应用程序。
5.如何选择数据库?
在微服务中规划数据库设计的第一步是选择模型.我们已经提到了每个服务的数据库和共享数据库模型。此外,我们还考虑了它们的优点、缺点和常见用例。
第二步是选择对项目或服务最有效的特定数据库技术(或多种技术)。为此,我们需要考虑一些属性。
第一个重要参数是读性能。读取性能可以是每秒的操作次数,也可以是读取查询的速度。与电子商务、客户关系管理、银行软件相关的应用程序或服务通常包含需要快速和频繁获取数据的功能。
第二个重要的属性是写性能。它和前一个相似。在这种情况下,我们只是向数据库写入数据,而不是从中读取数据。如果服务需要持久化大量数据,甚至存储大的blobs,这可以是一个核心参数。
下一个是延迟。它是用户操作和服务器响应之间的延迟。这在与用户体验相关的组件中尤其重要。直播应用程序或实时游戏就是很好的例子。
另一个重要属性是资源效率。通常,消耗的资源越少越好。它可能会导致更快的执行,减少主机负载,以及最终的成本(取决于平台)。
最后但并非最不重要的是,我们应该考虑配置效率。一般来说,数据库是如何影响微服务的开发、部署和测试的。正如我们之前提到的,微服务的独立性在这些方面是非常重要的。
5.1.SQL与NoSQL
通常,项目或服务会考虑两种技术:SQL和NoSQL。基本上,它更复杂,特别是涉及到NoSQL时。有各种各样的NoSQL数据库实现,即。不过,在本文中,我们不会详细介绍数据库的底层实现。让我们从总体上比较SQL和NoSQL。
6.结论
在本文中,我们详细阐述了微服务架构中的数据库设计。正如我们所看到的,这是一个非常复杂的任务。所有要素都应仔细计划,并适合项目的需要,以最大限度地提高其效率。