【问题标题】:Design Guidelines Distributed computing设计指南 分布式计算
【发布时间】:2010-09-29 06:13:52
【问题描述】:

我有一个同时在多台机器上执行 OCR 的软件系统。当前系统的工作原理如下:

  1. 所有需要 ocred 的文档都插入到 db 中的表中。
  2. 每个客户端 ocr 机器将该表池化,每当找到 ocr 数据时,它都会锁定表并选择 n 号。 ocr 的文件。锁定用于原子性。
  3. 创建每个文档后,文档的状态将更新为完成。

我知道将数据库设置为同步位置是一个严重的错误。它运行良好,但有时我会看到数据库死锁..

所以我的问题是,设计这样的系统的更好方法是什么,我只希望数据库作为存储设备而不是同步位置。我想听听你的想法。

【问题讨论】:

    标签: c# .net system


    【解决方案1】:

    好吧,您可以在表中有一列表示当前是否正在处理记录。在事务中,获取当前未处理的记录的数据,并更新记录以说明它现在正在处理。那里如何处理争用的细节取决于您创建的事务类型和您使用的数据库,但我怀疑事务应该是它的核心。

    假设您真的想要使用数据库而不是某种描述的消息队列。您可能会考虑将消息队列结合与数据库一起使用...有些数据库中内置了队列,这也很有用。即使您还想要数据库中的记录,您也可以有一个仅包含 ID 的队列 - 客户端可以从队列中提取下一个项目,然后获取数据。您可能仍想记录从队列中拉出项目的时间,以便如果客户端崩溃或类似情况,批处理作业可以放置任何失败的作业(例如,那些在一天前被拾取但没有还没有结果)回到队列中。

    【讨论】:

    • 感谢您的及时回复,我实际上已经做了您在第一段中提到的类似事情。但是我对这个解决方案并不满意。
    • @Int3:为什么不呢?我不建议在处理数据时保持事务打开 - 只是将其标记为正在进行中。
    【解决方案2】:

    使用数据库轮询ocr文件,最好使用windows消息服务。如果数据库已关闭并且您的 ocr 服务正在运行,除非数据库服务启动,否则 ocr 服务将不会启动,使用 Windows 消息队列,您可以从消息服务(在线或离线)获取 ocr 文件的信息。行),这样机器启动后ocr服务会自动启动,不会出现数据库死锁的问题。

    【讨论】:

      猜你喜欢
      • 2011-12-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-19
      • 2014-05-20
      • 2012-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多