在最近举办的“比特币产业峰会暨火币网一周年庆”活动期间,InfoQ 就数字货币交易平台的基础架构和技术挑战采访了火币CTO 巨建华,他分享了自己在行业领域的宝贵经验和精彩观点。
InfoQ: 首先请做一下自我介绍。
巨建华: 我先后毕业于电子科技大学和中国人民大学,曾就职于海虹控股、中国搜索、大麦网和 YOKA 时尚网等知名 IT 企业,多年以来一直从事互联网电子商务、搜索和门户网站相关技术研发工作。
在工作期间成功构建了目前国内最大票务网站大麦网的全国联网票务系统,部署在数千个场馆节点,支撑了全国 70% 以上的演出和体育赛事的售票;5 年互联网金融软件领域创业经历,主持开发了多款基于上证所 Level-2 高速行情数据的软件产品;2013 年进军医疗行业应用开发,推出基于知识库的艾默康智能处方评估系统被应用于 100 多家大型医院获得了较高的行业知名度;2014 年加入火币网后,对火币网的比特币交易系统进行了完全的重构,使之具备了更加高速,稳定和开放的能力。
InfoQ: 相比传统金融交易平台,火币网比特币交易系统(以下简称火币网)的不同点在哪里?
巨建华: 由于市场性质的不同,导致火币网和传统的金融交易平台在业务营运方式较大差异,比特币是一种全球性的数字资产,它的价格行情会受到全球市场的影响,启动了金融杠杆交易后这种价格波动的影响被放大了多倍,这导致了交易系统必满足全年 24x7 任何时刻不间断的交易服务,系统服务的中断意味着行情将受到剧烈的波动加大交易的风险,因此我们在系统设计上需要尽可能的避免停机维护,从硬件到软件都做到了完整的冗余和高可用,每一个系统都充分围绕着高可用和容错来设计和实现,我们做到了所有系统模块的高可用和核心交易系统的快速故障转移。
相对于传统金融交易平台,火币做数字加密货币金融业务的同时也是一家互联网公司,众所周知互联网产品的创新迭代是非常快速的,在快速迭代的产品开发过程我们推出了大量不同的创新金融业务,这也导致了非常复杂的资产结算逻辑,在高峰期时每天的交易额达到了 10 个亿人民币的规模下,我们不能像传统证券交易所那样当天卖出证券资产后第二天才能提现,因为比特币领域太新,在没有法律认可的第三方资金监管的情况下,用户希望自己的资产随时掌握在自己手里才踏实,这带来了用户对法币和虚拟货币充值提现的实时结算需求,使我们结算和风控系统的设计也变得非常复杂,实现结算提现加比特币资产的不可追回特性,导致出现任何问题非常致命的,因此我们比传统金融平台来说在技术上存在更大的挑战。
InfoQ: 火币网的技术难点有哪些? 如何解决的?
巨建华: 火币网的技术难点主要在于对比特币的撮合交易引擎和比特币数字资产的管理这两方面。
和传统证券交易所同时进行数千个商品的撮合交易不同,在火币网目前只有比特币和莱特币这两种主流数字货币在交易,这意味着每天 10 个亿的交易额到未来交易额不断增长的时候,所有用户都是对这两种商品在报价交易,由于撮合交易的规则要求完全遵循时间优先和价格优先的原则进行撮合成交,这导致我们在单个品种每天的交易额在很大程度上超过了大部分现在流通的股票证券交易,不能像传统的证券交易所通过增加集群节点将不同的商品放到不同的服务器上实现交易系统容量的提升,这个难题我们通过选择对单进程计算最占优势的硬件,在对算法进行了大量的改进实现了单机撮合性能的数量级提升,确保了对未来交易业务增长的支撑。
比特币本身是一个分布式网络,普通用户使和比特币只需要下载和安装一个钱包客户端,或者使用在线钱包服务即可满足使用比特币的需求,但是由于比特币网络还处于发展初期,并没有非常有效的开源软件可以支撑住比特币交易所这样集中式的大量比特币资产充值和提现的业务需求,因此我们需要按照比特币协议,重新设计并量身打造出交易所钱包软件,高效安全的满足数十万用户的充值和提现需求。
InfoQ: 火币网的技术栈是怎样的?
巨建华: 火币网最初是基于 LNMP 搭建的交易平台,在关键的钱包和撮合引擎方面使用 C++ 实现,随着业务的发展和业务增长带来的营运压力提升,我们逐渐根据业务的特点进行了相应的技术升级。
首先我们升级到了面向服务的架构,原来的 PHP 作为 Web 层实现与用户的交付,将业务层转向用 Java 开发的后端服务中,这种架构下我们可以在保持非常高效的前端产品迭代周期上,并确保整个服务平台的稳健。
在服务框架方面我们分别采用了 Rest.li 和 Thrift,根据不同的应用场景灵活选用,并通过 ZooKeeper 实现了服务的配置管理和集群管理。 和大部分互联网企业一样,我们在实际业务中大量使用了 Redis 做持久化的存储和数据缓存,通过 Haproxy 和 LVS 结合 Keepalived 实现关键系统的软件负载均衡。
消息服务方面我们分别使用了 RabbitMQ 和 Appolo,用于实现订单和行情数据的发布管理,通过 Node.js 和 QuickFix 这两个开源项目我们实现了实时的行情推送,并为用户提供了可靠的交易 API 服务。
Python 承担了部份运维管理和日常数据处理任。
数据库层面我们使用 MongoDB 承担了全部行情数据的存储和分发,通过 MySQL、InnoDB 实现了业务数据的存储。同时我们的交易终端覆盖 Windows/Mac OS X/Android/iOS,在桌面和移动端为用户提供了更好的交易体验。
InfoQ: 安全性对于数字货币来说至关重要,火币网是如何从技术方面保障安全的?
巨建华: 安全对于交易所来说是非常重要的一面,日本最大交易所 MtGox 因为安全问题的倒闭在世界范围内影响了比特币的价格走势,为整个比特币交易领域敲响了警钟。
火币网在成立初期就建立了安全部,由经验丰富的安全专家带队参与到了火币网开发和运营的方方面面,从代码安全到系统监控甚至社交攻击防护,到处都有安全部门的影子。 在火币网发展速度最快的时候,我们面临了大规模的 DDOS 攻击,最高时攻击的流量达到 80 多 G,我们在改进自身系统和的同时,也引入乌云、安全宝、加速乐等安全领域的公司的专业服务,这些工作使火币网一直以来未发生过安全隐患。 在解决自身安全问题的同事,我们也在风控系统中增加了对用户的安全监控,比如有用户帐号被盗以后如果存在异常的登陆提现等行为,我们客服系统上会有相应的报警,客服人员会在第一时间和用户进行电话核实。
InfoQ: 对于 7x24 的服务承诺,火币网在架构和运维方面是如何做的?
巨建华: 我们在所有的系统架构都为高可用做了大量的设计,在前端 Web 层面和后台数据缓存和业务服务层均允许做任意的节点失效。在数据库层面我们通过复制和数据分区的方式实现了主备层面的高可用,在出现故障后通过相应的业务日志检查即可迅速通过 ip 漂移实现数据库的故障恢复。
运维方面,从硬件层面的 IDC 机房线路到防火墙等网络设我们都实现了自动化的主备切换的能力,使用 Zibbix 完善了监控系统,除了对所有服务器和网络设备的监控外,还根据业务场景提供了数百个监控点,使我们可以在第一时间获得系统的运行状况和问题报告。 工作时间上我们运维和客服都是 24 小时待命的,确保了不会出现管理上的空档期带来的意外故障,并为用户提供了随时可以联系报故障的渠道,使我们能快速响应用户的问题。
InfoQ: 对于火币网的重构过程,你有哪些经验收获可以分享给大家?
巨建华: 火币网的重构工作主要体现对技术平台的升级和技术团队的建设上,通过初期的问题分析、方案制定和人员招聘,我们只花了比较短的时间,这个过程中管理团队的支持显得非常重要。 重构过程最重要一环,是火币网重构完成的升级工作主要的挑战在于过程中不能暂停业务,因此从重构初期到完成成级,我们没有发布过一次停机服务的公告。 不停机的重构加上复杂的业务环境,使我们在重构升级的过程中经常面临一些两难和折中的选择,在这些过程中也产生和遗留下了一些问题,在这个过程中我所获得的主要经验以下几点比较重要:
- 充分和原业务和技术团队沟通,深入了解业务了解是重构的前提
- 架构设计和实现上需要支持灰度升级,随时回滚
- 建立尽可能真实的测试环境
- 对可能产生的问题做好规划和演练是重构成功的前提
InfoQ: 火币网下一步的发展路线图是什么?
巨建华: 火币网下一步将通过完成在整个产业链的布局,推动比特币整个产业务链的发展。具体在技术层面来说,我们将进行新一代交易系统的设计,使之具备更好的性能和自动灾难切换的能力,同时我们将加大在矿场投资管理、比特币钱包及比特币支付、虚拟货币基金、虚拟商品期货等金融衍生品领域的技术研发力度,为提升比特币在金融领域和现实世界中的应用提供有力的技术支持。
InfoQ: 目前互联网金融很火,很多 IT 人员都想进入该领域,你从自己的职业生涯角度,会有哪些建议?
巨建华: 目前互联网行业普遍缺少高级 IT 人才,在互联网金融领域更是如此,但是和社区门户、搜索以及电商等领域不同,互联网金融领域对于安全和稳定有着超乎寻常的需求,对于基础技术的掌握要求更加深入。
举个例子,很多人都非常熟悉的 MySQL 数据库,在传统互联网领域只需要了解一般的主从复制和 sql 语句编写调优即可,但是在将 MySQL 用到存储用户资产、时刻进行高并发的交易时就要求对于数据库事务有着深入的了解才能在确保数据的准确性和一致性的前提下,保证计算的精度和性能。在金融领域对于主从复制成功的数据库还需要数据正确性的较验在其它领域是很少见的。 多数中小型的互联网金融企业因为成本方面的原因在大量的使用 MySQL 数据库而不是 Oracle 这样的解决方案,因此值得希望进入互联网金融领域的人员深入学习,但是当成长到一定规模以后 Oracle、DB2 又会在一定程度上成为主流,也是需要掌握的。
Java 平台是互联网金融领域技术平台的主力军,几乎所有主流的金融平台都是使用 Java 开发的,对于想进入互联网金融领域的 IT 人员来说最好能够系统的掌握 Java 平台的开发和设计。
对于金融知识的掌握也是进入互联网金融领域的一大挑战,如果不了解金融产品的基础知识,就无法理解复杂的业务逻辑,难以胜任高级的系统架构师和开发人员的职位,这些都是挑战同时也是机遇。
在 10 月份举行的 QCon 上海 2014 大会上,巨建华将作为特邀讲师在“互联网思维对金融的挑战”专题中进行有关“火币网比特币交易系统的构建实践”的演讲分享。
评论