我一直在审核appengine中的新“Modules API”,并尝试以最苛刻的任务通过dispatch.yaml路由到模块配置更强大的实例的方式组织应用程序。
但是,当尝试在调度程序中配置“ / mapreduce / ”uris时,它们似乎永远不会在正确的模块中运行,它们总是在默认模块中运行。
调度员看起来像这样:
application: simple-sample
dispatch:
- url: "*/mapreduce/*"
module: bigger-instance
- url: "*/_ah/pipeline/*"
module: bigger-instance
模块被定义为文档状态,默认位于app.yaml
,而bigger-instance.yaml
中的更大实例包含mapreduce处理程序条目,但到目前为止,每个mapreduce / *进程都在默认处理程序中执行。获取404的日志,因为处理程序在其他地方定义。
有什么想法吗?
答案 0 :(得分:3)
最简单的选择是设置mapreduce管道的target
属性。
pipeline = mapreduce.mapreduce_pipeline.MapreducePipeline( ... )
pipeline.with_params(target="version-dot-module")
pipeline.start()
将此target
传递给任务队列,并覆盖您遇到的任务队列default routing。如果没有指定模块的匹配版本,则使用模块的默认版本。您可以只指定"version"
,在这种情况下应用默认模块。指定不存在的模块将以默认模块的默认版本为目标,即使存在匹配的默认模块版本。
还可以为选定的任务队列定义目标,然后将管道路由到该队列。这种方法的局限性在于,路由适用于所有版本的调用代码,但也许在将路由详细信息保留在yaml文件而不是代码库中是有好处的。