面对突发流量激增Coinbase如何扩展其交易平台

面对突发流量激增Coinbase如何扩展其交易平台

导读:2017年以来,世界范围内都在关注加密货币,Coinbase流量压力激增。Coinbase怎么应对这些流量压力,又怎么在流量非高峰时期作准备,这是不少技术人都关心的话题。本文做者是Coinbase工程师团队成员,就这些问题给出了详尽的解释。算法

2017年以来,世界范围内都在关注加密货币,所以其整个生态系统的市值从200亿美金跃升至6000亿美金。在此期间,coinbase的全部技术组件都经历了实战的检验,咱们除了须要关注安全性以外,平台的可靠性和可扩展性也是很是重要的。咱们在MongoDB World 2018上,咱们谈到了2017年技术上的收获,以及如何扩展咱们现有平台。这里有演讲视频[1],本文是此次演讲的概述。mongodb

2017年的教训数据库

2016年的时候,coinbase的流量还比较平稳。咱们也预计过可能遇见的问题,由于后端平均每分钟处理25000个API请求,因此咱们将流量红线设置为每分钟10万个API请求。
面对突发流量激增Coinbase如何扩展其交易平台后端

然而,随着2017年5月-6月以太坊价格飙升,流量超过了红线,所以咱们也经历了服务宕机的状况。
面对突发流量激增Coinbase如何扩展其交易平台缓存

为了快速解决问题,Coinbase的工程师团队首先关注环境中的瓶颈。咱们坐了不少工做好比,垂直拆分扩展,升级数据库版本(以利用新版本的特性),优化索引以及将热点数据库拆分等。全部的这些措施都为咱们带来很大改进,然而流量持续攀升,仅仅靠这些还不够。安全

在每次出问题的时候,出问题的模式都是相似的:咱们的监控平台显示有很是高的(100倍)延迟,而且伴随着ruby服务器和mongodb数据库之间事物处理时间的不匹配。咱们主要使用Mongdb存储数据,在流量大的时候会遇到这种高延迟,然而ruby服务的时间却没有增长。
面对突发流量激增Coinbase如何扩展其交易平台ruby

由于咱们的监控工具没法为这些问题的缘由提供答案,所以咱们称之为幽灵问题。这些查询来自哪里?查询看起来在作什么?为何ruby处理时间也有峰值?问题是在应用程序这边吗?性能优化

简而言之,咱们的监控系统没法利用咱们全部环境。咱们须要一个框架来回答这些问题,而且将之可视化。服务器

咱们开始经过修改mongodb驱动来追踪查询,能够记录超过响应时间阈值的查询,以及request/response大小,响应时间,源代码行等信息。
面对突发流量激增Coinbase如何扩展其交易平台架构

改进后的dashboard提供了更详细的数据,使咱们能快速缩小问题的范围。咱们注意到的第一个奇怪的现象是,咱们用户登陆购买或者查看仪表板的时候,会有大量查询。
面对突发流量激增Coinbase如何扩展其交易平台

这种状况的缘由是咱们的用户和设备之间是多对多关系。即某些用户可能有多个设备,某些设备对应多个用户。糟糕的设备指纹识别算法将大量用户置于同一设备中,从而致使单个设备对应大量user_id。
面对突发流量激增Coinbase如何扩展其交易平台

为了解决这一问题,咱们将之重构为一对多关系,即每一个设备只映射到一个用户。从下图能够看到,性能提高是很大的。
面对突发流量激增Coinbase如何扩展其交易平台
这也说明了良好的监控工具的必要性,在可以细粒度追踪数据库查询以前,几乎没法发现这一问题。使用新工具以后,就很容易发现问题了。

咱们须要解决的另外一个问题是热点集合的大量读取。咱们决定使用memcached缓存查询结果,即在查数据库以前,全部请求都先查询缓存,在写数据库以前,也会先作操做使缓存失效。
面对突发流量激增Coinbase如何扩展其交易平台

为了可以尽可能与业务解耦,缓存是在ORM和数据库驱动这一层添加的,这使得咱们同时影响多个数据库集群。
面对突发流量激增Coinbase如何扩展其交易平台

通过12月和1月份的流量激增证实,这些改进都是很是有效的措施。借助这些手段,咱们可以成熟更大的流量激增。
面对突发流量激增Coinbase如何扩展其交易平台

为了未来

如今咱们正努力确保在下一次流量激增以前作好准备。虽然在流量激增期间能够作不少工做,可是咱们须要找到一种方法来改善咱们现有表现,以在流量较低的时间就能够作好准备。显然能够经过模拟流量激增来测试咱们现有的环境,以发现咱们下一个问题来自哪里。

咱们选择的方案是流量捕获和回放,特别是在数据库上,按需生成流量。对咱们来讲,这种方式比伪造流量更为可取,由于不须要让测试脚本跟随业务迭代。每次运行测试套件时,咱们都会确保查询捕获的数据准备映射到应用程序流量。

为此咱们构建了一个名为capture的工具,它是mongoreplay的封装。在咱们选定特定集群后,catpure会启动快照并开始捕获定向到该集群的应用服务器上的原始流量。以后对数据进行加密,并存储到S3上。当咱们执行回放时,有另外一个名为cannon的工具,将捕获的流量回放到新启动的集群。
面对突发流量激增Coinbase如何扩展其交易平台

这个模式的一个挑战是如何跨越多个应用服务器捕获全部mongodb流量。cannon会打开10MB缓冲区,同时合并和过滤捕获的流量来解决问题。
面对突发流量激增Coinbase如何扩展其交易平台
最终的结果是合并到一个文件中,cannon能够将其定向到新推出的mongodb集群。cannon容许精确选择重放的速度,以模拟数千倍的流量负载。
面对突发流量激增Coinbase如何扩展其交易平台

咱们刚开始使用capture 和cannon,然而已经获得不错的结果。

其中一个重大发现来自cannon的调试功能,cannon可以检查捕获流量文件的前100条消息。通过检查,咱们发现了一些有趣的事情。
面对突发流量激增Coinbase如何扩展其交易平台

请注意ping和find混合在一块儿。事实证实,mongodb的ruby驱动未遵循正确的mongodb驱动规范。在每次find以前都执行ping命令以检查副本集状态。这种行为虽然不太可能致使停机,可是基本能够确定,这是前文所述幽灵行为的缘由。
面对突发流量激增Coinbase如何扩展其交易平台

在通过这些努力以后,咱们为coinbase目前的可靠性而自豪。2017年的事件证实,客户访问和查看资金的能力,对于达成咱们的目标(购买,销售,管理加密货币)相当重要。虽然安全始终是咱们的首要任务,可是可靠性一样重要。

原文地址:
https://blog.coinbase.com/how-were-scaling-our-platform-for-spikes-in-customer-demand-4a047cb3139c

文中连接:
[1] https://www.youtube.com/watch?v=i6ws1JpvNs0

本文做者Luke Dem,由方圆翻译。转载本文请注明出处,欢迎更多小伙伴加入翻译及投稿文章的行列,详情请戳公众号菜单「联系咱们」。

参考阅读:

  • 为什么服务器QPS上不去?Java线程调优权威指南
  • C++ Python PHP Java NodeJS性能大PK,结果PHP7是最……
  • 2016 GIAC全球互联网架构大会圆满结束,所有PPT开放下载
  • 一文读懂Java 11的ZGC为什么如此高效
  • JDK 11中将会加入使人惊叹的ZGC(不到2毫秒)
  • 深刻解读 Java 9 新特性
  • Java10来了,来看看它一同发布的全新JIT编译器
  • Java性能优化指南及惟品会的实战

活动预告:
11 月 23 ~ 24 日,GIAC 全球互联网架构大会将于上海举行。GIAC 是高可用架构技术社区推出的面向架构师、技术负责人及高端技术从业人员的技术架构大会。今年的 GIAC 已经有微软,腾讯、阿里巴巴、蚂蚁金服,华为,科大讯飞、新浪微博、京东、七牛、美团点评、饿了么,才云,格灵深瞳,Databricks,等公司专家出席。

本期 GIAC 大会上,系统架构部分精彩的议题以下:
面对突发流量激增Coinbase如何扩展其交易平台参加 GIAC,盘点2018最新技术。点击“阅读原文”了解大会更多详情。

相关文章
相关标签/搜索