取消
显示结果 
搜索替代 
您的意思是: 
cancel
2499
查看次数
16
有帮助
0
评论
julianchen
Spotlight
Spotlight
引言:在您的微服务架构会需要多个数据模型的时候,您会选择使用混合持久化和多模型的数据库吗?


大规模分布式系统在近10年中得到了爆炸式增长。这种趋势已经产生了一股可以说是对整个软件业开先河式的,数据库界创意旋风。因此,市场中涌现出了大量的颇具竞争力数据库平台。但是,我们又该如何去选择它们呢?

在本文中,我们将探讨如何为您的应用去选择合适的数据库模型(是的,完全可以选择不止一个!)。我们也会讨论到这些数据模型的选择将如何帮助您去确定数据层面的各种技术。

云架构,NoSQL和微服务

在软件开发人员开始创建web架构的应用时,那些在历史上一直主导着我们多年的关系型数据库架构,已经开始表现出“压力山大”了。特别是在我们开发那些被频繁使用的社交应用,和将越来越多的设备连接到物联网(IOT)的时候,客户端大量地读取和写入数据导致了数据层面的扩展需求。而与此同时,新的数据库类型的出现正好满足这些高扩展性的需求。

在许多情况下,这些新的数据库是“非结构化查询语言(NoSQL)”或“非关系型”的数据模型解决方案。它们并非显性的关系模型,如文档、键-值、面向整列的、甚至是图表数据库。通常,这些数据库牺牲了一些在传统关系型数据库上为我们所熟悉的特性,如:强一致性、ACID事务、和各种连接(joins)。

同时,作为革命性的数据库技术,SOA(面向服务的架构)已经日趋向微服务架构的风格进行发展,许多组织开始摒弃诸如企业服务总线(ESB)的重量级SOA架构,而改用更为分散的实现方法。微服务架构的吸引力在于其独立的开发、管理和扩展各种服务的能力。这使得我们在考虑数据库架构实现等方面的技术上,具有大量的实施选择灵活性。

举例而言,假设我们根据一项大规模可扩展性的需求,正在从事于一个重要的微服务架构的开发。那么,无论该项目是一项新的应用,还是对现有应用的重构,我们都有机会来选择新的数据库。

混合持久化(Polyglot persistence

微服务模式的一项优势是封装的持久性,我们可以自由地根据每个服务的需求来选择不同的持久化技术。Martin Fowler等人提出的混合持久化这一术语,特指根据不同的数据类型来选择数据存储的方法。可以说混合持久化天生就十分契合于微服务。

下面的例图显示了一组微服务,我们该如何为每一项服务来选择使用不同的数据模型呢?在此,我不会一一列举每种数据库类型的适当用例,只会突出这些数据库类型和混合方法的优势所在。

开发服务A的小组可能会选择使用表格型数据库(tabular database),如ApacheCassandra,因为它能大规模地管理核心应用的数据。例如,零售应用的库存类数据可能就非常适合于Cassandra的表格形式。Cassandra提供了一套协调机制的工具集,包括能够批量调整一致性,和作为全面ACID事务替代品的轻量级事务等。

服务B可能只需要支持通过well-known键来查询参考值,这样简单的语义,比如说一个产品编录的描述性数据。这是一个很好的键-值(key-value)存储的案例,我们可以通过产品IDwell-known-值来查找一个BLOB(二进制对象文件的容器)类型的数据。那么大量的内存空间会被用来缓存键-值类型的数据,从而支持大规模、且超快速地读取访问。

服务C主要考虑的是提供半结构化的内容,例如:网站的网页或表格,以及文档存储,这些类型的数据都是非常适合的。文档的存储有“许多键-值类型相似,仅有某个键不同”的数据结构,例如只要索引某些特殊属性项,便可加快各种搜索的能力。

服务D则涉及到导航各种数据间的复杂关系,例如:客户数据与组织内不同部门的客户联系人之间的历史数据。这可能潜在地涉及到:各种不同服务所拥有的数据类型之间的各种关系。比如说在这种情况下,您可以选择让您的服务创建一个对于各种底层表格都是只读的视图,然后通过调用其他“拥有着”自身数据类型的服务API这样的“front door”,来过滤实现任何预期的转换。

最后,我们还可能会有一些使用着关系型技术的传统系统与服务,或者我们有一个管理着少量且不经常更改的数据服务。那么关系型数据库对于此类用例就是再好不过的了。

单独的服务需要混合吗?

也有一种可能:我们设计出一个放置在多数据库之上的服务。例如说,我们可以创建一个使用的键-值存储索引的酒店服务,它映射名称和ID之间的关系。同时它用Cassandra的表格样式来存储关于酒店的描述性数据。

注意:使用非规范化的设计方法,同样可以在Cassandra中实现名称与ID的映射,当然您需要用一张单独的表格来维持名称与ID的映射。这样虽然会用到更多的存储空间,但是简化了我们在管理一个单独的键-值存储操作上的复杂性。

所以我的建议是:只要可行,完全可以把一个给定的微服务与一个单一的数据模型(和数据库)相连接。如果您碰到需要将单一的服务放置在两个不同的数据库之上的情况,请判断该服务的范围是否过大。如果太大,您可能就需要考虑将其拆分成多个更小的服务了。
入门指南

使用上面的搜索栏输入关键字、短语或问题,搜索问题的答案。

我们希望您在这里的旅程尽可能顺利,因此这里有一些链接可以帮助您快速熟悉思科社区:









快捷链接