我有一个应用程序,它以最简单的形式从数据库读取大量电话号码(约1500万),并将每个号码一次一行地发送到url进行处理。我设计的应用程序如下:
问题是:它仍然需要很长时间才能完成。MSMQ对它可以接收的消息的大小也有限制,现在我必须创建多个消息队列。我需要大量的容错能力,但由于性能原因,我不敢让消息队列具有事务性。我正在考虑将消息队列(目前是一个私有队列)发布到active目录中,以便进程能够从不同的系统中将它排出队列,这样就可以更快地完成任务。而且,我的处理器在执行过程中达到了100%,此时我正在将它更改为使用线程池。如果JMS能更好地处理队列,我现在就愿意研究它。到目前为止,整个处理中最有效的部分是SSIS部分。
我希望听到更好的设计方法,特别是如果您以前处理过此类卷的话。如果它能更好地处理这种情况,我准备切换到unix或lisp。
谢谢。
发布于 2010-06-29 15:05:35
下面是一个简单的超级实用主义解决方案:
首先,将文本文件拆分为较小的文件,每个文件中可能包含大约10,000个条目。让我们称他们为numbers_x.queue。
创建一个基于线程池的应用程序,其中每个线程使用以下步骤处理文件:
logging
H 19对.done文件的编号H 212H 113如果文件尚未结束,goto 3H 214H 115删除队列文件,然后,done文件
继续
虽然这是一种非常粗糙的方法,但它非常容易实现,非常容错,您可以轻松地将.queue文件拆分到一组服务器之间,并让它们并行工作。
发布于 2010-06-29 14:50:32
我没有MSMQ方面的经验,只是一个一般性的问题。为什么在开始时在队列中读取整数列表?为什么不从文本文件中读取一个数字,然后处理它,然后再读取?同时读取对象中的所有数字可能会超过RAM限制,而分页将导致RAM和页文件之间交换对象的延迟。
发布于 2010-06-29 14:51:22
您也可以通过web服务公开对电话号码的访问。它不需要读取MSMQ的进程,而是可以提示web服务输入一批可以标记为锁定在SQL中的电话号码。然后,它可以调用表示成功或失败的web服务,因此可以将它们标记为已完成或未标记为锁定在SQL中。这样,您就不必不必要地批量选择所有行并阻塞系统,从而获得SQL本身的容错能力。
此外,如果行在很长一段时间内没有响应,则可以对其进行一些维护,将其解除标记为锁定,然后如果原始调用方最终返回给您,则忽略结果。您可以通过用某种形式的调用者ID标记行来实现这一点。
或者,放弃web服务,直接连接到数据库。无论哪种方式,它都提供了容错,它的实现简单,它的速度和你要得到的一样快,它可以分布在许多处理计算机上。
https://stackoverflow.com/questions/3141790
复制相似问题