Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
googleappengine/python:我是否可以依靠任务队列重试来将插入保持在最低限度?_Python_Google App Engine - Fatal编程技术网

googleappengine/python:我是否可以依靠任务队列重试来将插入保持在最低限度?

googleappengine/python:我是否可以依靠任务队列重试来将插入保持在最低限度?,python,google-app-engine,Python,Google App Engine,假设我的应用程序有一个页面,人们可以在上面添加评论。 假设在添加每个注释后,会添加一个taskqueue worker。 因此,如果添加了100条注释,则会插入100个taskqueue (注:以上是一个假设的例子来说明我的问题) 假设我想确保插入的数量保持在一个合理的水平 最小值(因此我不会遇到10k插入限制) 我能做如下的事情吗 a) 添加每个注释时,请调用taskqueue.add(name=“stickytask”, url=“/blah”) -由于这是一个命名的taskqueue,如果

假设我的应用程序有一个页面,人们可以在上面添加评论。 假设在添加每个注释后,会添加一个taskqueue worker。 因此,如果添加了100条注释,则会插入100个taskqueue

(注:以上是一个假设的例子来说明我的问题)

假设我想确保插入的数量保持在一个合理的水平 最小值(因此我不会遇到10k插入限制)

我能做如下的事情吗

a) 添加每个注释时,请调用taskqueue.add(name=“stickytask”, url=“/blah”) -由于这是一个命名的taskqueue,如果 存在同名的taskqueue

b) /blah worker url读取新添加的注释,处理 第一个和 如果存在更多要处理的注释,则返回状态代码 不到200 -这将确保任务重试,并且在下次重试时 处理下一条评论 等等

因此,所有100条注释都通过插入一个或几个taskqueue来处理。 (注意:如果有一个间歇期 在活动中,不添加任何新注释,且所有注释均已删除 处理比 下一个添加的注释将导致新的taskqueue插入。)

然而,从文档(见下面的代码片段)中可以看出,“系统 将逐渐退出”。这是否意味着在每个“非200”Http上 返回状态代码延迟是否插入下一次重试

从文档中: 如果特定任务的执行失败(通过返回任何HTTP 状态代码不是200 OK),应用程序引擎将尝试重试,直到 它成功了。系统将逐渐后退,以免洪水泛滥 您的应用程序请求太多,但将重试失败
每天至少执行一次任务

没有理由假装失败(并招致退避&c)--这是一种老套而脆弱的安排。如果您担心简单地为每个新注释安排一个任务可能会超过任务队列当前的严格限制,那么就在存储中“批量”处理尚未处理的注释(我想可能也是在memcache中),以获得潜在的加速,但这是可选的),并且在那个时候不要安排任何任务

相反,让一个cron作业每分钟执行一次(比如说),这可能会处理一些注释,或者安排适当数量的任务来处理待定的注释——当您只安排一个cron作业的任务时,很容易确保您每天的计划不会超过10000个

不要让任务队列让您忘记这一点:用于“批处理式”处理的良好体系结构通常会同时使用cron作业和排队任务来简化其总体设计


为了最大化在单个请求中完成的有用的工作量(从以太排队任务或CRON任务),考虑基于CPU使用的方法——当CPU是限制每个请求可以执行的工作的因素时,这可以帮助您在一个请求中获得尽可能小的可调度的工作单元,这是谨慎可行的。我认为这种方法比等待一次失败、抓住它并迅速关闭要可靠得多,因为这可能会导致应用程序无法控制的其他后果。

没有理由假装失败(并招致退避&c)——这是一种既粗糙又脆弱的安排。如果您担心简单地为每个新注释安排一个任务可能会超过任务队列当前的严格限制,那么就在存储中“批量”处理尚未处理的注释(我想可能也是在memcache中),以获得潜在的加速,但这是可选的),并且在那个时候不要安排任何任务

相反,让一个cron作业每分钟执行一次(比如说),这可能会处理一些注释,或者安排适当数量的任务来处理待定的注释——当您只安排一个cron作业的任务时,很容易确保您每天的计划不会超过10000个

不要让任务队列让您忘记这一点:用于“批处理式”处理的良好体系结构通常会同时使用cron作业和排队任务来简化其总体设计


为了最大化在单个请求中完成的有用的工作量(从以太排队任务或CRON任务),考虑基于CPU使用的方法——当CPU是限制每个请求可以执行的工作的因素时,这可以帮助您在一个请求中获得尽可能小的可调度的工作单元,这是谨慎可行的。我认为这种方法比等待一个消息、抓住它并迅速关闭要可靠得多,因为这可能会导致应用程序无法控制的其他后果。

它真的是“黑客和脆弱”吗?我想我听到Brett Slatkin说他在pubsubhubbub的会议演讲中使用了类似的方法。如果有人能帮助证实这一点,那就太好了。回复:cron作业这是一个可行的回退,但实际上意味着“创建自己的任务队列”并让cron定期处理它。但它确实让你绕过了限制/天,这就是重点,对吗?而且,由于我误解了问题的真正意义,这里我要提到的是,Brett在他的google io演讲中将备份方案称为“简单指数方案”。@Bartosz感谢io链接()。0:57:10,Brett讨论了从100ms开始的指数退避方案。同样的谈话也谈到了名称的逻辑删除,所以我的问题的答案是,没有人不能依赖于taskqueue失败时重试,这是因为指数重试回退和名称逻辑删除@Bartosz你已经删除了你的答案。请重新插入它,这样我就可以把它选为最佳答案。@Bartosz re:但它确实让你绕过了限制/天。是的,你是对的,考虑到墓碑/指数退避问题将是一条出路。然而,在0:09:20的同一个演讲中,还有更多关于它的局限性。它真的是“黑客和脆弱”吗?我想我听到Brett Slatkin说他在pubsubhubbub的会议演讲中使用了类似的方法。如果有人能帮忙的话