当前位置: 首页 > 科技观察

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

时间:2023-03-22 10:37:23 科技观察

实现微服务架构,我们一直遵循一个实践原则:每个微服务必须有自己独立的数据库,避免数据库层面的耦合。这种想当然的感觉,不需要多想,就应该去做;图片来源:JamesLewis和MartinFowler的文章《Microservices》  那么为什么每个微服务都需要一个独立的数据库呢?将数据放在一个数据库中有问题吗?要回答这个问题,还是要回到微服务的定义上来(参见JamesLewis和MartinFowler的文章《Microservices》,地址:https://martinfowler.com/articles/microservices.html):简而言之,微服务架构style是一种将单个应用程序开发为一组小型服务的方法,每个服务都在自己的进程中运行并与轻量级机制(通常是HTTP资源API)进行通信。这些服务围绕业务能力构建,可通过全自动部署独立部署。这些服务有最低限度的集中管理,可能用不同的编程语言编写,并使用不同的数据存储技术。  这个定义表明了微服务架构风格的典型特征,例如:技术异构(每个服务可以使用不同的编程语言或不同的数据存储技术)、独立部署和围绕业务能力构建等等。我们可以从微服务架构风格的几个典型特征入手,看看独立数据库能带来什么好处,或者共享数据库会带来什么问题。微服务支持技术异构  为了更好地解决特殊场景的问题,微服务架构并不提倡使用适用于所有场景的标准化技术,而是根据每个服务的特点选择更合适的技术。  这项技术不仅包括编程语言、技术框架,还包括数据存储技术;SamNewman在《微服务设计》一书中举了一个例子来解释异构数据存储技术的好处:  对于社交网络,图数据库可以更好地处理用户之间的交互,但对于用户帖子,文档数据库可能是更好的选择图片来源:《微服务设计》No.1ChapterFigure1-1  技术的异构性自然让我们为每个微服务选择了独立的数据库,但是有门道的同学可能马上会问:如果服务不需要使用异构技术,是否可以使用比如同一个数据库,都用MySQL数据库?微服务是自治的  微服务是小而自治的。自治的一个很重要的特点就是独立部署。一个服务的修改和部署不应该影响到其他服务,但是如果多个服务共享数据库,数据库层的耦合增加了不确定性,一个服务对数据库结构的改变很可能会影响到其他服务,破坏了自治性.  自治的好处体现在整个系统的弹性上。当一个服务出现故障时,整个系统不会不可用。但是,如果多个服务共享数据库,数据库的异常会导致多个服务同时失效,大大增加了整个系统不可用的概率。  自主性还体现在服务的可扩展性上。不同的服务由于业务不同,对性能和并发的要求也不同。当请求数量增加时,只需要扩展部分服务,而不是所有服务;同样,当数据库的性能不能满足需求时,只需要对部分服务的数据库进行扩容和升级,而如果多个服务共享数据库,扩容和升级的影响会影响到多个服务。一方面,它破坏了服务的自主性。另一方面,当其他服务对数据库没有那么高的要求时,又造成了资源浪费。  继续借用本质,是否可以将对并发和性能要求相近的业务合并成一个服务,共享同一个数据库?微服务是围绕业务能力构建的  这个问题其实是微服务架构实现中非常热门的问题:如何划分微服务?  划分微服务要遵循高内聚低耦合的原则,这也是微服务架构的优势;它们之间的界限帮助我们找到了划分微服务的方法。这里的重点是业务边界。JamesLewis和MartinFowler在微服务的定义中也强调微服务是建立在业务能力之上的。可见,小而自治的微服务是基于独立的业务能力。  因此,简单地将并发和性能要求相近的业务合并到一个服务中,并不能达到微服务的预期效果,也无法获得微服务带来的好处。一方面,不同业务对数据库的要求不仅要考虑并发量和性能,还包括数据量的大小、读写比例、实时性要求等,并且共享数据库的方式一般难以满足不同的业务服务。对于这些指标的需求,将所有的业务数据存入数据库本身就是一个非常大的挑战。另一方面,从动态的角度来看这个问题。企业在发展。随着市场的不断变化,随着时间的推移,不同的业务可能会有完全不同的需求,对数据库的需求也会有所不同。共享数据库的方式很可能成为制约业务发展的瓶颈。微服务架构必须不断演进微服务架构风格的另一个非常重要的特点是支持架构的演进;无论是互联网企业还是传统企业,在数字化转型过程中,市场的变化和不确定性都在所难免,当接到一个新的需求,如果需要用新的技术手段去解决,微服务架构就显示出独特的优势。在不影响其他服务的情况下,可以改变一个服务的内部技术架构或者数据存储技术,共享数据库显然做不到这一点。最后  每个微服务都有一个独立的数据库作为微服务架构风格所倡导的实践之一。与其他实践一起,它们像鲁班锁中的积木一样巧妙组合,共同支撑微服务架构风格。优势,在软件开发实践过程中,只有遵循微服务架构风格推荐的实践,才能最大限度地发挥微服务架构的优势。  每个服务都有一个独立的数据库并不是唯一的优势。数据的去中心化管理给数据一致性带来了巨大的挑战。考虑到分布式事务的高成本和实现成本,微服务提倡无缝的事务协调,通过最终一致性保证业务流程的正常进行。