您当前的位置:首页 > 电脑百科 > 程序开发 > 架构

为什么微服务要有独立数据库

时间:2021-10-11 09:22:44  来源:微信公众号  作者:Thoughtworks洞见
为什么微服务要有独立数据库

 

实施微服务架构,我们一直在遵循一个实践原则:每个微服务要有自己独立的数据库,避免数据库层面的耦合。这种理所当然感觉好像不需要多加思考,就是应该这样做;

为什么微服务要有独立数据库

 

图片来源:James Lewis和Martin Fowler的文章《Microservices》

那么到底为什么每个微服务都需要独立的数据库,数据放在一个数据库有问题吗?要回答这个问题,我们还是要回归到微服务的定义 (参见James Lewis和Martin Fowler的文章《Microservices》,地址:

https://martinfowler.com/articles/microservices.html):

In short, the microservice architectural style is an Approach to developing a single application as a suite of small services, each running in its own process and communicating with lightweight mechanisms, often an HTTP resource API. These services are built around business capabilities and independently deployable by fully automated deployment machinery. There is a bare minimum of centralized management of these services, which may be written in different programming languages and use different data storage technologies.

这个定义中指明了微服务架构风格的典型特征,如:技术异构(每个服务可以采用不同的编程语言或不同的数据存储技术)、独立部署和围绕业务能力构建,等等。我们可以从微服务架构风格的几个典型特征入手,看看独立数据库可以带来哪些好处,或者共享数据库会带来哪些问题。

微服务支持技术异构

为了更好的解决特殊场景的问题,微服务架构并不提倡使用适合所有场景的标准化技术,而是针对每个服务的特点,选择更合适的技术。

这个技术不仅包括编程语言、技术框架,当然也包括数据存储技术;纽曼(Sam Newman)在《微服务设计》一书中举了一个例子很好的解释了数据存储技术异构带来的好处:

对于社交网络来说,图数据库能够更好的处理用户之间的交互操作,但对于用户发布的帖子而言,文档数据库可能是一个更好的选择

为什么微服务要有独立数据库

 

图片来源:《微服务设计》第1章图1-1

技术异构很自然让我们为每个微服务选择了独立的数据库,但杠精附体的同学可能紧接着会问:那如果服务不需要采用异构的技术,那是不是就可以使用同一个数据库了呢,比如都使用MySQL数据库?

微服务是自治的

微服务是小而自治的,自治性的一个非常重要的特性就是独立部署,一个服务的修改和部署不应该对其他服务产生影响,但如果多个服务共享数据库,在数据库层的耦合让不确定性变大,一个服务对数据库结构的变更很有可能影响其他服务,即破坏了自治性。

自治性的好处体现在整个系统的弹性上,当一个服务发生故障时,不会造成整个系统的不可用。然而,如果多个服务共享数据库,数据库的异常会导致多个服务同时故障,也就大大增加了整个系统不可用的概率。

自治性还体现在服务的可扩展性上,不同的服务因业务不同其需要满足的性能和并发量要求也不同。当请求量增加时只需要对部分服务进行扩展,而不是所有服务;同样当数据库性能无法满足需求时,只需要对部分服务的数据库进行扩容升级,而如果多个服务共享数据库,扩容升级的影响就会作用到多个服务,一方面破坏了服务的自治性,另一方面当其他服务对数据库没有那么高要求时,资源是浪费的。

继续杠精附体,那是不是可以把并发量和性能要求相近的业务合并为一个服务,而共享同一个数据库呢?

微服务是围绕业务能力构建的

这个问题其实是微服务架构实施落地的一个非常热点问题:如何划分微服务?

划分微服务要遵循高内聚、低耦合这个原则的,这也是微服务架构优势所在;《领域驱动设计》引入了限界上下文(bounded context)的概念,通过对业务的梳理找到不同业务上下文之间的边界,帮助我们找到了划分微服务的方法,这里的重点在业务边界。James Lewis和Martin Fowler在微服务的定义中也强调微服务是构建在业务能力之上的,可见微服务的小而自治是建立在独立的业务能力基础之上的。

因此,简单的将并发量和性能要求相近的业务合并到一个服务中,无法达到微服务期望的效果,也就没法获得微服务所具有的好处。一方面不同的业务对数据库的要求除了要考虑并发量和性能,还应该包括数据量的大小、读写的比例、实时性要求等等,共享数据库的方式一般情况下也很难满足不同业务服务对这些指标的要求,将所有服务的数据都存放在一个数据库中本身也是一种非常大的挑战。另一方面用动态的视角看这个问题,业务是发展的,随着市场的不断变化,不同的业务随时间而演进出来的需求可能是完全不同的,对数据库的需求也会有所不同,共享数据库的方式很可能变成瓶颈限制业务的发展。

微服务架构要不断演进

为什么微服务要有独立数据库

 

微服务架构风格还有一个非常重要的特征,就是支持架构的演进;不论是互联网企业,还是在数字化转型过程中的传统企业,市场的变化和不确定性是不可避免的,当接到一个新的需求,如果需要用新的技术手段来解决,微服务架构就体现出了独特的优势,在不对其他服务产生影响的情况下,可以随意变更一个服务内部的技术框架或数据存储技术,共享数据库明显做不到这一点。

最后

每个微服务拥有独立的数据库作为微服务架构风格提倡的实践之一,和其他实践一起,像鲁班锁中的积木一样巧妙组合在一起,共同支撑了微服务架构风格所具备的优点,在软件开发实践过程中,只有遵守微服务架构风格所推荐的这些实践,才能最大化的发挥微服务架构的优势。

每个服务拥有独立数据库并不是只有优点,数据的分散管理给数据一致性带来了很大的挑战,考虑到分布式事务的高昂代价和实现成本,微服务提倡服务之间的无事务协调,通过最终一致性来保证业务流程的正常推进。


文/Thoughtworks麻广广

原文链接:https://insights.thoughtworks.cn/why-microservices-need-independent-database/

更多精彩洞见,请关注微信公众号:Thoughtworks洞见



Tags:微服务   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
▶ 企业级项目结构封装释义 如果你刚毕业,作为Java新手程序员进入一家企业,拿到代码之后,你有什么感觉呢?如果你没有听过多模块、分布式这类的概念,那么多半会傻眼。为什么一个项...【详细内容】
2021-12-20  Tags: 微服务  点击:(8)  评论:(0)  加入收藏
前面谈过很多关于数字化转型,云原生,微服务方面的文章。虽然自己一直做大集团的SOA集成平台咨询规划和建设项目,但是当前传统企业数字化转型,国产化和自主可控,云原生,微服务是不...【详细内容】
2021-12-06  Tags: 微服务  点击:(23)  评论:(0)  加入收藏
微服务看似是完美的解决方案。从理论上来说,微服务提高了开发速度,而且还可以单独扩展应用的某个部分。但实际上,微服务带有一定的隐形成本。我认为,没有亲自动手构建微服务的经历,就无法真正了解其复杂性。...【详细内容】
2021-11-26  Tags: 微服务  点击:(35)  评论:(0)  加入收藏
实施微服务架构,我们一直在遵循一个实践原则:每个微服务要有自己独立的数据库,避免数据库层面的耦合。这种理所当然感觉好像不需要多加思考,就是应该这样做; 图片来源:James Lewi...【详细内容】
2021-10-11  Tags: 微服务  点击:(42)  评论:(0)  加入收藏
在今年的NGINX Sprint 2.0虚拟大会上,NGINX(来自流行的开源web服务器/负载均衡器和反向代理背后的公司F5),发布了NGINX现代应用参考架构(MARA)。该公司在一篇博客文章中说,这将帮...【详细内容】
2021-09-26  Tags: 微服务  点击:(60)  评论:(0)  加入收藏
今天,字节跳动正式宣布开源 CloudWeGo。这是一套以 Go 语言为核心、专注于微服务通信与治理的中间件集合,具有高性能、可扩展、高可靠的特点。项目地址:https://github.com/clo...【详细内容】
2021-09-08  Tags: 微服务  点击:(92)  评论:(0)  加入收藏
1. Spring Boot 与 Spring Cloud Spring Boot 是用于编写微服务的 Java 基础框架。在Spring Cloud 提供了各种构建全栈微服务的功能。构建小型和大型系统都适合。由于控制反...【详细内容】
2021-08-31  Tags: 微服务  点击:(162)  评论:(0)  加入收藏
现有问题在 EFK 日志收集 篇中,我们讲解了如何利用 EFK 收集 Kubernetes 集群日志。但是,还存在如下问题。 Elasticsearch 以单节点的形式部署,不能满足生产环境的要求 Fluentd...【详细内容】
2021-08-13  Tags: 微服务  点击:(102)  评论:(0)  加入收藏
在 Java 和 Kotlin 中, 除了使用Spring Boot创建微服务外,还有很多其他的替代方案。 名称 版本 发布时间 开发商 GitHub ...【详细内容】
2021-08-06  Tags: 微服务  点击:(173)  评论:(0)  加入收藏
一、微服务的现状及未来1.服务架构的演变1.1 单体架构  单体架构应该是我们最先接触到的架构实现了,在单体架构中使用经典的三层模型,即表现层,业务逻辑层和数据访问...【详细内容】
2021-07-22  Tags: 微服务  点击:(125)  评论:(0)  加入收藏
▌简易百科推荐
为了构建高并发、高可用的系统架构,压测、容量预估必不可少,在发现系统瓶颈后,需要有针对性地扩容、优化。结合楼主的经验和知识,本文做一个简单的总结,欢迎探讨。1、QPS保障目标...【详细内容】
2021-12-27  大数据架构师    Tags:架构   点击:(3)  评论:(0)  加入收藏
前言 单片机开发中,我们往往首先接触裸机系统,然后到RTOS,那么它们的软件架构是什么?这是我们开发人员必须认真考虑的问题。在实际项目中,首先选择软件架构是非常重要的,接下来我...【详细内容】
2021-12-23  正点原子原子哥    Tags:架构   点击:(7)  评论:(0)  加入收藏
现有数据架构难以支撑现代化应用的实现。 随着云计算产业的快速崛起,带动着各行各业开始自己的基于云的业务创新和信息架构现代化,云计算的可靠性、灵活性、按需计费的高性价...【详细内容】
2021-12-22    CSDN  Tags:数据架构   点击:(10)  评论:(0)  加入收藏
▶ 企业级项目结构封装释义 如果你刚毕业,作为Java新手程序员进入一家企业,拿到代码之后,你有什么感觉呢?如果你没有听过多模块、分布式这类的概念,那么多半会傻眼。为什么一个项...【详细内容】
2021-12-20  蜗牛学苑    Tags:微服务   点击:(8)  评论:(0)  加入收藏
我是一名程序员关注我们吧,我们会多多分享技术和资源。进来的朋友,可以多了解下青锋的产品,已开源多个产品的架构版本。Thymeleaf版(开源)1、采用技术: springboot、layui、Thymel...【详细内容】
2021-12-14  青锋爱编程    Tags:后台架构   点击:(20)  评论:(0)  加入收藏
在了解连接池之前,我们需要对长、短链接建立初步认识。我们都知道,网络通信大部分都是基于TCP/IP协议,数据传输之前,双方通过“三次握手”建立连接,当数据传输完成之后,又通过“四次挥手”释放连接,以下是“三次握手”与“四...【详细内容】
2021-12-14  架构即人生    Tags:连接池   点击:(16)  评论:(0)  加入收藏
随着移动互联网技术的快速发展,在新业务、新领域、新场景的驱动下,基于传统大型机的服务部署方式,不仅难以适应快速增长的业务需求,而且持续耗费高昂的成本,从而使得各大生产厂商...【详细内容】
2021-12-08  架构驿站    Tags:分布式系统   点击:(23)  评论:(0)  加入收藏
本系列为 Netty 学习笔记,本篇介绍总结Java NIO 网络编程。Netty 作为一个异步的、事件驱动的网络应用程序框架,也是基于NIO的客户、服务器端的编程框架。其对 Java NIO 底层...【详细内容】
2021-12-07  大数据架构师    Tags:Netty   点击:(16)  评论:(0)  加入收藏
前面谈过很多关于数字化转型,云原生,微服务方面的文章。虽然自己一直做大集团的SOA集成平台咨询规划和建设项目,但是当前传统企业数字化转型,国产化和自主可控,云原生,微服务是不...【详细内容】
2021-12-06  人月聊IT    Tags:架构   点击:(23)  评论:(0)  加入收藏
微服务看似是完美的解决方案。从理论上来说,微服务提高了开发速度,而且还可以单独扩展应用的某个部分。但实际上,微服务带有一定的隐形成本。我认为,没有亲自动手构建微服务的经历,就无法真正了解其复杂性。...【详细内容】
2021-11-26  GreekDataGuy  CSDN  Tags:单体应用   点击:(35)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条