挖财后端技术用的主要是比较大众的东西,Web容器用Tomcat,框架主要是Spring MVC,也有少量的Play,中间服务层是Dubbo,微容器用Spring Boot,服务注册这一块是用ZooKeeper,核心业务开发方式还是围绕着Spring和Mybatis等;数据的存储这块是MySQL和Hbase,分布存储这块是用阿里巴巴之前开源的一个中间件Cobar。消息和实时计算这块主要是Kafka, Storm,日志以及监控系统则是用典型的ELK和Zabbix。另外我们将要放弃MongoDB和Memcached,并不是这些产品自身的问题,而是人的因素,最早的架构师对MongoDB很熟,后来因为他离开,这块的一些问题缺乏强有力的人把控,就放弃了。其他人对MySQL和Hbase更熟悉,并且这两种组合基本满足我们的需求了。Memcached则是被Redis替代。总的来说,我们裁剪掉了一些之前使用的相似产品,减少为一种,主要是基于自身运维能力考虑的,不在于这些技术是否足够好或者是否符合团队的特性和遇到的问题,而是你能不能把它维护的好,或者说风险控制好。
业务上面我们大概也是比较典型的。基础设施是一块,然后中间是服务,上面是日常的应用。基础设施就包括典型的存储、消息、框架,还有发布、运维、监控等等。中间就是现在典型的SOA服务,用户的资产、服务、流水、交易等等,所有的服务采用Spring Boot打包部署,主要便于运维上的统一和方便做一些切面层的事情。最上面是应用,包括社区、记帐、钱管家、理财。而安全和风控会切入在每一个环节。
其实作为一个互联网的金融公司,很多时候我们对金融会有一点点陌生,在我们看来做一个理财产品或者一个理财业务其实和电商业务有很大的相似之处。主要就是理财产品,他也是一个商品,这个商品可能有高的回报,最初形成这个商品的时候背后有一套综合系统或者说有一套逻辑。并且购买这个商品之后,这个商品是有历史的,他的收益是在变化的,所以简化之后,我们发现跟电商系统是相似的。
这就是典型的架构,前面是Web或Gateway,中间是Service,中间层协议是Dubbo默认方式或者是HTTP。
数据存储这一块主要是MySQL和Hbase,当前还有小部分数据使用的Mongo,ORMapping这块我们用了MyBatis。数据的水平扩展主要是基于刚才提到的Cobar,它是阿里比较成功的开源产品之一。Cobar支持数据的二维扩展,能满足我们的场景,比如说几千万用户的流水记录可以按用户加时间的维度来划分。如果单纯按时间的维度分区,在查询用户的流水时要散落到各个分区上,对各个分区的压力都较大。而按用户的维度则可能导致这个分区在一定时间后达到我们预设的容量上线,因为一天有几百万甚至上千万的流水进入。二维的方式可以解决这些问题。尽管我们后来发现用户的数据大多在最近一段时间内较热,时间比较早的数据相对较冷,只用了Cobar的一维扩展方式,将冷数据归档到Hbase集群来解决。在数据的在线处理这块,有很多用Akka框架的程序,比如计息系统主要是运算的,所以Akka很适合干这个事情。
自动记帐这块主要是钱管家这款产品,他会根据银行的帐单把这些数据汇总到这个产品里面,主要是从其他系统汇聚出原始的数据,根据这些数据我们会进行分类,进行加工和抽取,最后汇总到database,这个过程的思路就是command+pipeline下面这套组合,只不过是分布式命令和管道,分布式里面命令是Akka所承担的角色。
数据分析这块,Canal会把binlog数据丢到Kafka然后同步到其他系统。在线分析主要通过Storm进行,数据分析过程中缓存用了豌豆荚的Codis。离线分析目前用Hadoop/Spark的方式,数据分析之后,一部分存到Hbase,另一部分在通过Cober存储到MySQL里面。