在 NAutobot 中使用 Redis 进行任务排队是否可以保证事务安全?

在 NAutobot 中使用 Redis 进行任务排队是否可以保证事务安全?

我们想使用汽车人将机器状态存储在自定义字段

为了防止两个服务同时更新此自定义字段,需要适当的事务安全性。如果我理解 NAutobot 文档的话,使用 Redis确保了这一点。

有实际经验的人可以证实这一点吗?

答案1

因为我从一位维护人员那里得到了答案,所以我在这里回答我自己的问题Github

Redis 本身并不能保证这一点,但是我们当前正在使用的用于任务的库(RQ)确实在一定程度上保证了操作的顺序,因为每个工作者一次只能处理一个作业。

对于大多数情况(包括自定义字段),这不是一个问题,因为所有数据库写入都发生在事务中,因此同时更新同一对象的竞争条件实际上不可能发生。

IP 地址对象的并发写锁有所不同。这是因为 Nautobot 中的功能允许同时从网络前缀请求空闲地址空间(例如“给我 192.168.0.0/24 中的下 10 个可用 IP...”),并立即分配请求返回的任意数量的空闲地址(例如“...并分配它们”)。为此,查询返回的 IP 列表会立即写回到数据库,创建新的 IPAddress 对象,从而将它们从空闲池中删除。

IPAddress 对象没有唯一性约束,因此如果没有此显式写入锁定,两个调用者可能会从同一块请求 IP,接收相同的空闲地址,并尝试分配重复的 IP。这违反了最小惊讶原则,但并未违反数据模型,因此此处的 Redis 写入锁定是保持合理预期的关键:第一个接收锁定的调用者将分配 IP,而下一个调用者要么收到正确的列表,要么无法分配地址,因为它们不再空闲。

我希望这回答了你的问题!

相关内容