1

我有一个用 PHP 编写的复杂 appengine 服务,现在我想将它部分迁移到 Python。

假设我的服务有 2 个部分:/signIn/..../data/.... 我只想先迁移/signIn/部分,然后再迁移/data/

但是,由于我的服务很大,所以我想/signIn/在 Python 中构建新的部分,然后使用流量拆分对这部分进行一些 A/B 测试。

我的问题是流量拆分只能应用于版本,所以我的旧版本和新版本必须在同一个模块中,而同一个模块意味着它们必须用相同的语言编写(我错了,请参阅更新部分)。但我正在从 PHP 迁移到 Python。

对我来说最好的解决方案是什么?

谢谢,

解决方案

在 Dan Cornilescu 的帮助下,这就是我所做的:

  1. 将应用程序拆分为 2 个模块:默认和旧版本。
  2. 调度/signIn/到默认模块,其余到旧版本模块。
  3. 在 Python中制作另一个版本的/signIn/默认模块)
  4. 配置流量拆分以缓慢增加 Python 部分的请求百分比。这将使我们能够测试并确保没有发生严重的错误。

注意:该/signIn/部分必须是默认模块,因为 GAE 的流量拆分仅在默认模块下工作。

我确认我们可以为一个模块制作两个不同语言的版本。

4

1 回答 1

1

一种可能的方法是在第一步中将您的 PHP 应用程序拆分为模块。这不是完全浪费的努力,无论如何,大部分都需要让您的应用程序在多个模块中工作,与语言更改无关。我怀疑这实际上就是为什么你不能使用 A/B 测试——模块之间的不匹配。不可避免。

完成模块拆分后,您可以继续第二步 - 切换所选模块的语言,并按照您的预期进行 A/B 测试。

更大胆的做法是把2混在一起,/signin/直接用python写模块。在 PHP 方面,您只需删除该/signin/部分(前面提到的第一步的一部分)。只要您注意仅使用独立于应用程序语言的方式进行模块间通信/操作,就应该可以很好地工作:请求路径、cookie、数据存储/内存缓存键等。一个好的模块拆分几乎可以肯定地确保这一点。

除了 A/B 之外,您还有其他测试选项,例如:https ://stackoverflow.com/a/33760403/4495081 。

您还可以让新代码/模块能够并排/同时处理与旧代码/模块相同的请求,并使用dispatch.yaml文件来精细控制哪个模块实际服务于哪些请求。这可能允许非常集中的迁移,可能提供更高的测试信心。

我也不完全确定你实际上不能拥有不同语言的同一模块的 2 个版本——这些版本应该是相当独立的实例,每个版本都以自己的方式服务自己的请求,在最低层使用语言——独立的 GAE 基础设施服务。AFAIK 没有什么能阻止完整的应用程序重新编写和部署,无论版本是否相同 - 我在学习 GAE 时已经这样做了。但我没有切换语言,这是真的。我会试一试,但我现在没有时间学习一门新语言:)

于 2015-11-30T15:17:14.357 回答