我有一个用PHP编写的复杂的appengine服务,现在我想把它一部分一部分地迁移到Python。
假设我的服务有两个部分:/signIn/....
和/data/...
。我只想先迁移/signIn/
部分,然后再迁移/data/
。
但是,由于我的服务很大,所以我想用Python构建新的/signIn/
部分,然后使用Traffic Spliting对这部分进行一些A/B测试。
我的问题是,流量拆分只能应用于版本,所以我的旧版本和新版本必须在同一个模块中,,而同一模块意味着它们必须用相同的语言编写(我在这里错了,请参阅更新部分)。但我正在从PHP迁移到Python。
对我来说最好的解决方案是什么?
谢谢,
解决方案
在Dan Cornelescu的帮助下,这就是我所做的:
- 将应用程序分为两个模块:默认版本和旧版本
- 将
/signIn/
分派到默认模块,其余分派到旧版本模块 - 在Python中制作
/signIn/
的另一个版本(默认模块) - 配置Traffic Spliting以缓慢增加Python部分的请求百分比。这将允许我们进行测试,并确保不会发生严重的错误
注:/signIn/
部分必须是默认模块,因为GAE的流量划分仅在默认模块上工作。
我确认我们可以为一个模块制作两个不同语言的版本。
一种可能的方法是在第一步中将PHP应用程序拆分为模块。这并不是完全浪费精力,无论如何,大部分都是需要的,只需要让你的应用程序在多个模块中工作,而与语言变化无关。我怀疑这就是为什么不能使用A/B测试的原因——模块之间不匹配。不可避免的
模块拆分完成后,您可以继续执行第二步-切换所选模块的语言,并根据您的意愿进行A/B测试。
一种更勇敢的方法是将2混合在一起,直接用python编写/signin/
模块。在PHP方面,您只需删除/signin/
部分(前面提到的第一步的一部分)。只要您注意只使用与应用程序语言无关的方式进行模块间通信/操作,就应该工作得很好:请求路径、cookie、数据存储/内存缓存密钥等。一个好的模块拆分几乎肯定会确保这一点。
您有A/B以外的测试选项,如以下选项:https://stackoverflow.com/a/33760403/4495081.
您还可以让新的代码/模块能够并行/同时提供与旧代码/模块相同的请求,并使用dispatch.yaml
文件来精细地控制哪个模块实际提供哪些请求。这可能允许非常集中的迁移,有可能提供更高的测试信心。
我也不完全确定你实际上不可能有两个不同语言的同一模块版本——这些版本应该是非常独立的实例,每个版本都以自己的方式服务于自己的请求,在最底层使用独立于语言的GAE基础设施服务。AFAIK没有什么能阻止完成应用程序的重写和部署,无论版本是否相同——我在学习GAE时就已经这样做了。但我没有转换语言,这是真的。我会尝试一下,但我现在没有时间学习一门新语言:)