很多朋友经常问我以下问题:58到家用过数据库中间件吗?中间件,或者说基于服务器的中间件使用中间件后,如何解决join/subquery/setfunction/transaction...等问题,大家有没有类似的疑问?然而,“为什么要引入数据库中间件?”很少有人问。《架构师之路》一文的思路是先解决“为什么”。最近写了一系列关于互联网分层架构的文章,来谈谈这个核心问题:为什么要通过不断的分层架构演进引入数据库中间件,DAOLayer,基础数据服务,通用业务服务,前后端分离之后后端,一个业务系统的后端结构如上:web-view层通过http接口从web-data获取json数据(前后端分离)web-data层通过RPC接口从biz-service获取数据(generalbusinessservice)biz-service层通过RPC接口从base-service获取数据(基础数据服务)base-service层通过DAO(DAO)db存储从db获取数据随着时间的推移,数据量会越来越大并且越来越大,base-service通过DAO访问db的性能会越来越低。需要考虑db的水平切分。一旦db被水平分库,发现很多SQL可以支持的功能需要base-service层做特殊处理:有些数据需要路由到具体的水平分库,有些数据不确定落在哪个水平分库中,并且需要访问所有库有些数据需要访问全局库,获取数据的全局视图,去服务层做额外处理...更具体的,对于高并发业务中的前台,db横向切分后,有几个典型的业务场景和解决方案。特别强调的是,这里处理的是“前台”、“高并发”、“db水平切分”的场景。对后台的需求会通过前后台分离的架构来处理,这里不做赘述。1:partitionkey单行查询典型场景:用户通过uid查询场景特点:patitionkey查询每次只返回一行记录解决方案:base-service层使用patitionkey进行libraryrouting如上图:user-service底层用户数据库,分库patitionkey是对uiduid的查询,user-service可以直接定位库2.单行查询非patitionkey典型场景:通过login_name查询用户场景特点:非patitionkey查询每次只返回一行记录方案一:base-service层访问所有库如上图:user-service先通过login_name查询整个数据库结果集,然后在user-service合并,最后返回一条记录方案二:base-service先查映射库,然后Routethroughpatitionkey如上图:新建一个映射库,记录login_name和uid的映射关系。当有非patitionkey查询时,先通过login_name查询uid,然后通过patitionkey路由,最后返回一条记录。方案三:遗传法关于“基因法”见《分库后,非patition key上访问的多种解决办法》,解决非分区键的查询需求。3、批量查询patitionkey典型场景:用户列表uid上的IN查询场景特点:通过patitionkey查询每次返回多行记录方案一:base-service层访问所有库,结果集与base-合并service方案二:base-service解析路由规则,按需访问如上图:base-service根据路由规则解析,判断有的数据落在1库,有的数据落在2库。base-service按需访问相关库,并返回列表数据,而不是访问整个数据库的base-service合并结果集。4.数据库在非分区键上的分页要求数据库分区后分页的查询要求详见《业界难题,夸库分页的四种方案》。5.其他要求……本文就写到这里。上述1、2、3、4、5其实都不是重点。base-service层通过各种trick解决db水平切分后的数据访问。问题是base-service层的复杂性增加了数据获取的效率,减少了需要db水平切分的base-service数量。这时分层架构会变成这样:底层复杂度会扩散到各个base-service,所有base-service要注意:patitionkeyroutingnon-patitionkeyquery,先映射,再路由,先补库,再合并,先分析,再按需路由分页处理……这个架构图是不是看着很别扭?如何让数据获取更高效、更快捷?数据库中间件的引入势在必行。这是一个“基于服务器”的数据库中间件架构图:base-service层,就像访问db一样,访问db-proxy,高效获取数据。所有底层的复杂性都被屏蔽在db-proxy层中。这是“基于客户端”的数据库中间件的架构图:基础服务层,通过db-proxy。换句话说,当base-service层获取db数据过于复杂成为普遍痛点时,应该对数据库中间件进行抽象,简化数据获取流程,提高数据获取效率,降低底层复杂度可以屏蔽上游。【本文为专栏作者《58神剑》原创稿件,转载请联系原作者】点此阅读更多该作者好文
