使用 WCF 进行分布式和并行处理






4.24/5 (9投票s)
如何使用 WCF 提供并行和分布式计算功能
引言
Windows Communication Foundation (WCF) 是一项已无需介绍的技术。该技术提供分布式计算,同时支持协议无关性。WCF 已扩展为在近期版本中提供 RESTful API。
在本文中,我们将讨论如何使用 WCF 提供并行和分布式计算功能。我们还将讨论使用建议的技术可以解决哪些类型的问题。
目标
本文的目的是讨论分布式和并行计算的架构、设计和示例实现。
范围
本文将提供分布式和并行计算的 WCF 示例实现的逻辑架构详细信息、设计详细信息和代码讨论。
目标读者
本文的读者可能包括解决方案架构师、技术设计师和开发人员。假设读者具备 WCF、并行和分布式编程、异步方法调用、Windows 服务创建、WCF 部署等方面的实践知识。
讨论流程
在本文中,我们将首先定义适合分布式和并行计算的问题。然后,我们将描述一个供其余讨论使用的示例问题。接着,将描述所使用的方法。我们将从构建块的逻辑架构开始,并将其映射回方法。然后,我们将结合我们的问题陈述详细介绍应用程序的设计。示例实现作为讨论的一部分提供。
哪些问题适合分布式并行处理?
在本节中,我们将尝试确定哪些问题适合分布式和并行处理。您会发现,我们关注的是两类问题:分布式和并行。
任何计算结果可能在应用程序域之外进行处理的问题都可能适合分布式计算。许多情况下都需要分布式处理,这可能受安全性、可伸缩性或计算所需资源的可用性影响。

在可以找到相同子问题的重复模式的问题中,可以使用并行处理。这是我们在编写多线程应用程序时寻找的。

基于这两类问题,我们可以安全地假设,满足这两个领域要求的任何问题都可能适合分布式并行处理。通常,如果手头的资源的利用率非常高,那么考虑分布式和并行处理的开销是明智的。

科学领域存在许多可使用分布式计算的问题,例如天气预报。但在业务领域,EDI、批量处理(例如工资计算)等任务也是分布式和并行计算的竞争者。
我们讨论的示例问题
在本文中,为了使讨论具体且有形,我们将描述一个示例问题。这是一个极度简化的问题陈述,旨在确保我们将重点放在技术问题上,而不是当前的业务逻辑。
假设我们从一个源获取一个文件,其中包含多行。每行包含一个字符串消息和一个数字 x。我们的任务是为文件名创建一次数据库条目,并为消息创建 x 次条目。一旦整个文件被解析,我们就应该将条目标记为最终。如果发生任何异常或错误,我们应该将我们的条目标记为错误。
一个名为 Sample.txt 的此类文件示例。
Message1,5
Messag2,2
….
我们将为 Sample.txt 创建一个条目,为 Message1 创建五个条目,为 Message2 创建两个条目,依此类推。
如何使用分布式和并行处理解决此问题
我们将不讨论如何通过分布式和并行处理的原理来解决问题。我们将介绍一些将在本文其余部分使用的术语。
一旦我们确定一个问题可以使用分布式和并行技术解决,我们就确定两个基本组件:主节点,其工作是找到工作单元并将其分发给其中一个工作节点。主节点还负责整体事务管理。
工作节点的任务是独立处理每个作业,而不必担心其他并行任务。
在我们的示例问题中,主节点将解析文件,一旦找到一行,它将将其发送给其中一个工作节点。

如何使用 WCF 实现
现在我们将讨论如何使用 WCF 解决问题。我们将构建两个独立的 WCF 服务,一个称为 Master,另一个称为 Worker。Master 将通过解析文件名来调用。Master 将逐行读取文件,并以异步方式将读取的字符串发送给 Worker。Worker 将消息写入数据库。
为确保我们花费一些时间来完成任务,我们将以带有一定延迟的循环方式写入消息。
架构
现在我们关注实现建议方法所使用的架构。架构已在下图所示的图表中进行了说明。

客户端机器发起一个处理文件的请求。客户端如何知道文件可供处理的机制并不重要。WCF 服务必须具有对请求文件的访问权限。
该应用程序有两个 WCF 服务:Master 和 Worker。Master 的工作是公开一个用于启动请求的终结点。
Master WCF 服务具有一个 Quantum Identifier 组件;该组件负责识别独立的工作单元。在我们的应用程序中,这将是逐行读取文件并将每行发送处理的模块。
Job distributor 负责以异步方式将任务发送给 Worker。Job distributor 可能会也可能不会期望来自 Worker 的结果,这会导致选择异步或 OneWay
方法。
Worker 具有一个 WCF 终结点,Master 使用该终结点请求工作单元进行处理。Job Performer 用于执行任务的组件。
在理想情况下,许多相同的 Worker 部署在负载均衡集群后面。
设计
现在,我们将深入探讨分布式处理的控制流。我们将使用序列图讨论高层控制流。
客户端调用 Master(实现为 WCF 服务)上的 init
方法。在 init
方法中,会传递文件名。接口通过调用 ParseFile
方法来调用 Quantum Identifier。ParseFile
逐行读取文件,并为每个读取的行调用 JobDistributor
的 RequestExecution
。
RequestExecution
将 string
行作为参数,并以异步模式调用 Worker WCF SaeEntries,并增加活动线程数。这允许在单独的执行空间中进行非阻塞调用,从而实现分布式处理。接口调用 JobPerformer
上的 SaveEntries
。
执行完成后,结果会发送回 JobDistributor
,根据处理结果,可以在此处找到整体执行状态。收到结果后,线程数会减少。

需要注意的是,Master 是一个 WCF 服务,因此,在完全解析文件后,Master 的实例将被垃圾回收。因此,在完全解析文件后,需要启动一个循环以保持 Master 实例的运行。一旦线程数为零,循环就会停止,以便 Master 可以被垃圾回收。
整体执行状态由 JobDistributor
维护,该状态由每个请求的异步结果更新。
示例实现
我们终于来到了本文的最后一部分。提供的源代码是一个极度简化的示例实现,侧重于如何运行分布式和并行处理应用程序。它缺乏许多最佳实践,例如错误/异常处理、逻辑封装等。示例应用程序的目的是确保所讨论的理念能够成功演示。示例代码经过大量注释,详细说明了代码行为何存在,而不是它在做什么。
结束语
我非常欢迎您对改进本文提出任何反馈或意见。请将您的意见发送至 Gaurav.Verma.MCA@gmail.com