SQL
SQL即我们通常所说的关系型数据(库)。随着互联网业务的发展,性能要求越来越高,必然面对一个问题:将数据拆分到多个数据库实例才能满足业务的性能需求(其实Oracle也一样,只是时间早晚的问题)。数据库拆分满足了性能的要求,但带来了复杂度的问题:数据如何拆分、数据如何组合。所以互联网公司流行的做法是业务发展到一定阶段后,就会将这部分功能独立成中间件,例如淘宝的TDDL。再后期会导致新的复杂度问题:数据库资源使用率不高,比较浪费以及各SQL集群分开维护,投入的维护成本越来越高。因此,实力雄厚的大公司此时一般都会在SQL集群上构建SQL存储平台,以对业务透明的形式提供资源分配、数据备份、迁移、容灾、读写分离、分库分表等一系列服务。例如,淘宝的UMP(Unified MySQL Platform)系统。
NoSQL
NoSQL不是No SQL,而是Not Only SQL,即NoSQL是SQL的补充。首先NoSQL在数据结构上与传统的SQL的不同,例如典型的Memcache的key-value结构、Redis的复杂数据结构、MongoDB的文档数据结构;其次,NoSQL无一例外地都会将性能作为自己的一大卖点。
NoSQL的这两个特点很好地弥补了关系数据库的不足,因此在互联网行业NoSQL的应用基本上是基础要求。
由于NoSQL方案一般自己本身就提供集群功能,因此NoSQL在刚才是应用时很方便,不像SQL分库分表那么复杂。而NoSQL发展到一定规模后,通常都会在NoSQL集群的基础之上再实现统一存储平台。统一存储平台主要实现资源动态按需动态分配、资源自动化管理、故障自动化处理等几个功能。当然要发展到这个阶段,一般也是大公司才会这么做,简单来说就是如果只有几十台NoSQL服务器,那么做存储平台的收益不大;但如果有几千台NoSQL服务器,那么NoSQL存储平台就能够产生很大的收益。
开发框架
互联网公司都会指定一个大的技术方向,然后使用统一的开发框架。例如,Java相关的开发框架SSH、SpringMVC、SpringCloud、Play,Ruby的Ruby on Rails,PHP的ThinkPHP,Python的Django等等。使用统一的开发框架能够解决上面提到的各种问题,大大提升组织和团队的开发效率。
对于框架的选择,有一个总的原则:优选成熟的框架,避免盲目追逐新技术。首先,成熟的框架资料文档齐备;其次,成熟的框架受众更广,招聘时更容易招到合适的人才;最后,成熟的框架更加稳定,不会出现大的变动,适合长期发展。
服务中心
服务中心未来解决跨系统依赖的配置和调度问题。其实现一般来说有两种方式:服务名字系统和服务总线系统。
服务名字系统(Service Name System),类似于DNS,其是为了将Service名称解析为“host+port+接口名称”,但是和DNS一样,真正发起请求的还是请求方。
服务总线系统(Service Bus System),类似于计算机总线,其为了直接由总线系统完成调用,服务请求方不需要直接和服务提供方交互。
两者简单对比如下:
服务总线系统服务名字系统复杂度设计更加复杂,要同时完成配置和调度功能,且本身高性能和高可用的设计也更加复杂。设计简单,基本类似一个服务配置中心,如果要做调度,需要独立的SDK包。可用性可用性的关键,它故障后所有业务间的访问都调用,影响较大,但因为服务总线主要做调度,可以部署两套或多套并行系统。仅仅保存配置,调用还是由服务请求方发起,可用性要求没那么高,即使故障,各系统也可以使用本地缓存配置继续完成调用。灵活性控制所有的调度和配置,可以做得非常灵活。仅仅有配置,即使提供独立的SDK支持调度,灵活性也要差一点,毕竟SDK只能获取静态的配置信息。实时性系统完成实际的调度,可以做到非常实时,例如某个服务及机器故障后立刻剔除故障节点。提供调度的SDK包,也需要定时更新配置,不能每次请求都去获取一下最新的配置,实时性一般,这个问题和DNS类似。可维护性服务总线系统的修改和升级只需要自己完成即可。修改和升级大部分情况下要修改SDK包(例如,调度算法变更),修改SDK包要求所有系统应用新SDK包才能生效。多语言支持服务总线系统支持通用的HTTP和TCP协议,和语言无关。服务名字系统提供的SDK包需要适配多个语言,这个工作量也不小。