《阿里技术分享: 深度揭秘阿里数据库技术方案的10年变迁史》读后感

  该文来自张瑞:阿里集团数据库技术团队负责人在2018年双11来临之前的技术分享会,下面将其中的一些个人感悟记录下来。

首先,科普一下有关阿里数据库的发展史。如果将阿里数据库发展历史分为三个阶段的话,分别是:

  • 第一阶段(2005-2009)商业数据库时代;
  • 第二阶段(2010-2015)开源数据库时代;
  • 第三阶段(2016年-至今)自研数据库时代。

  商业数据库时代就是大家所熟知的IOE时代,也因此引发了“去IOE”的呼声:通过分布式数据库中间件TDDL、开源数据库AliSQL(阿里巴巴的MySQL分支)、高性能X86服务器和SSD,并通过DBA和业务开发同学的共同努力,成功地替换了商业数据库Oracle、IBM小型机和EMC高端存储,从此进入了开源数据库时代。

  根据张瑞先生的介绍,去IOE主要带来了以下三个重大的意义:

  (1)是解决了扩展性的问题,让数据库具备了横向扩展(弹性)的能力,为未来很多年双11零点交易峰值打下了很好的基础。

  (2)是自主可控,我们在AliSQL中加入了大量的特性,比如:库存热点补丁,SQL限流保护,线程池等等,很多特性都是来源于双11对于数据库的技术要求,这在商业数据库时代是完全不可能的。

  (3)是稳定性,原来在商业数据库时代,就如同把所有的鸡蛋放在一个篮子里(小型机),去IOE之后不仅仅解决了单机故障,更是通过异地多活的架构升级让数据库跨出了城市的限制,可以实现数据库城市间的多活和容灾,大大提升了系统的可用性。

  说到这里,让我想到一个关于数据库应用实例的例子:假设某客户端软件有根据用户请求去数据库查询数据的功能,在查询数据前,需要获得数据库连接,如果我们在软件开启时就去初始化并获得数据库连接,会存在以下弊端:软件开启时需初始化系统的所有类,如果系统还有大量类似资源耗费较多的操作(比如 XML 解析,本地或远程文件资源加载)也需在此时进行初始化,所有这些初始化操作的叠加会使得系统的启动速度变得非常缓慢。为此,我们使用代理模式的代理类对数据库查询类的初始化操作进行封装,当系统启动时,初始化这个代理类,而非真实的数据库查询类,由于此时代理类什么都没有做,因此,它的构造是相当迅速的。在用户真正做查询操作时再由代理类单独去加载真实的数据库查询类,完成用户的请求,这样就使用代理模式实现了延迟加载。下面就做一下代理模式的相关概念总结:

      代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。通俗的来讲代理模式就是我们生活中常见的中介。

      中介隔离作用:在某些情况下,一个客户类不想或者不能直接引用一个委托对象,而代理类对象可以在客户类和委托对象之间起到中介的作用,其特征是代理类和委托类实现相同的接口。

      开闭原则,增加功能:代理类除了是客户类和委托类的中介之外,我们还可以通过给代理类增加额外的功能来扩展委托类的功能,这样做我们只需要修改代理类而不需要再修改委托类,符合代码设计的开闭原则。代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后对返回结果的处理等。代理类本身并不真正实现服务,而是同过调用委托类的相关方法,来提供特定的服务。真正的业务功能还是由委托类来实现,但是可以在业务功能执行的前后加入一些公共的服务。例如我们想给项目加入缓存、日志这些功能,我们就可以使用代理类来完成,而没必要打开已经封装好的委托类。

      优点:可以做到在符合开闭原则的情况下对目标对象进行功能扩展。

      缺点:我们得为每一个服务都得创建代理类,工作量太大,不易管理。同时接口一旦发生改变,代理类也得相应修改。

  代理模式的应用场景主要还是分为4类:

     (1)远程代理:为一个对象在不同地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。

     (2) 虚拟代理:是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真是对象。

     (3)安全代理:用来控制真是对象访问时的权限。

     (4)智能代理:是指当调用真是的对象时,代理去处理另外一些事情。

原文地址:https://www.cnblogs.com/somedayLi/p/11053941.html