译者自序:
熟悉我的朋友都知道,我很不喜欢翻译东西,因为在两种语言的思维方式之间做频繁切换对我来说是件很痛苦的事情。但是这次不一样,公司和同事的大力支持降低了我的痛苦指数,让我能够坚持把Chris Richardson的微服务模式系列文章翻译完,今天发布第九篇——《独享数据库》。
译者评论:
微服务模式中最为头疼的问题就是——数据问题,因为数据会散布在多个微服务之间,这通常意味着数据被分散到多个数据库中,这时微服务必须自行保证跨微服务的数据一致性,而无法利用数据库本身的机制解决。随之而来的是微服务滚动升级时数据库同步升级的问题。
本系列文章的第九篇和第十篇会初步的呈现这个问题,之后的几篇文章会介绍问题的解决方案,但是这些解决方案实现起来比较复杂、学习门槛较高,远不够完美。在我们今后的工作中,也会对这部分问题做较大的投入,致力在实践中总结出更为完善的方案。
背景
如果用微服务模式开发网店应用,那么大部分的服务都需要用某种数据库保存数据。例如,订单服务存储订单信息,客户服务存储客户信息。
问题
在微服务应用中,应该采用什么数据库架构?
需求
方案
使各微服务的持久化数据私有于该服务,并只能通过该服务的API进行访问。以下示意图展现了这种模式的结构。
服务的数据库实际上服务实现的一部分。其他服务不能直接访问该服务的数据库。
有几种方法可以使服务的持久化数据私有。不需要为每一服务部署一个数据库。例如,使用关系型数据库,则:
Private-tables-per-service 和 schema-per-service都有最低的额外开销。Schema-per-service有清晰的数据所有权,因而更受欢迎。一些高吞吐量的服务可能也需要独立的数据库。
为模块化设置屏障是个不错的办法。例如,为每个服务分配不同的数据库用户,并为其设置数据库访问控制机制,如授权。如果没有这种屏障来进行封装,开发者会绕过服务的API,直接访问数据。
结果
独享数据库拥有以下优势:
但独享数据库有以下劣势:
通过Join来自多个数据库的数据实现查询是很有挑战性的。有以下几种解决方案:
相关模式
微服务模式系列文章持续连载,欢迎保持关注此公众号。
相关文章链接:
微服务模式系列之一:整体式架构
微服务模式系列之二:微服务架构
微服务模式系列之三:API网关
微服务模式系列之四:客户端服务实现
微服务模式系列之五:服务端服务发现
微服务模式系列之六:服务注册表
微服务模式系列之七:自注册
微服务模式系列之八:第三方注册
原文链接:http://microservices.io/patterns/data/database-per-service.html
关于译者:
宋潇男
EAII-企业架构创新研究院 专家委员
现任普元云计算架构师,曾在华为云计算负责产品与解决方案的规划和管理工作 。曾负责国家电网第一代云资源管理平台以及中国银联基于OpenStack的金融云的技术方案、架构设计和技术原型工作。
原著作者
Chris Richardson
世界十大软件架构师之一,《POJOS IN ACTION》一书的作者。他的研究领域包括Spring、Scala、微服务架构设计、NoSQL数据库、分布式数据库、分布式数据管理、事件驱动的应用编程等。