1

我有一个类似于经典生产者消费者问题的应用程序。只是想检查所有可能的实现来实现它。问题是-

过程A:向数据库中的表中插入一行(生产者)

进程B:从表中读取M行,处理后删除读取的M行。

进程 B 中的任务: 1. 读取 M 行 2. 处理这些行 3. 删除这些行

进程 A 的 N1 个实例,进程 B 的 N2 个实例同时运行。

每个实例在不同的盒子上运行。

一些要求:如果进程 p1 正在读取 (0,M-1) 行。进程 p2 不应该等待 p1 直到它释放对这些行的锁定,而是应该读取 (M,2M-1) 行。

4

4 回答 4

0

我敢打赌,有比使用 DB 作为生产者和消费者之间的交换器更好的并行处理方法。为什么不排队?您是否检查过为Map/Reduce设计的工具/框架。Hadoop、GridGain、JPPF 都可以做到这一点。

于 2011-01-24T07:32:14.233 回答
0

Java.15 的 ConcurrentHashMap 中使用了类似的概念。应单独维护正在处理的行列表。当任何进程需要与 DB 交互时,它应该检查该行是否正在被另一个进程处理。如果是这样,它应该等待那个条件,否则它可以处理。在这种情况下,维护索引可能会有所帮助

于 2011-01-24T07:32:23.097 回答
0

我认为如果实现了这个应用程序,它实际上使用了手工制作的队列。我相信 JMS 在这种情况下要好得多。有很多可用的 JMS 实现。其中大多数是开源的。

在您的情况下,流程 A 应该将任务插入队列。进程 B 应该被阻塞receive(),获取 N 条消息然后处理它们。您可能有理由从队列中获取大量任务,但如果您将实现更改为基于 JMS,您可能根本不需要它,因此您可以只听队列并立即处理消息。实现变得几乎微不足道,非常灵活和可扩展。您可以根据需要运行任意数量的进程 A 和 B,并将它们分布在不同的盒子中。

于 2011-01-24T07:38:40.780 回答
0

您可能还想看看 Amazon Elastic Map Reduce

http://aws.amazon.com/elasticmapreduce/

于 2011-01-24T07:40:50.513 回答