PaaS平台上多租户的数据拓展(自定义) 续
在上一篇文章中,我简单的描述了一下PaaS架构中面临的一些问题,接下来会描述更多问题,同时也会在文章的最后浅谈一下我们的解决方案.
动态拓展,是数据访问层在运行时,甚至是在二次开发中,才会遇到或者需要解决的问题,它很重要,却不一定如它的重要性那样迫切.在服务层面,我们为了保持架构的拓展性和可维护行,自然而然想到SOA,想到了服务的切分.那在数据层面的,为了保持库的简洁,易维护,同时为了存储海量数据,我们自然而然的要对库做切分,需要分库分表,库该如何切分,这个看似很简单的命题(不外乎就是把本来在一个库中的数据放入多个库中,同时把本来放在一个库中的表放在多个库中),但是实际使用中,这会给开发带来不可避免的麻烦.
第一个大麻烦:跨库查询.所谓跨库查询是指有也业务需求情况下,我们的一次查询,必须从多个数据库获得数据,但是大家都知道传统的关系型数据库对切分的容忍性是很低,基本不支持跨库的查询,最头疼的是,根据数据分组的查询条件,连接方式及jion的条件及分页的不同,获取特定条件下的特定数据!如果解决这个问题呢?我们想了很多种解决方案,最理想的貌似是淘宝的MyFox(参见http://www.programmer.com.cn/7578/),它为程序员开发提供了良好的编程接口,而且几乎是透明的,貌似是完美的解决方案,但是他们实现的代价可能过大,也许需要一个庞大的团队来维护他们代码,才能保证功能正确.对于很多企业,这可能是不现实的,无论是自己实现,还是使用他们开源的框架,都有点令人不寒而栗的感觉,技术复杂到一定程度,已经很难为效率服务!在我们的数据访问层中,我们坚持了几项基本原则:
1.以最简单,最小的代价实现目标. 2.不做我们不擅长做的事情(不帮我们的查询做跨库的产讯拼接). 3.程序员编程友好,我们希望程序员压根不知道他们在坐跨库查询.
依据以上的几条,我们采用了"共享中心"的设计方案.
何为共享中心呢? 共享中心就是我们数据共享的地方!
和谁共享呢?当然是我们不同应用间共享数据!
最终我们只在我们的数据访问层增加了一个方法就获得了如下的效果:
1.跨库查询对程序员是透明的,我们的数据访问层会智能检测出该查询是否需要访问共享中 心而动态路由到共享中心对数据进行关联查询?2.共享中心依然是按我们的分库分表原则进行的.3.共享中心是可以动态替换的.我们使用的方式是,让一些关键表的关键列被动态插入到共享中心,我们的数据访问层提供了对数据的监控,我们能方便的监控一些列的改变,从而保证共享中心数据被半实时同步更新!当然这只是实现共享中心数据同步的一种方案,具体不同的应用中,可采用不同的同步方案.我们只能保证在可见时间后,查询才会有效,(新插入的数据才会被查询出来,一般在2s-3s),但是这个结果我们完全能接受,因为需要跨库查询的地方,一定是复杂查询,而复杂查询伴随关键数据新增和修改的几率很小.
希望这篇文章能帮助跨库查询的朋友,我会在接下来的文章中陆续介绍遇到的问题和解决办法,最后会详细介绍我们数据访问层的实现方案!