微服务框架的存储架构

web应用从单点向高并发架构演变时往往遇到最大的问题就是数据库的分布式存储。因为web应用本身就可以集群部署,但其所使用的数据库确是单点的。如果一个web应用开始的时候没有考虑数据库的分布式架构,那么等到要进行数据库集群改造时会发现困难重重,此时通常的做法是将原系统拆分成多个子系统,然后每个子系统访问一个数据库,这几乎重写了整个系统(如果这还不能满足需求,大型企业接下来会增加数据存储总线)。很多厂商都是这么做的,包括淘宝。如果你开始你能够考虑到数据库集群,并且这种集群的设置并不增加开发工作量和难度,那么将来可以为企业节省大量人力物力。

  一般来说我们在开发一个应用时,需要对应用进行分层,一般分为界面层、业务层、存储层,这有利于开发,也有利于将来部署运行。这里并不特指Web程序,桌面应用也是一样。应用系统从单点运行演变为分布式应用一般需要经历下面3个步骤。

  图(1),系统的各层属于一个应用,彼此之间以API的方式(进程内)调用,可以满足小并发量需求,一般的桌面应用使用此种运行方式。图(2)系统的业务层被拆分,拆分成许多独立的子系统(或同一系统的业务处理模块单独运行,部署多个),前端界面和业务层以RPC进行调用,业务层和存储层以API的方式(进程内)调用,此种运行方式可以满足中、高并发量的处理请求。图(3)就是分布式的最终状态了,所有功能都进行集群部署,层与层之间都是RPC调用。

关于分布式,这里不再多说,本文主要讨论的是存储架构的问题。我们知道最简单的一个Web应用就可以进行图(2)那样的部署(如果需要登陆,那么还需采用session共享技术),这是因为Web应用本身界面层和业务层默认就是http调用,属于远程调用的一种。我们假设有一个电子商务类应用,运行方式如下图:

  因为Web应用本身界面是由页面组成,并且可以缓存,我们也可以把界面层看成进行了集群部署。所以说,对于一个简单的web应用是可以很容易做到界面层和业务处理层集群部署和运行的。那么随着业务量增大和并发请求的增加,一个web应用最先遇到的瓶颈就是存储。从开发角度最容易看出这个问题,一个默认web应用,在访问数据库时都是使用同一条数据库连接(或同一个连接池),只能指向同一个数据库。所以,如果我们能够在一个web应用中,让业务层按需建立多个数据库连接,那么也就实现了存储的集群化。

一般来说一个应用遇到存储瓶颈,可以通过缓存进行优化,如果缓存也不能满足情况,就只能拆分数据库了。拆分数据库一般分为两步走,首先是数据库按业务垂直拆分,不要业务模块的数据存储到不同的数据库,这也称为数据库的垂直拆分,如下图(1)。这是指同一个应用来说的,微服务架构本身包括多种应用,每种应用有自己的数据库访问模块,每种应用又可以包括多个业务处理模块,垂直拆分后,每个业务模块对应一个数据库。

因为微服务架构本身就提倡将大应用拆分成多个子服务,每个应用有自己的数据库,这已经相当于进行了一次存储的垂直拆分。再进一步垂直拆分,一个子服务又可以使用多个数据库,到这一步,一般的高并发量就足够处理了。但是一个系统往往有些模块会持续不断的增加数据,比如电子商务中的订单模块,这会导致单表数据非常大。时间久会给查询和计算带来严重瓶颈,这个时候就需要数据库水平拆分登场了,如图(2),数据库水平拆分是把之前某个业务处理模块对应的一个数据库,再按水平方向拆分,使一个业务处理模块对应操作几个数据库,使原来一张表中的数据按规则存储到几个库中。

  水平拆分的前提条件是拆分的相关表必须属于同一个聚合(领域驱动中的聚合)。聚合中的根就是拆分依据的主表,我们根据主表数据计算规则进行数据库拆分。这种拆分方式非常重要,因为这种拆分方式形成的数据库横向集群支持数据库级事务。比如说一个用户聚合,包括用户、资金账户、联系人3张表。那么用户就是主表,此时如果我们按用户ID拆分数据库,你会发现虽然是集群存储,但当某个用户访问自己的数据时,这些数据始终在同一个库,同一个库就支持数据库事务。

  做完横向拆分后,每一个服务其实都对应了一个存储矩阵,服务中每一个业务处理模块都对应几个数据库,这几个数据库是水平切分的。最简单的水平切分规则是按主表主键大小,比如前100万条数据存A1数据库,100万-200万存A2数据库,200万-300万存A3数据库等。

  数据库存储集群的方案目前业界有很多。关于关系型数据库和NoSQL使用场景也是争论不休。我们认为,如果是事务性的应用必须使用关系型数据库,比如电子商务和互联网金融,事务性比较弱的可以采用NoSQL,比如博客、新闻等应用,事务性可以作为是否选用NoSQL数据库的标准。即便是关系型数据库集群在编程方面也存在多种方案,比如:

  这个技术都各有优缺点,有的不支持本地数据库级事务,像Amoeba;有的支持数据库本地事务但又不支持跨库情况下的Join、分页、排序、子查询,像Cobar。从本质上说,数据存储也是业务处理的一部分,举个简单的例子,还是那个转账的例子:A在Web页面提交一个转账给B申请,业务处理模块拿到转账申请从A账户扣除转账金额(数据库操作)并给B的余额加上转账金额(数据库操作),并记录操作日志和通知B。很明显,数据库操作是这个转账业务处理操作的一部分,所以如果在业务层直接进行分布式存储和按需存储,事情将变得简单的多(spring提倡的链式事务管理就是这种方式)。如果你不把数据库存储作为业务层处理的一部分,而封装成一个独立运行的模块,那么就会出现各种各样的问题。

  如果将数据库路由键放入服务层,一个典型业务层接口类定义如下:

  public interface SporeService {

  public List<Spore> searchByCondition(RouteKey routeKey);

  public Spore findById(Long id,RouteKey routeKey);

  public void update(Spore spore,RouteKey routeKey);

  public void insert(Spore spore,RouteKey routeKey);

  public void delete(Long id,RouteKey routeKey);

  }

这是业务层定义的接口,在这里增加了一个数据路由的key,为什么把数据路由的选择放到业务层接口,我们前面提到过,数据访问本身属于业务的一种操作。就比如你今天去A银行取钱和去B银行取钱完全是两种业务。数据路由键让每一个业务方法都可以对应一个数据库矩阵,而key就是该业务方法所需数据库的选择方法。可能有的程序员认为在每个方法增加一个RouteKey routeKey参数太过于繁琐,是不是可以定义成继承关系或注解等等,那相比这种方式更加繁琐,而且不适合于所有情况。

时间: 2024-08-09 10:27:29

微服务框架的存储架构的相关文章

go微服务框架go-micro深度学习(一) 整体架构介绍

产品嘴里的一个小项目,从立项到开发上线,随着时间和需求的不断激增,会越来越复杂,变成一个大项目,如果前期项目架构没设计的不好,代码会越来越臃肿,难以维护,后期的每次产品迭代上线都会牵一发而动全身.项目微服务化,松耦合模块间的关系,是一个很好的选择,随然增加了维护成本,但是还是很值得的. 微服务化项目除了稳定性我个人还比较关心的几个问题: 一: 服务间数据传输的效率和安全性. 二: 服务的动态扩充,也就是服务的注册和发现,服务集群化. 三: 微服务功能的可订制化,因为并不是所有的功能都会很符合你的

微服务框架Lagom介绍之一

背景 Lagom是JAVA系下响应式 微服务框架,在阅读本文之前请先阅读微服务架构设计,Lagom与其他微服务框架相比,与众不同的特性包括: 目前,大多数已有的微服务框架关注于简化单个微服务的构建--这是比较容易的一部分内容.Lagom将其扩展到了微服务所构成的系统,这是大型的系统--也是较为困难的一部分内容,因为在这里我们会面临到分布式系统的复杂性. 通信默认是异步的--基于消息和流--但是,如果需要的话,也考虑到了使用其他的方案,如同步的REST. 持久化默认是基于事件的--使用事件溯源Ev

日调度万亿次,微服务框架TSF大规模应用——云+未来峰会开发者专场回顾

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 演讲者:张浩 腾讯云中间件产品负责人 背景:众多开发者中,一定经历类似的甜蜜烦恼,就是当线上业务规模越来越大,系统分支发展越来越多的时候,初期上线的成就感很快就会被系统间数据不兼容.不通畅,折磨得精疲力尽,每次模块更新都是牵一发而动全身.腾讯云微服务框架TSF就可以为大家解决数据孤岛以及重复造轮子的问题,提供了简洁易用的代码入口,将复杂的底层网络.服务器部署接口化,使开发者更易用. 本文整理自腾讯云中间件产品负责人张浩在腾讯云云+未来峰

微服务框架-SpringCloud简介

前面一篇文章谈到微服务基础框架,而Netflix的多个开源组件一起正好可以提供完整的分布式微服务基础架构环境,而对于Spring Cloud正是对Netflix的多个开源组件进一步的封装而成,同时又实现了和云端平台,和Spring Boot开发框架很好的集成. Spring Cloud是一个相对比较新的微服务框架,今年(2016)才推出1.0的release版本. 虽然Spring Cloud时间最短, 但是相比Dubbo等RPC框架, Spring Cloud提供的全套的分布式系统解决方案.

微服务框架-Spring Cloud简介(一)

Spring Cloud是一个微服务框架,相比Dubbo等RPC框架, Spring Cloud提供的全套的分布式系统解决方案. Spring Cloud对微服务基础框架Netflix的多个开源组件进行了封装,同时又实现了和云端平台以及和Spring Boot开发框架的集成. Spring Cloud 为开发者提供了在分布式系统(配置管理,服务发现,熔断,路由,微代理,控制总线,一次性token,全居琐,leader选举,分布式session,集群状态)中快速构建的工具,使用Spring Clo

浅谈现公司的Spring Cloud微服务框架

目录 说在前面 服务注册与发现 服务网关及熔断 配置中心 消息中心.服务链路追踪 小言 说在前面 本文偏小白,大佬慎入,若有错误或者质疑,欢迎留言提问,谢谢,祝大家新年快乐. spring cloud Spring Cloud 是将分布式系统中一系列基础框架/工具进行整合的框架.其中包含: 服务注册与发现.服务网关.熔断器.配置中心.消息中心.服务链路追踪等等 .这也是一个服务化架构的最小组成元素,有了这些基本的组成要素,就可以实现一个最简单的服务架构. Spring Cloud 并没有重复造轮

微服务框架面试题

Spring Boot 有哪些优点? 答:Spring Boot 的优点有: 减少开发,测试时间和努力. 使用 JavaConfig 有助于避免使用 XML. 避免大量的 Maven 导入和各种版本冲突. 提供意见发展方法. 通过提供默认值快速开始开发. 没有单独的 Web 服务器需要.这意味着你不再需要启动 Tomcat,Glassfish 或其 他任何东西. 需要更少的配置 因为没有web.xml文件.只需添加用@ Configuration注释的类, 然后添加用@Bean 注释的方法,Sp

(转)微服务框架落地实践之路

http://www.primeton.com/read.php?id=2276&his=1 一.微服务架构产生的背景 近十年中,互联网给我们生活带来了翻天覆地的变化,消费者的生活方式日益数字化,人们可以在任何时间.任何地点利用网络进行购物体验,运用社交媒体进行自我表达,企业也在运用多种技术手段,发挥数字化潜力,改善客户联系,促进企业业务模式的转型.在这种背景下,互联网也好,传统企业也罢,都面临一个共同的需求:面对快速变化的需求,面对业务模式的升级,如何构建出灵活的,可扩展,可重用的系统? 前几

基于.NET CORE微服务框架 -浅析如何使用surging

1.前言 surging受到大家这么强烈的关注,我感到非常意外,比如有同僚在公司的分享会上分享surging, 还有在博客拿其它的RPC框架,微服务做对比等等,这些举动都让我感觉压力很大,毕竟作为个人的开源项目,无法与成熟的开源社区的项目相比,也只有等到后面有许许多多志同道合的朋友加入一起研发完善surging,这样才能让surging 成为流行的微服务框架. 这篇文章介绍如何使用surging 开源地址:https://github.com/dotnetcore/surging 2.设计模式