首页 > 解决方案 > 分布式闭包如何跨 ignite 节点发送

问题描述

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

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

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

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

下面是我正在查看的示例:

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

解决方案


如果此类存在于远程节点上,则在反序列化后按原样使用。如果远程节点上不存在此类,则启用对等程序集加载将启动,它将所需的程序集发送到远程节点。

由于 CIL 代码的定义非常明确,因此它是一个轻松的过程:它还可以根据请求将大部分依赖项流式传输到远程节点,包括库等。这种机制的局限性在于它不会对等加载缓存的密钥-值类。因此,如果您需要对这些进行操作,则需要在所有节点之间分发它。

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


推荐阅读