首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >重异步处理

重异步处理
EN

Stack Overflow用户
提问于 2010-06-29 14:44:07
回答 5查看 1K关注 0票数 5

我有一个应用程序,它以最简单的形式从数据库读取大量电话号码(约1500万),并将每个号码一次一行地发送到url进行处理。我设计的应用程序如下:

  1. 使用SSIS将电话号码从
  2. 大容量导出到文本文件。
  3. 将这些数字加载到消息队列中(我目前使用MSMQ )。
  4. 将命令行应用程序中的消息排出队列,并通过http将请求发送到某些服务,比如每个电话号码3次,最后登录到数据库。

问题是:它仍然需要很长时间才能完成。MSMQ对它可以接收的消息的大小也有限制,现在我必须创建多个消息队列。我需要大量的容错能力,但由于性能原因,我不敢让消息队列具有事务性。我正在考虑将消息队列(目前是一个私有队列)发布到active目录中,以便进程能够从不同的系统中将它排出队列,这样就可以更快地完成任务。而且,我的处理器在执行过程中达到了100%,此时我正在将它更改为使用线程池。如果JMS能更好地处理队列,我现在就愿意研究它。到目前为止,整个处理中最有效的部分是SSIS部分。

我希望听到更好的设计方法,特别是如果您以前处理过此类卷的话。如果它能更好地处理这种情况,我准备切换到unix或lisp。

谢谢。

EN

回答 5

Stack Overflow用户

发布于 2010-06-29 15:05:35

下面是一个简单的超级实用主义解决方案:

首先,将文本文件拆分为较小的文件,每个文件中可能包含大约10,000个条目。让我们称他们为numbers_x.queue。

创建一个基于线程池的应用程序,其中每个线程使用以下步骤处理文件:

logging

  • Append
  1. 查找一个名为numbers_x.done的文件,如果它存在,则查找它中的最后一个完整号。如果您在numbers_x.queue中找到了一个.done文件扫描,以将自己定位在.done文件中最后一个文件的后面。
  2. 从.queue文件
  3. 读取一个数字,.queue文件
  4. 完成web api调用

H 19对.done文件的编号H 212H 113如果文件尚未结束,goto 3H 214H 115删除队列文件,然后,done文件

  1. 获取另一个未处理的.queue文件,并从1

继续

虽然这是一种非常粗糙的方法,但它非常容易实现,非常容错,您可以轻松地将.queue文件拆分到一组服务器之间,并让它们并行工作。

票数 2
EN

Stack Overflow用户

发布于 2010-06-29 14:50:32

我没有MSMQ方面的经验,只是一个一般性的问题。为什么在开始时在队列中读取整数列表?为什么不从文本文件中读取一个数字,然后处理它,然后再读取?同时读取对象中的所有数字可能会超过RAM限制,而分页将导致RAM和页文件之间交换对象的延迟。

票数 0
EN

Stack Overflow用户

发布于 2010-06-29 14:51:22

您也可以通过web服务公开对电话号码的访问。它不需要读取MSMQ的进程,而是可以提示web服务输入一批可以标记为锁定在SQL中的电话号码。然后,它可以调用表示成功或失败的web服务,因此可以将它们标记为已完成或未标记为锁定在SQL中。这样,您就不必不必要地批量选择所有行并阻塞系统,从而获得SQL本身的容错能力。

此外,如果行在很长一段时间内没有响应,则可以对其进行一些维护,将其解除标记为锁定,然后如果原始调用方最终返回给您,则忽略结果。您可以通过用某种形式的调用者ID标记行来实现这一点。

或者,放弃web服务,直接连接到数据库。无论哪种方式,它都提供了容错,它的实现简单,它的速度和你要得到的一样快,它可以分布在许多处理计算机上。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3141790

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档