7

我正在构建一个涉及大量图像处理的应用程序。我们在分布式庄园中构建它,任意数量的渲染机器从 RabbitMQ 交换接收渲染图像的请求。

因为在渲染过程中可能会出现对图像的请求,并且因为我不想让两个渲染服务器重复工作,所以我在 mySQL 图像表中创建了一个名为 is_rendering 的列作为布尔值。

当渲染服务器收到渲染请求时,它会执行一系列如下所示的步骤:

  1. 选择更新图像行
  2. 如果 is_rendering == true 中止渲染请求
  3. 设置 is_rendering == true 并提交事务
  4. 渲染图像并将缩略图存储在全局可访问的存储中
  5. 设置 is_rendering == false 并返回

它确实有效,但我担心这些频繁的数据库更新看起来有点傻。此外,我正在考虑渲染服务器在渲染过程中失败并留下 is_rendering == true 的边缘情况,从而阻止该图像被渲染。我正在考虑解决此问题的解决方案是将 is_rendering 列从 tinyint(1) 更改为 datetime 字段,并将锁定日期存储为“true”值,并将 null 存储为“false”值。在这种情况下,定期服务健康检查可以选择具有 is_rendering 值的所有行并释放锁定。

这是解决这个问题的明智方法,还是我应该考虑其他更优雅的方法?

4

2 回答 2

0

我已经继续并将实现更改为使用DATETIME列。

我真的很好奇这是否是对 mySQL 的一般使用不当。根据我的研究,我可以使用 Hadoop 的 ZooKeeper:http: //zookeeper.apache.org/doc/r3.1.2/recipes.html或 Google 的内部 Chubby 系统。由于这只是服务的第一次迭代,我将坚持使用 mySQL。

从我在这里阅读的内容以及我在网上阅读的内容来看,使用 mySQL 作为产生全局锁的一种方式并不是一个糟糕的主意,将其更改为 DATETIME 列虽然有点迟钝,但最好的方法是实施过期策略来处理机器在处理作业过程中关闭的奇怪边缘情况。

持有事务级锁将是另一种方法,但是当单个服务器运行具有小连接池的多个线程时它没有意义,它会不必要地占用连接,尽管它有一个内置的过期时间客户端连接丢失。

于 2012-04-29T12:15:01.170 回答
0

亲爱的据我了解您的问题,如果您遵循以下规则,您的第一种方法也是正确的:1)您的表类型是 innoDB。2)您在代码中使用事务。因为如果在更新期间发生任何中断,它将回滚。

最后,您的第二种方法也更好。如果你不满足我提到的几点

于 2012-04-28T22:45:11.900 回答