在Google数据存储交易中删除

问题描述 投票:0回答:1

我正在测试Google数据存储区,以查看是否可以将其用于队列。由于有多个工作人员退出队列,因此我试图查看如何使用事务。

在这段代码中,我模拟了10个客户机,它们都在查询下一个作业ID,并将其删除。

我收到此错误-不适用于数据存储吗?

错误:10已中止:这些数据存储区实体上的争用过多。请重试。

const ids = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

// await insertion of 10 records
await Promise.all(ids.map(async (id) => {
    let key = datastore.key(['Task', id]);
    let data = {id, queued_at: new Date().toISOString()};
    return datastore.save({key, data});
}));

// await 10 transactions trying to pull and delete from the same queue
await Promise.all(ids.map(async () => {
    const transaction = datastore.transaction();
    await transaction.run();
    const query = transaction
        .createQuery('Task')
        .order('queued_at', {
            descending: false,
        });

    const [results] = await transaction.runQuery(query);
    const result = results[0];

    if (result && result.id) {
        console.log(`deleting ${result.id}`);
        transaction.delete(datastore.key(['Task', result.id]));
    }
    transaction.commit();
    return result && result.id;
}));
node.js google-cloud-datastore
1个回答
1
投票

您正在达到数据存储的Enitity写限制:

https://cloud.google.com/datastore/docs/best-practices#entities

通常,将这种类型的数据库用作有序队列被认为是一种反模式,因为入队和出队操作均会导致热点发现特定的键范围。如果您需要异步处理事务排队的任务,请考虑使用任务队列。

© www.soinside.com 2019 - 2024. All rights reserved.