我在Google App Engine上有大约一百万个实体的“队列”。我必须使用查询从队列中“弹出”项目。

各地运行着许多客户端进程,这些进程不断向堆栈发出请求。我的问题是,当一个客户端请求一个项目时,我要确保从队列的最前面删除该项目,然后将其发送到该客户端进程,而没有其他进程。

当前,我正在查询该项目,修改其属性,以便对队列的查询不再包括该项目,然后保存该项目。使用此方法,通常一件商品同时发送到多个客户进程。我怀疑这是因为在进行写入以及将其反射(reflect)到其他进程时存在延迟。

也许我需要以某种方式使用事务,但是当我调查时发现有一些“陷阱”。解决这个问题的好方法是什么?

最佳答案

我看到两种解决方法:

  • 您正在做的事还可以,您只需要使用事务即可。如果您的流程时间超过30秒,则可以将其卸载到任务队列中,这可以作为事务的一部分。
  • 您可以使用Pull Queues,在其中填充队列,然后客户端进程以原子方式(租借-删除周期)从队列中提取任务。使用拉入队列,您可以确保任务仅被租借一次。另外,任务必须在完成后从队列中手动删除,这意味着如果您的进程死亡任务将在租约到期后重新放入队列中。
  • 关于python - Google App Engine的线程类型解决方案,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9795585/

    10-14 09:36
    查看更多