如何将工作分配给一组计算机

How to distribute work to a pool of computers

我有一些数据需要处理。数据是一棵树。处理过程如下:取一个节点 N。检查它的所有子节点是否都已处理。如果没有,请先处理它们。如果是,处理N。所以我们从上到下(递归)到叶子,然后处理叶子,然后是叶子的父节点等等,直到我们再次到达根。

我知道如何在一台计算机上编写一个 运行 的程序来获取数据(即根节点)并如上所述进行处理。这是 C# 中的草图:

// We assume data is already there, so I do not provide constructor/setters.
public class Data
{
    public object OwnData { get; }
    public IList<Data> Children { get; }
}

// The main class. We just need to call Process once and wait for it to finish.
public class DataManager
{
    internal ISet<Data> ProcessedData { get; init; }
    
    public DataManager()
    {
        ProcessedData = new HashSet<Data>();
    }
    
    public void Process(Data rootData)
    {
        new DataHandler(this).Process(rootData);
    }
}

// The handler class that processes data recursively by spawning new instances.
// It informs the manager about data processed.
internal class DataHandler
{
    private readonly DataManager Manager;
    
    internal DataHandler(ProcessManager manager) 
    {
        Manager = manager;
    }
    
    internal void Process(Data data)
    {
        if (Manager.ProcessedData.Contains(data))
            return;
            
        foreach (var subData in data.Children)
            new DataHandler(Manager).Process(subData);
            
        ... // do some processing of OwnData
        
        Manager.ProcessedData.Add(data);
    }
}

但是我该如何编写程序才能将工作分配给一组计算机(它们都在同一个网络中,本地计算机或互联网)?我需要为此做什么?

一些thoughts/ideas:

  1. DataManager 应该 运行 在一台计算机上(主计算机/服务器?); DataHandlers 应该 运行 对所有其他人(客户端?)。
  2. DataManager 需要通过一些 ID(那是什么 ID?)了解计算机,这些 ID 在 DataManager.
  3. 的构造期间设置
  4. DataManager 必须能够在这些计算机上创建 DataHandler 的新实例(或在出现问题时终止它们)。怎么样?
  5. DataManager 必须知道哪些计算机当前有 DataHandler 的 运行ning 实例,哪些没有,以便它可以决定在哪台计算机上生成下一个 DataHandler(或者,如果 none 空闲,等待)。

这些不是要求!我不知道这些想法是否可行。

在上面的想法中,我假设每台计算机只能有一个 DataHandler 实例。我知道不一定如此(因为 CPU 核心和线程......),但在我的用例中它实际上可能是这样的:真正的 DataManagerDataHandler 不是独立的但在 SolidWorks 上下文中 运行。所以为了 运行 任何代码,我需要有一个 运行ning SolidWorks 实例。根据我的经验,同一 Windows 上的多个 SolidWorks 实例无法(可靠地)工作。

一知半解看来我需要的是一种多机-OS: 在单机设置中,通常会处理第2、3、4点由 OS。第 1 点是 OS(OS=DataManager 生成进程=DataHandlers;OS 跟踪数据=ProcessedData和进程报告)。


我到底想知道什么?

您应该阅读有关微服务和队列的内容。像 rabbitmq。 生产者/消费者方法。

https://www.rabbitmq.com/getstarted.html

如果您将微服务与 Docker 集成,您可以做一些非常漂亮的事情。