【问题标题】:Ignite node hangs when having IService as cluster singleton with persistence enabled将 IService 作为集群单例并启用持久性时,Ignite 节点挂起
【发布时间】:2018-04-09 19:59:11
【问题描述】:

我无法创建启用了持久性的集群单例 IService 示例。我尝试在具有 ignite 版本 2.4 的 Win 10 计算机上运行以下 c# 代码。启动应用程序一次工作并产生以下输出(如预期):

  • 节点 = 1
  • 已部署 =
  • 服务初始化
  • 服务执行
  • 服务已部署..

再次启动同一个应用程序会使它挂在“services.DeployClusterSingleton”。输出是:

  • 节点 = 2
  • 已部署 =

将“PersistenceEnabled”更改为 false,使两个(甚至两个以上)应用程序都按预期运行。

我不需要服务本身的持久性,而是缓存(不是示例代码的一部分)。我没有找到一种方法来配置服务是否使用持久性。

[Serializable]
public class CounterService : IService
{
    public void Init(IServiceContext context)
    {
        Console.WriteLine("Service Init");
    }

    public void Execute(IServiceContext context)
    {
        Console.WriteLine("Service Execute");
    }

    public void Cancel(IServiceContext context)
    {
        Console.WriteLine("Service Cancel");
    }
}

static void Main(string[] args)
{
    var config = new IgniteConfiguration()
    {
        DataStorageConfiguration = new DataStorageConfiguration()
        {
            DefaultDataRegionConfiguration = new DataRegionConfiguration()
            {
                Name = "PersistentDefaultRegion",
                PersistenceEnabled = true,
            },
        },
    };

    using (var ignite = Ignition.Start(config))
    {
        ignite.GetCluster().SetActive(true);
        Console.WriteLine("Nodes = " + ignite.GetCluster().GetNodes().Count);

        var services = ignite.GetServices();
        var deployed = services.GetServiceDescriptors().Select(m => ", " + m.Name).ToArray();
        Console.WriteLine("Deployed = " + string.Join("\n", deployed));

        services.DeployClusterSingleton("test-service", new CounterService());
        Console.WriteLine("Service is deployed..");

        Console.ReadLine();
    }
}

【问题讨论】:

    标签: .net ignite


    【解决方案1】:

    这是已知问题:https://issues.apache.org/jira/browse/IGNITE-8134

    如果节点不是基线拓扑的一部分,则永远不会在其上部署服务。特别是,如果该节点调用同步部署方法,该方法将挂起。

    最好的方法是:

    • 启动所有服务器节点
    • 设置基线拓扑
    • 激活集群
    • 部署服务

    另外,您可以使用集群激活工具https://apacheignite.readme.io/docs/cluster-activation#section-cluster-activation-tool

    在您的情况下,也可以在使用以下代码部署服务之前将节点添加到拓扑:

    var baselineTopology = ignite.GetCluster().GetBaselineTopology();
    var localNode = ignite.GetCluster().GetLocalNode();
    
    if (baselineTopology.Count(n => n.ConsistentId.ToString() == localNode.ConsistentId.ToString()) == 0)
    {
        baselineTopology.Add(localNode);
        ignite.GetCluster().SetBaselineTopology(baselineTopology);
    }
    

    只要确保更新 Baseline Topology 时没有竞态条件,并且节点一个一个地启动即可。

    【讨论】:

    • ConsistentId 似乎没有实现 Equals 和 GetHashcode。这对我有用: if (baselineTopology.Count(n => n.ConsistentId.ToString() == localNode.ConsistentId.ToString()) == 0)
    猜你喜欢
    • 1970-01-01
    • 2020-02-05
    • 2023-01-18
    • 1970-01-01
    • 2022-01-15
    • 2023-02-22
    • 1970-01-01
    • 2013-04-24
    • 2018-01-12
    相关资源
    最近更新 更多