- 内容提要
- 前言
- 作者简介
- 封面简介
- 第1章 理解高性能 Python
- 第2章 通过性能分析找到瓶颈
- 2.1 高效地分析性能
- 2.2 Julia 集合的介绍
- 2.3 计算完整的 Julia 集合
- 2.4 计时的简单方法——打印和修饰
- 2.5 用 UNIX 的 time 命令进行简单的计时
- 2.6 使用 cProfile 模块
- 2.7 用 runsnakerun 对 cProfile 的输出进行可视化
- 2.8 用 line_profiler 进行逐行分析
- 2.9 用 memory_profiler 诊断内存的用量
- 2.10 用 heapy 调查堆上的对象
- 2.11 用 dowser 实时画出变量的实例
- 2.12 用 dis 模块检查 CPython 字节码
- 2.13 在优化期间进行单元测试保持代码的正确性
- 2.14 确保性能分析成功的策略
- 2.15 小结
- 第3章 列表和元组
- 第4章 字典和集合
- 第5章 迭代器和生成器
- 第6章 矩阵和矢量计算
- 第7章 编译成 C
- 第8章 并发
- 第9章 multiprocessing 模块
- 第10章 集群和工作队列
- 第11章 使用更少的 RAM
- 第12章 现场教训
12.1 自适应实验室(Adaptive Lab)的社交媒体分析(SoMA)
Ben Jackson (adaptivelab.com)
自适应实验室是一家座落于伦敦的技术城市(Tech City)区——肖尔迪奇区的产品开发和创新公司。我们应用了我们的精益生产、以用户为中心的产品设计和交付方法,与包括从创业公司到大企业在内的许多公司展开了广泛的合作。
YouGov是一家全球市场研究公司,它所声称的雄心抱负就是提供一个连续的、准确的数据流来洞见全世界的人们在想什么和做什么——那就是我们要设法提供给它们的东西。自适应实验室设计了一种方式来被动倾听发生在社交媒体上的真实的讨论,并且洞见了用户对定制范围内的一些主题上的情感。我们构建了一个可扩展的系统,能够无穷无尽地捕获大量的信息流,处理并存储它们,还能够通过一个强大的可过滤的接口来实时展现它们。系统是使用Python来构建的。
12.1.1 自适应实验室(Adaptive Lab)使用的Python
Python是我们的核心技术之一。我们在性能关键的应用中使用它,并且无论何时,我们和具有公司内部使用Python技术的客户一起工作,这样我们为客户所做的产品能够在客户公司内部被采用。
Python对于小型的、自包含的并且长期运行的守护进程来说是理想的,它很好用,具有类似Django和Pyramid那样灵活而特性丰富的Web框架。Python社区是繁荣的,这意味着那里有大量的开源工具库来允许我们快速而充满信心地去构建,让我们集中精力于新型的、创新性的东西来为客户解决问题。
贯穿于我们整个项目的是,我们在自适应实验室复用了用Python构建的几个工具,但是却能够以一种语言无关的方式来使用。例如,我们使用了SaltStack来做服务器配给,使用了Mozilla的Circus来管理长期运行的进程。当一个工具是开源的并且以我们所熟悉的语言来写成时,所带给我们的好处就是如果我们发现任何问题,我们能够自己解决,并且把那些解决方案提上去,这让社区也得到收益。
12.1.2 SoMA的设计
我们的社交媒体分析工具需要处理高吞吐量的社交媒体数据,以及存储和获取大量的实时信息。在研究了各种各样的数据存储和搜索引擎后,我们决定把Elasticsearch作为我们的实时文档存储。就如它的名字所示的那样,它是高可扩展的,但是也非常容易使用,而且能够提供统计和搜索的应答——对我们的应用来说是理想的。Elasticsearch本身是用Java构建的,但是就像任何一个现代系统中的架构良好的组件那样,它有良好的API,而且使用Python库和教程良好地为它服务。
我们设计的系统使用了在Redis中所持有的Celery作为队列来快速分发大量的数据流给任意数量的服务器来做独立处理和索引。整个复杂系统的每一个组件被设计得小型化、独立而简单,并且能够相互隔离地来工作。每一个组件集中于一个任务上,比如分析一个对话的感情色彩或者准备一个文档来索引编入Elasticsearch。一些组件被配置成使用Mozillar的Circus以守护进程的方式来运行,让所有的进程保持运行并允许它们在单独的服务器上水平扩张或收缩。
SaltStack被用来定义和配给复杂的集群,并处理所有的库、语言、数据库和文档存储的设置。我们也使用Fabric,一个在命令行上运行任意任务的Python工具。在代码中定义服务器有许多益处:与生产环境的完全对等,配置的版本控制,把所有东西放在了一起。它也为配置和集群所需依赖项的文档化发挥了作用。
12.1.3 我们的开发方法论
我们意图让项目的新手尽可能容易地能够快速而有信心地着手添加代码和部署。我们使用Vagrant来在本地构建复杂系统,在虚拟机内部完全和在生产环境中等价。一个简单的vagrant up就是一个新手所需的全部命令来着手设置他们工作所需的所有依赖。
我们以敏捷方式工作,一起计划、讨论架构方面的决定,并且在任务估计上达成了一致。对于SoMA来说,我们决定在每一次迭代中要包括一些被视作修正“技术债”的任务。也有些对系统进行文档化的任务包括了进来(我们最终建设了一个维基来掌管这个日益膨胀的系统的所有知识)。在每个任务结束后,组员相互检查代码来做完整性检查,提供反馈并理解将要加入系统中的新代码。
一个良好的测试套件有助于提升信心,任何改动将不会造成已经存在的特性失效。集成测试在一个类似SoMA的系统中至关重要,由许多移动的部件组成。一个脚手架的环境提供了一种测试新代码性能的方法。尤其是在SoMA上,只有通过在产品中所见到的那样大型的数据集上做测试,才能让问题出现并得到处理,所以经常需要在独立的环境下重现那样的数据量。亚马逊的弹性计算云(EC2)带给我们着手此事的灵活性。
12.1.4 维护SoMA
SoMA系统连续运行着,并且它消费的信息量与日俱增。我们不得不对数据流中的峰值、网络问题以及它所依赖的任何第三方服务提供者中的问题做出解释。因此,为了让我们自己的事情变得简单,SoMA被设计成自我修复,无论何时只要它有能力就自我修复。多亏了Circus,崩溃的进程将恢复运行并从它们断线的地方开始继续运行任务。一个任务将在队列中缓存起来,直到进程能够消费它,并且当系统恢复时,有足够的缓存空间来堆积任务。
我们使用Server Density来监控许多SoMA服务器。它设置起来很简单,但是相当强大。当一有问题可能要发生时,一个指派的工程师就能够在手机上接收到推送消息,这样他可以及时做出反应来确保它不要变成一个真正的问题。使用Server Density,用Python来写定制插件也非常容易,例如,来设置Elasticsearch表现方面的快速报警。
12.1.5 对工程师同行的建议
最主要的是,你和你的团体需要有信心并感到轻松愉快——将要部署到现场环境中去的项目是会无故障运行的。为了得到这一点,你必须要回溯工作,花费时间在系统的所有组件上来给你那种舒服的感觉。让部署简单并且安全可靠,使用一个脚手架环境来测试在真实世界的数据下的性能,确保你具有一个良好可靠的高覆盖率的测试套件,实现一个过程把新代码整合进系统中,确保技术债尽早地得到解决。你越是支撑强化你的技术架构并且提高你的过程,你的团队就会越来越愉快和成功地来把合适的解决方案工程化。
如果缺少扎实的代码基础和生态系统,但是商业上却强迫你把活干起来,那只会产生有问题的软件。那将是你的责任来推动并争取时间对代码、测试以及需要推向落地的运营作的操作做出增量式的改进。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论