1

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

线程将通过 Windows 服务工作。

ProcessID 的创建出于三个原因。

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

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

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

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

  • 当消费者将一个项目出队时,无论如何它都必须用它的 processID 更新它在数据库中的记录。

  • 生产者将项目插入数据库,并使用 Output stp 参数获取其 ID,然后将项目以其 ID 放入队列中,避免从数据库中重新读取它,这是内存队列的唯一好处,避免从数据库中重新读取一个项目。请注意,一旦在数据库中插入一条记录,除了消费者之外,没有任何东西会更新它。

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

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

两个问题

1-我错过了这个设计中的一些东西吗?你认为它会起作用吗?

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

4

1 回答 1

0

也许我遗漏了一些东西,但我仍然会创建一个中央内存队列作为一项服务,该服务还将负责正确的流程检索策略,并使用状态更新产品行。我不认为这是一个巨大的开发开销。

您自己清楚地说明了线程会在短期内被阻塞的情况。如果您可能需要增加线程数,这样的队列会得到回报。

至于这一点,您可以在移交给消费者之前仔细检查:

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

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

至于:

1-我错过了这个设计中的一些东西吗?你认为它会起作用吗?

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

于 2013-07-02T09:50:49.887 回答