在现代计算领域,分布式和并行计算技术因其能够提供高效的计算能力而广受关注。Windows Communication Foundation (WCF) 是一种框架,它不仅支持分布式计算,还提供了协议无关性。最近,WCF 还扩展了对 RESTful API 的支持。本文将探讨如何利用 WCF 提供的并行和分布式计算能力,并讨论使用这些技术可以解决的问题类型。
本文的目标是讨论分布式和并行计算的架构、设计以及一个示例实现。将提供逻辑架构细节、设计细节以及使用 WCF 实现分布式和并行计算的代码讨论。
本文将提供逻辑架构细节、设计细节以及一个使用 WCF 实现分布式和并行计算的示例实现。假设读者已经具备 WCF、并行和分布式编程、异步方法调用、创建 Windows 服务、WCF 部署等方面的工作知识。
本文的目标受众可能包括解决方案架构师、技术设计师和开发人员。假设读者已经具备 WCF、并行和分布式编程、异步方法调用、创建 Windows 服务、WCF 部署等方面的工作知识。
本文将首先定义适合分布式和并行计算的问题类型。然后,将描述一个示例问题,该问题将用于本文的其余讨论。接着,将描述使用的方法。从逻辑架构的构建块开始,然后将其映射回方法。然后,将详细讨论应用程序的设计,以问题陈述为依据。讨论中将提供示例实现。
在本节中,将尝试确定适合分布式和并行处理的问题类型。正如可能已经识别的,正在寻找两类问题:分布式和并行。 任何计算问题,如果其结果可以在应用程序域之外处理,则可能适合分布式计算。许多实例都希望处理可以分布,这可能受到安全、可扩展性或计算所需资源的可用性的影响。 在可以找到重复的相同子问题模式的问题中,可能用于并行处理。这是在编写多线程应用程序时寻找的东西。 根据这两类问题,可以安全地假设,任何满足这两个领域要求的问题都适合分布式并行处理。通常,如果手头问题资源利用率很高,则应考虑分布式和并行处理的开销。 有许多科学问题的例子可以使用分布式计算,例如天气预报,但在商业领域,EDI、批量处理(例如工资计算)是分布式和并行计算的候选者。
为了使讨论具体而有形,本文将描述一个示例问题。这是一个过于简化的问题陈述,以确保专注于技术问题而不是手头的业务逻辑。 假设从源处获得一个包含许多行的文件。每一行都包含一个字符串消息和一个数字 x。工作是在数据库中为文件名创建一次条目,然后为消息 x 创建 x 次条目。一旦整个文件被解析,应该将条目标记为最终。如果发生任何异常或错误,应该将条目标记为错误。 一个这样的文件的示例名称为 Sample.txt。
将不讨论如何使用分布式和并行计算的原则逻辑解决问题。将介绍一些将在本文其余部分构建的术语。 一旦确定一个问题可以使用分布式和并行技术解决,确定两个基本组件:Master,其工作是找到工作量,然后将其分发给其中一个工作者。Master 还负责整体事务管理。 工作者的工作是将每个工作作为独立任务处理,而不必担心其他并行任务。 在示例问题中,Master 将解析文件,一旦找到一行,它将将其发送给一个工作者。
现在将讨论如何使用 WCF 解决问题。将构建两个单独的 WCF 服务,一个称为 Master,另一个称为工作者。Master 将通过解析文件名来调用。Master 将开始逐行读取文件,并将读取的字符串以异步方式发送给工作者。工作者将消息写入数据库。 为了确保在执行任务时花费一些时间,将在循环中写入消息,并有一些延迟。
现在将关注用于实现建议方法的架构。架构已在下面的图表中说明: 一台客户端计算机发起一个处理文件的请求。客户端如何知道有文件可供处理的机制并不重要。WCF 服务必须有权访问请求的文件。 应用程序有两个 WCF 服务,Master 和工作者。Master 的工作是暴露一个端点,通过该端点发起请求。 Master WCF 服务有一个量子标识符组件;这负责识别独立的任务量子。在应用程序中,这将是逐行读取文件并将每行发送进行处理的模块。 作业分配器负责以异步方式将任务发送给工作者。作业分配器可能期望或不期望工作者的结果,这导致了异步或 OneWay 方法的决定。 工作者有一个 WCF 端点,Master 用于请求量子任务进行处理。作业执行器用于执行任务的组件。 在理想情况下,许多相同的工作者部署在负载平衡集群后面。
现在将深入讨论分布式处理的控制流程。将讨论使用序列图的高级流程控制。 客户端调用 Master 实现为 WCF 服务的 init 方法。在 init 方法中,传递了文件名。接口通过调用 ParseFile 方法调用量子标识符。 ParseFile 逐行读取文件,对于每行读取的行,调用 JobDistributor 的 RequestExecution。 RequestExecution 接受一个字符串行作为参数,并以异步模式调用工作者 WCF SaeEntries,并增加活动线程的数量。这允许在单独的执行空间中进行非阻塞调用,允许分布式处理。接口调用 JobPerformer 上的 SaveEntries。 一旦执行完成,结果将发送回 JobDistributor,根据处理结果可以找到整体执行状态。一旦收到结果,线程数量将减少。 值得注意的是,Master 是一个 WCF 服务,因此在完整文件被解析后,Master 的实例将被垃圾收集。因此,一旦文件完全解析,就需要开始一个循环以保持 Master 实例的存活。一旦线程为零,循环就停止,以便 Master 可以被垃圾收集。 整体执行状态由 JobDistributor 维护,它由每个请求的异步结果更新。