我正在构建一个涉及大量图像处理的应用程序。我们在分布式庄园中构建它,任意数量的渲染机器从 RabbitMQ 交换接收渲染图像的请求。
因为在渲染过程中可能会出现对图像的请求,并且因为我不想让两个渲染服务器重复工作,所以我在 mySQL 图像表中创建了一个名为 is_rendering 的列作为布尔值。
当渲染服务器收到渲染请求时,它会执行一系列如下所示的步骤:
- 选择更新图像行
- 如果 is_rendering == true 中止渲染请求
- 设置 is_rendering == true 并提交事务
- 渲染图像并将缩略图存储在全局可访问的存储中
- 设置 is_rendering == false 并返回
它确实有效,但我担心这些频繁的数据库更新看起来有点傻。此外,我正在考虑渲染服务器在渲染过程中失败并留下 is_rendering == true 的边缘情况,从而阻止该图像被渲染。我正在考虑解决此问题的解决方案是将 is_rendering 列从 tinyint(1) 更改为 datetime 字段,并将锁定日期存储为“true”值,并将 null 存储为“false”值。在这种情况下,定期服务健康检查可以选择具有 is_rendering 值的所有行并释放锁定。
这是解决这个问题的明智方法,还是我应该考虑其他更优雅的方法?