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

时间:2013-07-02 08:52:53

标签: multithreading architecture thread-safety producer-consumer database-locking

我有一个生产者消费者机制,我被迫在数据库中存储生产的商品,这是一项要求。此外,我有几个生产者和几个消费者,生产者和消费者线程将访问几个数据库表中的记录; ProcessID列将确定哪个线程正在访问哪条记录。

线程将通过Windows服务工作。

创建ProcessID有三个原因。

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

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

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

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

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

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

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

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

两个问题

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

2-不使用In-Memory队列是个好主意吗?

1 个答案:

答案 0 :(得分:0)

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

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

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

  

另一个问题是,我认为操作员可以停止消费   通过从数据库中删除某个项目,如果我在内存中使用   排队,我将失去这个未来。

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

至于:

  

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

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

相关问题