写点什么

Repustate 从 Python 迁移到 Go,性能提高 10 倍

2015 年 9 月 24 日

Repustate 向世界各地的企业和组织提供文本分析服务。随着公司的发展,他们每天处理的文本段数量从 5 亿增加到 10 亿,其中包括 Tweet、新闻文章、博客评论、用户反馈等。大规模的文本分析非常困难,因为很少会出现两段文本完全相同的情况,所以无法利用缓存来提高效率。不过,它可以将大段的文本分成多个句子,然后并发分析每个句子。近日,Repustate 官方博客发表了一篇博文,介绍其API 的演进过程。

Repustate API 的第一个版本是用 Django 编写的。他们构建了一个原型,并以此为基础推出了他们的服务。但每个 Django 请求 / 响应周期的开销太大。随着 API 访问量增加,可靠性问题凸显,使用 Amazon 服务的成本也大大增加。于是,他们开始寻找一种 Python 代替方案,并选择了 Flask 。Flask 几乎是现成的 API,而且是轻量级的。不过,他们稍后又发现了 Falcon 。他们非常喜欢这个框架,因为它使用 Cython 进行了优化,速度比 Django 要快许多,而且它还遵循简洁 REST 原则。事实证明,Falcon 是一个很好的补救方案。Repustate 的平均响应时间缩短了,故障和支持问题的数量也降下来了。

但即便如此,Repustate 的性能仍然不能满足日益增长的需求。尤其是并发,一直是 Python 的痛处。而且,他们用的是 Python 2.7,还没有使用 Python 3 中的 asyncio 包。但实际上,即使用了,也还是要担心 GIL 的问题。并且,Falcon 无法实现自托管部署。Python 无法像 Java 或 C 那样打包,然后分发。而他们的许多客户需要在自己的网络中运行 Repustate,他们只能为这些客户提供一个部署了整个技术栈的虚拟应用。该虚拟应用既可以用于 VMware,也可以用于 Virtual Box。这是个可行的方案,但很笨重,而且更新和支持困难。所以,他们希望能够仅仅提供一个可以安装的二进制文件。

之所以选择 Go,是因为 Go 满足了他们所有的要求:

  • 比 Python 快
  • 可以编译成单个的二进制文件
  • 可以部署到任何操作系统
  • 容易实现并发

而且,Go 测试套件的布局看上去比他们的 nose 测试要简单。测试函数头很容易迁移。例如,将def test_my_function():转换成func TestMyFunction(t *testing.T) {,通过简单的替换就可以完成。此外,go routines 和 channels 非常易于使用,使得并发文本分析很容易实现。

整个迁移过程耗时 3 个月,感兴趣的读者可以查看他们的迁移过程。下面是他们的迁移成果:

  • API 平均响应时间由 100ms 降至 10ms;
  • 所需 EC2 实例的数量减少了 85%;
  • 由于 Go 可以编译成一个单独的二进制文件,而 Go 1.5 让交叉编译变得很容易,所以他们现在能够提供一个 Repustate 自托管版本;
  • 由于 Python 和 Go 相似,所以他们能够快速重建单元测试。

另外,由于重新过了一遍 Python 代码,他们还做了许多与性能无关的改进。因此,该文指出:

如果时间允许,回过头来看看旧有的代码总是好的。你也许会惊讶,它怎么会那么差。


感谢魏星对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群InfoQ 好读者)。

2015 年 9 月 24 日 19:005942
用户头像

发布了 1008 篇内容, 共 313.6 次阅读, 收获喜欢 282 次。

关注

评论

发布
暂无评论
发现更多内容

PyFlink 社区扶持计划正式上线!

Apache Flink

大数据 flink 流计算 实时计算 大数据处理

Apache Beam 大数据处理一站式分析

李孟

Java 大数据 数据中台 数据交换 Beam

vue项目中遇到的依赖及其他问题

靖仙

Vue 前端 Web 前端开发

最佳实践 | Flink Forward 全球会议抢先看!

Apache Flink

大数据 flink AI 流计算 实时计算

一行代码实现网站可编辑,并解决网站禁止复制的限制

王坤祥

复制 破解 DOM

读书·行路·问心·求道

黄崇远@数据虫巢

读书笔记 个人成长 读书

原创 | OOAD范例:配置类设计

编程道与术

什么是全光架构?光纤KVM和分布式IP KVM系统知多少?

DT极客

在InfoQ开启写作之旅

张先亮-Hank

人工智能 随笔

Flink State 最佳实践

Apache Flink

大数据 flink AI 流计算 实时计算

零基础应该如何学习爬虫技术?

极客时间

Python 编程 爬虫

SpringBoot中如何优雅的使用多线程

读钓

Java spring Spring Boot

我入驻InfoQ平台啦

BlueblueWings

祝贺!两位 Apache Flink PMC 喜提 Apache Member

Apache Flink

大数据 flink 流计算 实时计算 大数据处理

Flink 消息聚合处理方案

Apache Flink

大数据 flink 流计算 实时计算 大数据处理

Flink SQL 的 9 个示例

Apache Flink

大数据 flink 流计算 实时计算 大数据处理

初文,大浪淘沙

傅丞 Tony

Flink 的经典场景和业务故事有哪些?看看他们就知道了

Apache Flink

大数据 flink 流计算 实时计算 大数据处理

什么是物联网中台

老任物联网杂谈

物联网中台 IOT Platform 物联网平台

Iceberg 在基于 Flink 的流式数据入库场景中的应用

Apache Flink

大数据 flink 流计算 实时计算 大数据处理

LeetCode 120. Triangle

隔壁小王

算法 LeetCode

都在说实时数据架构,你了解多少?

Apache Flink

大数据 flink 流计算 实时计算 大数据处理

XOR异或运算在计算机中的应用

王坤祥

XOR 异或运算 对称加密

经验可能反而阻碍你的新认知

孙苏勇

思考 读书

你的文章中为什么会有加粗的文字

小天同学

思考 写作 感悟

centos7.6操作系统安装

桥哥技术之路

Linux

Python 有哪些黑魔法?

极客时间

Python 编程语言

关于PHP内存溢出的思考

L

php

PMP-识别风险、定性风险、定量分析工具和技术汇总对比

飞哥

项目管理 pmp

作为程序员,有哪些写作平台值得推荐 ?B站也算吧

邓瑞恒Ryan

学习 创业 写作 知识管理 自我提升

18个PPT,29个提问解答,都在这儿啦!

Apache Flink

大数据 flink 流计算 实时计算 大数据处理

2021年全国大学生计算机系统能力大赛操作系统设计赛 技术报告会

2021年全国大学生计算机系统能力大赛操作系统设计赛 技术报告会

Repustate从Python迁移到Go,性能提高10倍-InfoQ