【问题标题】:taskqueue and non-idempotent tasks任务队列和非幂等任务
【发布时间】:2023-03-19 04:22:02
【问题描述】:

我正在开发一个投票应用程序,用户可以在其中上传所有选民的电子邮件地址列表。在进行了一些错误检查后,我为每个选民创建了一个Voter 实体。由于可能有大量选民,我在任务队列中创建了Voter 实体以避免 30 秒的限制,任务如下所示:

    put_list = []
    for email, id in itertools.izip(voter_emails, uuids):
        put_list.append(Voter(election = election,
                              email = email,
                              uuid = id))
    election.txt_voters = ""
    put_list.append(election)
    db.put(put_list)

然而,这个任务不是幂等的。有没有办法让这个任务幂等?或者有更好的方法吗?

【问题讨论】:

    标签: python google-app-engine task-queue idempotent


    【解决方案1】:

    使用 key_name 而不是 uuid 属性来防止创建重复的选民实体。

    【讨论】:

    • 我喜欢这个想法,但我担心数据存储调用的数量。在上面的代码中只有一个 put。要使用命名键,我想我必须为每个选民(一个非常大的数字)加上一个 put 调用 get_or_insert。是否可以使用命名键进行批量操作?
    • 你应该能够使用put(),即使是key_name,并且新实例将替换旧实例上的所有属性。目前还不清楚您需要 uuid 做什么。我可能会这样做Voter(parent=election, key_name=email)
    • @TokenMacGuy,使用电子邮件作为键名是个好主意。我需要 UUID 来防止选民欺诈(UUID 发送到选民的电子邮件)。我想我不希望选民与选举在同一个实体组中,但我要问另一个问题。
    • @TokenMacGuy,实际上我不能使用电子邮件作为键名,因为它不能保证是唯一的(同一电子邮件可以用于两次不同的选举)。我想我可以为选举添加某种唯一 ID。
    猜你喜欢
    • 2014-08-17
    • 2011-12-13
    • 2017-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多