如何通过点火节点发送分布式闭包

问题描述 投票:0回答:1

我正在查看Apache Ignite文档中有关分布式闭包的使用的示例。

https://apacheignite-net.readme.io/docs/distributed-closures

根据我的理解,可以通过实现IComputeFunc接口在客户机节点中定义闭包。我不完全清楚的是如何将接口的实现传递到集群中的服务器节点。有没有这种机制的文件?关闭的实现可能包含的代码是否有任何限制?例如。它是否允许发出http请求?从外部nuget包调用代码?

我试过看一下项目的源代码。似乎使用BinaryWriter.writeobjectdetached方法以某种方式二进制序列化IComputFunc的实现。在我的调查中,我没有比这更进一步。

以下是我看到的示例:

async void Compute()
{
    using (var ignite = Ignition.Start())
    {
        var funcs = "Count characters using compute func".Split(' ')
          .Select(word => new ComputeFunc { Word = word });

        ICollection<int> res = ignite.GetCompute().Call(funcs);

        // Async mode
        res = await ignite.GetCompute().CallAsync(funcs);

        var sum = res.Sum();

        Console.WriteLine(">>> Total number of characters in the phrase is '{0}'.", sum);
    }
}

[Serializable]
class ComputeFunc : IComputeFunc<int>
{
    public string Word { get; set; }

    public int Invoke()
    {
        return Word.Length;
    }
} 
c# ignite
1个回答
1
投票

如果此类存在于远程节点上,则在反序列化后将按原样使用。如果远程节点上没有此类,则Peer Assembly Loading将启用,如果启用,它将向远程节点发送所需的程序集。

由于CIL代码非常明确,因此它是一个无痛的过程:它可能会根据请求将大多数依赖项流式传输到远程节点,包括库等。此机制的局限性在于它不会对等负载缓存的密钥 - 值类。因此,如果您需要对它们进行操作,则需要在所有节点之间进行分配。

此代码将使用与您的通用Ignite代码相同的权限,所以是的,没有理由不进行HTTP调用。请注意,将大多数库显式添加到所有节点并且只有经常更改的Peer Load代码可能仍然更好。

© www.soinside.com 2019 - 2024. All rights reserved.