我们最近有一个有趣的机会, 可以在雨林试验部署现代 python 工人。我们过去在 Heroku[1] 上承载了大部分堆栈, 但它并不适合这个特殊的用例。这篇文章解释了我们面临的挑战以及我们是如何解决这一问题的, 同时也提到了一系列很酷的工具, 这些工具使开发和部署比几年前痛苦得多。

python 工作人员的动态缩放

那么我们的任务是什么呢?我们想运行 python 工人, 每个工人都要在几分钟到几个小时之间。我们还希望能够灵活地支持成千上万的员工在高流量期间同时运行, 而无需在需求较低的时候支付基础设施费用–基本上是动态扩展。当您习惯构建 web 应用程序时, 需要获取1以上的请求被认为是糟糕的, 您的需求更稳定一些, 您必须稍微改变您的视角, 可能还需要稍微改变您正在使用的工具。heroku 可以很好地工作的一些事情, 但动态缩放并不是真正的其中之一 (像 hirefire 的东西可以帮助, 但我们发现, 我们想要更多的灵活性)。

我们想要支持的其他东西: 现代 python 与我们想要的科学堆栈的任何部分 (numpy, scipy, 科学-学习, opencv) 和简单的部署。我不知道你, 但遵循现代软件开发的最佳实践给了我一个奇怪的满意度, 所以确保我们有体面的测试覆盖率, cicd 管道设置和自动执行的编码风格是很有趣的。不要评价我。

因此, 要重新迭代, 以下是我们想要的:

  • 可扩展到成千上万的并行工作人员, 在停机时无需任何成本。
  • 灵活地运行每个工作人员在一分钟到一个小时之间的任何地方。
  • 轻松部署不平凡的代码 (例如, 从 python 调用的 c 或 go 扩展)。
  • 体面的测试覆盖率和 ccicd 设置。
  • 现代 python (我们不一定要使用 ubuntu 附带的版本)。
  • 像代码样式检查这样的好东西。

我们的要求

在我们找到解决方案之前, 让我们把这个具体, 并制定出所有的要求从哪里来。雨林提供了 qa-a 即服务解决方案, 我们的客户用简单的英语编写测试, 我们将测试分发给人类执行。其中一些任务是重复的, 我们正在自动化尽可能多的这些任务, 同时将那些需要人类判断的任务 (“这个网站看起来还好吗?”) 留给人类。

我们的测试人员通过连接到我们为他们提供的虚拟机来执行测试: 每个测试人员都会获得一个新的虚拟机, 该虚拟机是专门为该测试创建的, 之后会销毁–这在操作上相当复杂, 但对重现性要求很高。这大致如下所示: 我们的 man 应用程序与大量虚拟机进行通信, 其中每个虚拟机都由人工控制。

python workers before

我们希望我们的自动化以同样的方式工作, 因为我们的虚拟机上有很多我们不想复制的基础结构。因此, 我们的自动化需要有效地伪装成人类, 并使用 mouse/keyboard 事件控制虚拟机, 接收屏幕截图并对 vm 的状态做出判断。测试可能需要一分钟到一个小时的时间才能完成, 因为它可以有效地运行和人的速度, 因此我们实际上希望我们的基础结构如下所示:

python workers after这可能并不令人惊讶, 但 docker 使您可以很容易地将代码与您想要分发的任何基础结构和库一起运输。是否要自己构建 opencv 并使用其 python 绑定?是否要随代码一起运送 go 库?你想从 python 给 ruby 打电话吗?没问题, 这对 docker 来说都是相当容易的 (并不意味着你真的应该做最后一个)。我已经把一个示例码头文件作为 gist , 这样你就可以看到这在实践中的外观。

皮恩夫

这将是一个很好的 pyenv 时间谈论。它是在您的计算机上管理多个 python 版本的一个很好的工具。在引擎盖下, 它是一堆 “公正” 的 shell 脚本, 它使获得新版本的 python 一样容易 pyenv install 3.7.1 。如果你想利用新的发光功能, 如f-字符串数据类, 这可能是你最好的选择!

皮本夫

多年来, 我们都一直在使用 pip 来管理我们项目中的 python 包, 但 Pipenv 它是一个稍微现代一点的工具, 有很多很好的优势。我会让你看视频, 以获得细节, 但如果你曾经使用和喜欢 requests (特别是如果你必须处理原始之前) urllib , 你很可能会喜欢使用太–它也是 Pipenv 由肯尼斯雷茨写的。

皮拟

这也是一个相当标准的建议, 但如果你能使用, pytest 测试会好很多。除其他优点外, 它还为您提供了很好的断言、夹具等语法, 几乎是当今测试 python 应用程序的标准方法。

我们使用 circleci 来满足我们所有的 ci\ cd 需求, 这对一些事情很有用: 除了测试之外, 您还可以将其配置为构建 docker 容器并将其推送到注册表。我们使用aws ecr, 因为我们希望稍后将它们与批处理一起使用。

出于可能并不完全理性的原因, 在这里的所有工具中, 我最 black 喜欢。它是 python 代码的自动格式化程序, 基本上没有配置, 这意味着如果您使用它, 您必须接受它固执己见的方法。这是一件伟大的事情!突然间, 代码样式成为你甚至不需要考虑的东西–你可以只设置你的代码编辑器, 在保存上自动格式化你的代码, 你可以不再关心使用哪些引号, 如何分解你的台词, 等等。按 “保存”, 您的所有代码就会神奇地变得漂亮地符合 pep8 标准。

您还可以更进一步, 将测试添加到测试套件中, 如果提交了任何新代码, 该测试将失败, 而该测试不遵循样式 ( black --check )。

aws 批次

最后, 我们基础设施的一个关键部分是这基本上就是它–在一些设置的代价下, 你可以有一个相当好的和灵活的方式来运送 python 代码的长期生活的工人。希望能有所帮助!

[1] 情况已经不是这样了–我们最近在 gcp 上迁移到了 kubernetes。这也对这个项目有影响, 因为我们最终可能也会将这个基础设施迁移到 kubernetes。请继续关注有关此的未来帖子!

Comments are closed.