我正在构建一个涉及大量图像处理的应用程序。我们在分布式庄园中构建它,任意数量的渲染机器从 RabbitMQ 交换器接收渲染图像的请求。
因为在渲染过程中可能会收到图像请求,并且因为我不想让两个渲染服务器重复工作,所以我在 mySQL 图像表中创建了一个名为 is_rendering 的列作为 bool 值。
当渲染服务器收到渲染请求时,它会遵循一系列如下所示的步骤:
- 选择更新图像行
- 如果 is_rendering == true 中止渲染请求
- 设置 is_rendering == true 并提交事务
- 渲染图像并将缩略图存储在全局可访问的存储中
- 设置 is_rendering == false 并返回
它确实有效,但我担心这些频繁的数据库更新看起来有点傻。此外,我正在考虑渲染服务器在渲染过程中失败并离开 is_rendering == true 的边缘情况,从而阻止该图像被渲染。我正在考虑解决这个问题的方法是将 is_rendering 列从 tinyint(1) 更改为 datetime 字段,并将锁定日期存储为“true”值,将 null 存储为“false”值。定期服务健康检查可以选择超过特定时间段且具有 is_rendering 值的所有行,并在这种情况下释放锁定。
这是解决这个问题的明智方法,还是我应该考虑其他更优雅的方法?
最佳答案
亲爱的,据我了解您的问题,如果您遵循以下规则,您的第一种方法也是正确的: 1)你的表类型是innoDB。 2)您在代码中使用交易。因为如果在更新期间发生任何中断,它将回滚。
最后,您的第二种方法也更好。如果你没有满足我提到的要点
关于mysql - 使用 mySQL 列是实现全局锁定的明智方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10368144/