首页 文章

生产环境 者 - 消费者和数据库队列

提问于
浏览
1

我有一个 生产环境 者消费者机制, I am forced to store produced items 在数据库中,这是一个要求 . 此外,我有几个 生产环境 者和几个消费者, 生产环境 者和消费者线程将访问几个数据库表中的记录; ProcessID列将确定哪个线程正在访问哪条记录 .

线程将通过Windows服务工作 .

ProcessID的创建有三个原因 .

  • 1-如果线程未正常终止,则将使用processID来避免重新启动处理 .

  • 2-线程通过数据库锁定同步,希望我只能获得Row锁,并且可能在短时间内几乎没有被阻塞的线程,因为每个线程都会访问少量标记有ProcessID的记录 .

  • 3-我想跟踪哪个线程在哪个时间做了什么,因为我将错误记录到数据库中 . 请注意,消费者会将项目发送到Web服务 .

如果我使用In-Memory数组作为队列,我怀疑它会增强性能,它有以下缺点: -

  • 当消费者对项目进行解除队列时,它必须使用其processID更新其在数据库中的记录 .

  • 生产环境 者将项目插入数据库,并使用输出stp参数获取其ID,然后它将该项目放入队列中,其ID不会从数据库中重新读取,这是内存队列的唯一好处,避免重新读取数据库中的项目 . 请注意,一旦在DB中插入记录,除了使用者之外什么都不会更新它 .

  • 另一个问题是,我假设操作员可以通过从数据库中删除它来停止使用某个项目 . 如果我在内存队列中使用,我将失去这个未来 .

  • Queue类必须锁定私有对象,应同步访问队列方法 . 我觉得我正在重复一个线程被饿死的可能性 . 而且我觉得我正在复制一个线程被阻塞等待的时间 .

Two Questions

1-我想念这个设计中的一些东西吗?你觉得它会起作用吗?

2-不使用内存中队列是个好主意吗?

1 回答

  • 0

    也许我错过了一些东西,但我仍然会将一个中央内存队列作为一种服务,它也会处理正确的流程检索策略,并使用状态更新产品行 . 我不认为这是一个巨大的开发开销 .

    您自己明确表示,线程将在短期内被阻止 . 如果您可能需要增加线程数,这样的队列将获得回报 .

    至于此,您可以在交给消费者之前仔细检查:

    另一个问题是,我假设操作员可以通过从数据库中删除它来停止使用某个项目 . 如果我在内存队列中使用,我将失去这个未来 .

    而且,当然,这是一个更清晰的设计......当 生产环境 者和消费者只负责 生产环境 和消费物品时,您将遵循单一责任原则 .

    至于:

    1-我想念这个设计中的一些东西吗?你觉得它会起作用吗?

    ..我没有看到不应该工作的原因 . 因此,您必须根据整体情况做出最终决定 .

相关问题