GAE 数据存储/任务队列——每个用户一次只保存一个项目

GAE Datastore / Task queues – Saving only one item per user at a time

我开发了一个 python 应用程序,它可以从收到的电子邮件中注册信息并将此信息保存到 GAE 数据存储区。注册电子邮件就可以了。作为注册的一部分,具有相同主题和收件人的电子邮件会获得一个对话 ID。然而,有时电子邮件接连进入系统的速度如此之快,以至于来自同一对话的电子邮件不会获得相同的 ID。发生这种情况是因为同时处理来自同一对话的两封电子邮件,并且 GAE 在 运行 对此对话进行查询时尚未看到另一个条目。

我一直在想办法防止这种情况发生,并且认为系统最好一次只处理每个用户一封电子邮件(每个发件人都有自己的帐户)。这可以通过有一个推送任务队列来完成,该队列首先检查当前是否有正在为该用户处理的电子邮件,如果是,则将新任务放入拉队列中,一旦前一个任务处理完毕,就可以从中检索它已完成。

这样做的最大缺点是(我认为)我不能 运行 异步推送队列,这显然是一个很大的性能缺点。关于什么是设置此类流程的更好方法有什么想法吗?

显然这是典型的竞争条件。我已经使用事务功能来防止多个进程同时写入。可以在此处找到文档:https://cloud.google.com/appengine/docs/python/datastore/transactions