我正在测试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;
}));
您正在达到数据存储的Enitity写限制:
https://cloud.google.com/datastore/docs/best-practices#entities
通常,将这种类型的数据库用作有序队列被认为是一种反模式,因为入队和出队操作均会导致热点发现特定的键范围。如果您需要异步处理事务排队的任务,请考虑使用任务队列。