微服务:如何拆分共享数据库?

在分解单体应用程序到微服务体系架构时,重点考虑独立数据库拆分是很重要的。您需要想出一个可靠的策略,将您的数据库分割为多个与应用程序对齐的小型数据库。简而言之,您需要将您的应用程序/服务从使用单一的共享数据库中拆分出来。

您应该以这样一种方式设计您的微服务体系结构,即每个单独的微服务都有自己的独立数据库和自己的领域数据。这将允许您独立部署和扩展微服务。

传统的应用程序只有一个共享的数据库,数据通常在不同的组件之间共享。我们都使用过这样的数据库,并且发现开发更简单,因为数据存储在一个存储库中。但是这种数据库设计存在很多问题。

共享单个数据缺点

1、为多个服务提供单个数据库的传统设计造成了紧密耦合,并且无法独立部署服务更改。如果有多个服务访问同一个数据库,那么任何模式更改都需要在所有服务之间进行协调,这在现实世界中可能会导致部署更改的额外工作和延迟。

2、使用这种设计很难扩展单个服务,因为您只能选择扩展整个单块数据库。

3、提高应用程序性能成为一个挑战。使用一个共享数据库,在一段时间内,您最终会得到一个巨大的表。这使得数据检索变得困难,因为您必须连接多个大型表来获取所需的数据。

4、大多数情况下,关系存储是作为整体数据库的。这限制了所有服务使用关系数据库。然而,在某些情况下,无sql数据存储可能更适合您的服务,因此您不希望与集中式数据存储紧密耦合。

如何在微服务体系结构中管理数据

每个微服务都应该有自己的数据库,并且应该包含与该微服务本身相关的数据。这将允许您独立部署单个服务。单个团队现在可以拥有相应微服务的数据库。

微服务应该遵循领域驱动设计并具有有限的上下文。您需要基于领域来设计应用程序,领域与应用程序的功能是一致的。这就像遵循代码优先方法而不是数据优先方法一样——因此您首先设计模型。这是一种与传统的在开始处理新需求或新项目时首先设计数据库表的方法完全不同的方法。您应该始终努力保持业务模型的完整性。

在设计数据库时,查看应用程序功能并确定它是否需要关系模式。如果NoSQL数据库符合您的标准,请保持对它的开放态度。

数据库应该被视为每个微服务的私有数据库。没有其他微服务可以直接修改存储在另一个微服务中的数据库中的数据。

在下图中,订单服务不能直接更新定价数据库,只能通过微服务API访问。这有助于您实现不同服务之间的一致性。

事件驱动架构是在不同服务之间维护数据一致性的通用模式。与等待ACID事务完成处理并占用系统资源不同,您可以通过将消息卸载到队列中来提高应用程序的可用性和性能。这提供了服务之间的松散耦合。

队列的消息可以被视为事件,并且可以遵循发布-子模型。发布者发布消息,而不知道已经订阅了事件流的使用者。体系结构中组件之间的松散耦合可以构建高度可伸缩的分布式系统。

在从单体架构到微服务的过程中处理数据库更改是一项挑战。在本文中,我们了解了单体数据库设计的问题,以及如何在微服务体系结构中处理数据。如果您有任何问题,请让我知道,我很乐意进一步讨论。

For more information about Architecture for Containerized Applications, please download the free ebook provided by Microsoft here.

原文发布于微信公众号 - 程序你好(codinghello)

原文发表时间:2018-09-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏草根专栏

Python数据分析(二): Numpy技巧 (4/4)

numpy、pandas、matplotlib(+seaborn)是python数据分析/机器学习的基本工具。 numpy的内容特别丰富,我这里只能介绍一下比较...

3219
来自专栏腾讯云商业智能分析团队的专栏

创建数据集模块常见设置

创建数据集的主要功能是从数据库查询出所需的数据,从而进行数据分析。在创建数据集处,可以对数据进行一些简单的处理,如数据级别的权限设置,字段信息修改,字段管理等。

1851
来自专栏开源项目

十分钟搞定自动化构建 | 码云周刊第 57 期

1. 项目名称:轻量级跨平台自动构建工具 xmake ? 项目简介:XMake 是一个基于 Lua 的轻量级跨平台自动构建工具,支持在各种主流平台上构建项目。...

3439
来自专栏chokwin的专栏

使用MongoDB提高企业的IT性能

本文的目标读者是正在为他们的IT系统寻找开源应用的开发人员和架构师。作者描述了一个实际的企业情况,他们在工作流程中采用了MongoDB来加速流程。

2168
来自专栏企鹅号快讯

周集:好用的工具和网站

上次提到的软件下载的页面已经写完了,接下来就是往页面中丰富内容,我会放一些自己用过的比较好用的软件工具,下载地址,有官方网站的我会放上官方网站的地址,没有的话,...

2279
来自专栏洞链

如何理解分布式与集群,二者区别是什么?

分布式是指不同的业务分布在不同的地方,集群指的是将几台服务器集中在一起,实现同一业务。 白话理解的话,比如公司项目上线初期(举例电子商务网站)

1523
来自专栏开源项目

码云推荐 | 运维脚本工具库 kjyw

快捷运维kjyw,运维脚本工具库,主要功能实现快速安装nginx、mysql、php、redis等,运维经常使用的脚本。 ? 项目简介 ? 快捷运维 kjyw,...

35610
来自专栏Rainbond开源「容器云平台」

开源PaaS Rainbond v3.6.0正式发布,Service Mesh开箱即用

Service Mesh微服务架构是开源PaaS Rainbond在v3.6.0版本中的重点新增特性,可以开箱即用。

3413
来自专栏哲学驱动设计

Rafy 领域实体框架简介

按照最新的功能,更新了最新版的《Rafy 领域实体框架的介绍》,内容如下: 本文包含以下章节: 简介 特点 优势 简介 Rafy 领域实体框架是一个轻量级 OR...

2077
来自专栏python学习之旅

loadrunner笔记(一):下载、安装loadrunner和负载压力测试概念说明

2095

扫码关注云+社区

领取腾讯云代金券