热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

微服务模式系列之九:独享数据库

译者评论:微服务模式中最为头疼的问题就是——数据问题,因为数据会散布在多个微服务之间,这通常意味着数据被分散到多个数据库中,这时微服务必须自行保证跨微服务的数据一致性,而无法利用数据库本

译者评论:

微服务模式中最为头疼的问题就是——数据问题,因为数据会散布在多个微服务之间,这通常意味着数据被分散到多个数据库中,这时微服务必须自行保证跨微服务的数据一致性,而无法利用数据库本身的机制解决。随之而来的是微服务滚动升级时数据库同步升级的问题。

本系列文章的第九篇和第十篇会初步的呈现这个问题,之后的几篇文章会介绍问题的解决方案,但是这些解决方案实现起来比较复杂、学习门槛较高,远不够完美。在我们今后的工作中,也会对这部分问题做较大的投入,致力在实践中总结出更为完善的方案。

背景

如果用微服务模式开发网店应用,那么大部分的服务都需要用某种数据库保存数据。例如,订单服务存储订单信息,客户服务存储客户信息。

图片描述

问题

在微服务应用中,应该采用什么数据库架构?

需求

服务必须松耦合,以确保可以独立进行开发,部署和扩展。

一些业务事务必须在多个服务之间保持数据一致性。例如,下单用例必须保证新的订单不会超过客户的信用限额。其他业务事务必须更新多个服务的数据。

一些业务事务需要查询多个服务的数据。例如,查询可用信用必须查询客户信息以获取客户的信用限额,并查询订单信息以获取该客户的全部未结订单(才可以得到该客户的剩余可用信用)。

一些查询必须Join来自多个服务的数据。例如,查询某一特点区域的客户和这些客户的近期订单,需要Join来自客户信息服务和订单信息服务的数据。

为进行扩展,数据库有时必须进行复制和Sharding。参见ScaleCube。

不同的服务有不同的数据存储需求。对于某些服务,关系型数据库就是最好的选择。其他一些服务可能会需要NoSQL数据库,如善于存储复杂、非结构化数据的MongoDB,或者能够有效存储和查询图数据的Neo4J。

方案

使各微服务的持久化数据私有于该服务,并只能通过该服务的API进行访问。以下示意图展现了这种模式的结构。

图片描述

服务的数据库实际上服务实现的一部分。其他服务不能直接访问该服务的数据库。

有几种方法可以使服务的持久化数据私有。不需要为每一服务部署一个数据库。例如,使用关系型数据库,则:

Private-tables-per-service——每一服务拥有一系列只能被该服务访问的表

Schema-per-service——每一服务拥有一个为该服务所私有的数据库Schema

Database-server-per-service——每一服务拥有自己的数据库

Private-tables-per-service 和 schema-per-service都有最低的额外开销。Schema-per-service有清晰的数据所有权,因而更受欢迎。一些高吞吐量的服务可能也需要独立的数据库。

为模块化设置屏障是个不错的办法。例如,为每个服务分配不同的数据库用户,并为其设置数据库访问控制机制,如授权。如果没有这种屏障来进行封装,开发者会绕过服务的API,直接访问数据。

结果

独享数据库拥有以下优势:

确保服务是松耦合的。一个服务的数据库的变化不会影响其他服务。

每一服务都可以使用最能满足其需求的数据库。例如,一个用于文本检索的服务可以使用ElasticSearch。操作社交图谱的服务可以使用Neo4j。

但独享数据库有以下劣势:

跨多个服务的业务事务并不简单。由于CAP定理的限制,最好的选择是避免分布式事务。另外许多现代数据库(NoSQL)也不支持分布式事务。最好的解决方案是使用最终一致性的事件驱动架构。当服务更新数据时,该服务就会发布事件。其它服务会订阅事件,并通过更新数据做出响应。

通过Join来自多个数据库的数据实现查询是很有挑战性的。有以下几种解决方案:

应用端Join---在应用端而非数据库端进行Join。例如,一个服务(或者API网关)要检索客户信息和订单,首先要从客户服务检索客户信息,然后再通过查询订单服务返回客户最新的订单信息。

命令查询职责分离(CQRS)——维护一个或多个包含多个服务数据的物化视图。视图会被保存在订阅了事件的服务中,每个服务在更新数据时会发布出这些事件。例如,网店可以通过维护一个客户信息和订单信息的Join视图来查询特定区域客户和他们的近期订单。该视图由订阅了客户信息事件和订单信息事件的服务进行更新。

管理多种SQL数据库和NoSQL数据库带来的复杂性。

相关模式

微服务模式催生了对该模式的需求

事件驱动架构模式是实现事务最终一致性的有效途径

Command Query Responsibility Segregation (CQRS)模式是执行复杂查询的有效途径

共享数据库反模式描述了微服务中共享数据库带来的难题

推荐阅读
  • 云原生应用最佳开发实践之十二原则(12factor)
    目录简介一、基准代码二、依赖三、配置四、后端配置五、构建、发布、运行六、进程七、端口绑定八、并发九、易处理十、开发与线上环境等价十一、日志十二、进程管理当 ... [详细]
  • 解决VS写C#项目导入MySQL数据源报错“You have a usable connection already”问题的正确方法
    本文介绍了在VS写C#项目导入MySQL数据源时出现报错“You have a usable connection already”的问题,并给出了正确的解决方法。详细描述了问题的出现情况和报错信息,并提供了解决该问题的步骤和注意事项。 ... [详细]
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
  • Sleuth+zipkin链路追踪SpringCloud微服务的解决方案
    在庞大的微服务群中,随着业务扩展,微服务个数增多,系统调用链路复杂化。Sleuth+zipkin是解决SpringCloud微服务定位和追踪的方案。通过TraceId将不同服务调用的日志串联起来,实现请求链路跟踪。通过Feign调用和Request传递TraceId,将整个调用链路的服务日志归组合并,提供定位和追踪的功能。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了adg架构设置在企业数据治理中的应用。随着信息技术的发展,企业IT系统的快速发展使得数据成为企业业务增长的新动力,但同时也带来了数据冗余、数据难发现、效率低下、资源消耗等问题。本文讨论了企业面临的几类尖锐问题,并提出了解决方案,包括确保库表结构与系统测试版本一致、避免数据冗余、快速定位问题等。此外,本文还探讨了adg架构在大版本升级、上云服务和微服务治理方面的应用。通过本文的介绍,读者可以了解到adg架构设置的重要性及其在企业数据治理中的应用。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • {moduleinfo:{card_count:[{count_phone:1,count:1}],search_count:[{count_phone:4 ... [详细]
  • 14亿人的大项目,腾讯云数据库拿下!
    全国人 ... [详细]
  • 知识图谱表示概念:知识图谱是由一些相互连接的实体和他们的属性构成的。换句话说,知识图谱是由一条条知识组成,每条知识表示为一个SPO三元组(Subject-Predicate-Obj ... [详细]
  • 基于事件驱动的并发编程及其消息通信机制的同步与异步、阻塞与非阻塞、IO模型的分类
    本文介绍了基于事件驱动的并发编程中的消息通信机制,包括同步和异步的概念及其区别,阻塞和非阻塞的状态,以及IO模型的分类。同步阻塞IO、同步非阻塞IO、异步阻塞IO和异步非阻塞IO等不同的IO模型被详细解释。这些概念和模型对于理解并发编程中的消息通信和IO操作具有重要意义。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
  • Activiti7流程定义开发笔记
    本文介绍了Activiti7流程定义的开发笔记,包括流程定义的概念、使用activiti-explorer和activiti-eclipse-designer进行建模的方式,以及生成流程图的方法。还介绍了流程定义部署的概念和步骤,包括将bpmn和png文件添加部署到activiti数据库中的方法,以及使用ZIP包进行部署的方式。同时还提到了activiti.cfg.xml文件的作用。 ... [详细]
author-avatar
你送的指环_526
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有