2

我有一个 WCF 服务,它处理来自 SAP 的数万条记录的提要。服务调用将 XElement 作为其主要参数并处理 XML 以更新我们数据库中的记录。当前的意图是让 WCF 服务被异步调用,并让服务调用向调用者发送回相同的文档,其中包含处理的每条记录的状态。

我也在研究多线程处理数据的方法,尽管这最终可能不会给我买任何东西。

因为这可能需要一段时间,所以我担心如果 WCF 服务停止运行、重新启动等会发生什么情况。我需要知道我处理了哪些记录,哪些还没有处理,并且能够完成处理在剩下的记录上。

我能想到的最好的办法是用状态更新每个节点(无论如何,我必须这样做,以发送回调用者),然后将此文件保存到硬盘驱动器。但是保存一个可能达到 100,000 倍的大文件似乎并不可行。

在处理这些记录时,我还可以使用哪些其他策略来跟踪它们?

蒂亚!
詹姆士

4

4 回答 4

3

我认为使用 MSMQ 是满足您概述的大多数需求的好方法。如果您将节点分解为消息并将它们输入到事务队列中。

  • 通过让更多的机器在队列上进行处理,您可以更轻松地扩展数据的处理,从而最大限度地发挥其能力。
  • 如果 WCF “死亡、重新启动等”,您不会丢失任何东西。
  • 在这种情况下,您将遇到的真正问题是让客户端弄清楚服务在处理中的位置。队列消息只是一种方式。您可能需要另一个服务调用来评估处理队列的状态。

MSMQ WCF 操作方法的链接:

http://msdn.microsoft.com/en-us/library/ms789048.aspx

http://code.msdn.microsoft.com/msmqpluswcf

于 2010-12-10T18:00:27.957 回答
1

也许您可以首先将记录(来自您的 XML)放入您的数据库中,也许在一个特殊的“要处理的记录”表中。每行也可能用某种方式标记,以将它们与特定请求相关联。处理数据库中的行。在处理每一个时,更新状态字段(对应于您将在 XmlElement 上更新的节点状态)。完成后,您可以返回并更新 XML(如果您在此期间没有崩溃)或者您可以生成新的 XML(如果您不能往返转换 XML->database-> 可能会出现问题XML。

如果服务死了,检查数据库以找到尚未处理的记录并完成处理应该相对简单。

或者,可以将 XML 文件写入磁盘一次,在数据库中保留一个仅包含“状态”字段的表(以及一个或多个键以允许您再次在 XML 文件中找到相应的记录),处理记录,随时更新数据库“状态”表。完成后,通过从“状态”表中读取状态,一举更新 XML 文件中的状态字段。

同样,如果服务终止,检查“状态”表以查看哪些行已处理,哪些行未处理应该很简单。

祝你好运!

于 2010-12-10T17:58:25.873 回答
1

如果您的源数据库和目标数据库是 SQL Server,那么您应该忘记中间人,直接使用数据库中的内置队列支持:Service Broker。与 MSMQ 相比,您获得了许多优势:

  • 高可用性。Service Broker 内置于数据库中,因此您已经实施的数据库高可用性和灾难恢复解决方案也将自动选择您的消息传递解决方案。您的集群或数据库镜像解决方案将开箱即用,并且消息将通过数据库故障转移透明地进行故障转移。
  • 恢复一致性。将消息和数据放在同一个恢复单元(“数据库”)中可以进行简单的备份-恢复。对于存储在 MSMQ 中的消息和存储在数据库中的数据,除非您冻结处理,否则无法进行一致的备份。
  • 路由。SSB 允许队列在不中断消息流的情况下移动到新的物理位置。请参阅服务代理路由
  • 增加容量。MSMQ 有一个非常小的大小限制(每个队列 4GB),在生产环境中可能会很快超限,造成灾难性的后果。SSB 限制为每条消息2GB ,队列大小限制是数据库大小限制。
  • 由于本地事务而不是分布式事务,吞吐量显着提高。使用 MSMQ,您必须将数据库和 MSMQ 注册到分布式事务中,机器人在您入队的末尾和您出队的末尾。这大大降低了 MSMQ 情况下的吞吐量。

还有其他优点:

  • 队列可查询性:可以使用 T-SQL SELECT 查询消息队列
  • 一种编程 API:T-SQL。您不需要学习 MSMQ 接口(MSMQ 上的 WCF 通道只不过是 MSMQ API 上的一个浅垫片,与之前可能使用过的其他通道完全不同)。通过 SSB,您可以使用现有的 T-SQL 专业知识在 T-SQL 中编程。
  • 激活。当您的消息到达时,将启动一个存储过程来执行。
  • 会话语义:对话
  • 消息关联并发保护:对话组锁
  • 状态管理
  • 可扩展性:MySpace 使用 SQL Server Service Broker 保护 1 PB 数据的完整性

您松动的一件事是 WCF 服务模型编程。WCF 使编写演示应用程序变得非常容易,而您将失去它。

于 2010-12-10T18:38:49.517 回答
0

您是否考虑过消息服务器,例如Microsoft Message Queuing

于 2010-12-10T18:00:00.093 回答