微服务是许多软件项目所提供的许多软件项目所提供的众多好处的首选架构,范围为:
- 服务去耦
- 更快的开发时间
- 更快的发布时间
- 量身定制的数据存储
因此,开发人员可以选择正确的工具和平台,以帮助在每个特定的微服务中提供最佳性能。这样做时要考虑的一个方面是消除在应用程序中使用整体数据存储架构的使用。微服务有利于独立服务组件,每个服务都可以在自己的运行时运行并连接到自己的数据库。
这意味着您鼓励您在微服务之间共享数据,而不是为所有微服务使用广泛的单个数据库,如下所示。
图:微服务体系结构
但是,这提出了一个问题,您应该如何为每个微服务选择正确的(分布式)数据库?
您如何为微服务选择最佳数据库?
要回答这个问题,您需要了解不同类型的数据库以满足不同的目的和要求。
因此,您必须考虑决策过程中的性能,可靠性和数据建模要求之类的因素,以确保您选择正确的数据库。
分布式数据库的CAP定理
重要的是要了解,选择数据库时,必须考虑其一致性,可用性和(网络)分区公差能力。
这也被称为CAP Theorem,至关重要的是要意识到数据库设计中存在折衷方案,其中其中一个将始终受到其他两个因素的影响。简而言之,CAP定理提出,分布式系统中的任何数据库都可以具有以下属性的某种组合:
- (顺序)一致性:满足此属性的分布式数据库将始终从所有DB节点/碎片中返回相同的数据(最新订单数据),这意味着您所有的DB客户端都将获得最新的数据数据不管他们查询的节点如何。
- 可用性:满足此属性保证的分布式数据库,始终从每个可触及的节点及时响应读取请求。
- (网络)分区公差:分布式数据库,即使DB节点之间存在网络断开连接(将DB节点分配为两个或多个网络分区),这些属性可以保证该属性的功能。
这三个因素构成了现代分布式数据库,但是Cap Thororem指出,没有数据库可以满足所有三个特征。任何数据库实施都可以以第三个为代价来选择两个特征。<<<<<<<<<<<<<<<<<<< /p>
分布式数据库因此属于以下组合之一:
- ca(一致性 +可用性):您的数据库可以为所有节点提供最新数据,同时保持高度可用。
- cp(一致性 +分区公差):您的数据库可以为所有节点提供最新数据,并具有很高的弹性对网络错误。
- ap(可用性 +分区公差):您的数据库节点始终及时响应,即使面对网络故障,也可以做出良好的响应。但它不能保证从每个节点返回最后更新的数据。这些数据库采用称为“最终一致性”的原理,其中最终复制了数据,而不是立即复制(最终的一致性是与顺序一致性相比的一种较弱的一致性形式,即CAP定理中的“ C”)。 )。)。
因此,在选择数据库之前,必须了解CAP定理。下表根据其“ CAP定理偏好”展示了一些流行的分布式数据库。
通过评估您的非功能要求,您可以将其用作了解所需的方向的指南。
图:流行数据库中的CAP定理偏好
数据库与服务要求
我已经介绍了上面的主题,但是除了CAP定理外,必须了解,为您的微服务选择正确的数据库最终取决于您的服务要求。这也称为多语言持久性。根据每种服务的要求,您可以在这里利用不同的数据库进行不同的服务。
例如,您的微服务可能是读写或写入的,需要快速缩放或简单的耐用性。因此,必须在决定数据库之前清楚地了解您的要求。
性能(读/写)要求
您可能需要查看的第一个方面是性能。
如果您要建立需要高性能的微服务,则可能需要一个可以满足确切需求的数据库。
例如,假设您是使用API网关和AWS lambda构建微服务。在这种情况下,您的服务可以无限地扩展,因此您需要一个数据库,该数据库可以作为Lambda功能量表进行扩展。如果您不这样做,您将在数据库级服务中创建一个瓶颈,这可能会导致服务间潜伏期和超时错误,因为您的系统无法扩展。
因此,在这种情况下,必须考虑您的服务将处理的IOPS数量(输入/输出操作)。 Here are some typical numbers用于每秒操作:
- 很高 - 超过一百万的IOP
- 高500,000至100万IOPS
- 中度 - 10,000至500,000 IOPS
- 低于10,000 IOPS
因此,在选择数据库之前,必须考虑您将在服务中处理的IOPS。
延迟要求
下一个要查看的要求是延迟。延迟是指服务/写入请求时发生的延迟。
对于延迟,典型数字为:
- 低不到一毫秒
- 中等 - 一到10毫秒
- 高超过10毫秒
如果您要构建需要即时通信的微服务,则可能需要采用低延迟数据库。
例如,假设您正在建模搜索服务:
图:产品搜索服务
理想情况下,无论有效载荷如何,搜索操作都不能花费超过几秒钟。因此,在这种情况下,您需要选择一个支持在定义期间提供响应的数据库。
数据建模要求
选择微服务而不是整体的最重要优势之一是开发人员可以为不同服务定义不同的数据模型。典型的微服务体系结构可能包括包括键值,图形,时间序列,JSON,流,搜索引擎等的数据模型。
例如,如果您使用微服务对电子商务应用进行建模,则可以具有以下数据要求:
图:服务的公制要求
您的某些服务需要低延迟的读取性能很高,而另一些则可以忍受中等水平的延迟。
这些服务中的每一个都具有以下数据模型:
图:建模微服务数据结构
例如,DynamoDB是高速缓存服务器的有力候选者,因为它需要非常高的读取性能(小于1 ms),并且具有低延迟的高写入性能。
您应该根据可接受的延迟和IOPS对微服务的性能要求进行形式化,以确保您为微服务选择正确的数据库。
为微服务选择正确的数据库的技巧是什么?##
提示#1-考虑帽定理
选择数据库时,查看其工作原理并确定其在CAP定理中的位置。仅在数据库中达到您在CAP定理中的期望时才继续进行,因为始终会有权衡。
提示#2-预先收集所有要求
在选择数据库之前,必须了解微服务的要求。如果您的微服务量很高,但不重读,则可以考虑使用两个数据库(一个用于阅读,一个用于写作),并使用最终的一致性和CQRS (Command Query Responsibility Segregation) pattern与他们进行交流。
。除此之外,还可以深入了解可接受的延迟,而您的数据库将需要。
提示#3-使用放大ððð
考虑使用诸如Amplication之类的工具来构建微服务。放大,您只需单击几下引导和构建微服务,同时允许您根据您的要求选择特定的特定数据库,例如PostgreSQL,MySQL和MongoDB,具体取决于您的要求。将数据库交换为另一个只有四次单击。这使您可以非常快速地尝试和测试不同的数据库,这可以改变游戏规则,用于测试每个服务的多个数据库,直到找到最合适的数据库。
。pro提示ðâtum-放大器中的数据库实现以plugin的形式出现,如果您想进行更多尝试,则可以轻松地获取其他数据库的write your own插件。
>包起来
微服务因其支持松散耦合服务的能力而获得了与整体相比的重要优势,在这种情况下,可以隔离开发,测试和维护每种服务,同时使用最适合该微服务的单独数据存储。
因此,必须了解如何为每个微服务选择最合适的数据库。您需要深入研究IOPS,延迟和数据建模等方面,并对CAP定理有深入的了解,以确保您选择正确的数据库。您应该努力使用架构和平台来构建服务,以使您将来可以轻松交换数据库。
这样做,您正处于构建高度可扩展和高性能的微服务的正确途径,可以以最佳的能力提供请求。
常问问题
微服务可以使用多个数据库吗?
是的,强烈鼓励您使用单独的数据库作为微服务,因为这有助于分解整体数据存储,并根据您的要求独立地扩展数据库服务。
微服务可以使用SQL数据库吗?
您可以在微服务的SQL,键值和图形数据库之间进行选择。这取决于您的要求。
我是否应该为我的微服务使用关系或NOSQL数据库?
没有“一个尺寸合适”,也没有银弹。这取决于您希望满足的要求。如果一致性比性能更重要,请考虑使用归一化的关系数据库。如果性能很重要,请考虑使用NOSQL数据库。
在所有微服务和多个数据库中使用单个数据库之间的权衡是什么?
使用一个用于所有微服务的数据库,缩放数据库的一部分是一项挑战。而且,有时,不同的服务可能具有不同的访问模式,并且需要其他数据模型,如果您将单个数据库用于所有微服务。