Apache Ignite无法找到已部署的服务

Apache Ignite无法找到已部署的服务,ignite,Ignite,我注意到ApacheIgnite有一种奇怪的行为,这种行为在我的5节点ApacheIgnite集群上发生得相当可靠,但即使是两节点集群也可以复制。我在部署在Kubernetes集群中的Linux环境中使用ApacheIgnite2.7forNet(每个pod承载一个节点) 问题如下。假设我们有一个集群,它由两个ApacheIgnite节点a和B组成。这两个节点都启动并初始化。在初始化阶段,在每个节点上部署了两个Ignite服务。其中,名为QuoteService的服务部署在节点B上 到目前为止还

我注意到ApacheIgnite有一种奇怪的行为,这种行为在我的5节点ApacheIgnite集群上发生得相当可靠,但即使是两节点集群也可以复制。我在部署在Kubernetes集群中的Linux环境中使用ApacheIgnite2.7forNet(每个pod承载一个节点)

问题如下。假设我们有一个集群,它由两个ApacheIgnite节点a和B组成。这两个节点都启动并初始化。在初始化阶段,在每个节点上部署了两个Ignite服务。其中,名为QuoteService的服务部署在节点B上

到目前为止还不错。集群按预期工作。然后,节点B崩溃或出于任何原因停止,然后重新启动。重新部署节点B上托管的所有ignite服务。节点重新加入集群

但是,当节点a上的服务尝试调用节点B上预期可用的QuoteService时,将引发异常,并显示以下消息:未能找到部署的服务:QuoteService。奇怪的是,在重新启动节点B的过程中,注册服务的行确实运行了:

services.DeployMultiple("QuoteGenerator", new Services.Ignite.QuoteGenerator(), 8, 2);
(将服务部署为单例没有任何区别)

单独重新启动节点A或节点B都没有帮助。只有关闭整个Ignite群集并重新启动所有节点,才能解决此问题

即使在运行5个节点时,也可以再现这种情况

此错误报告可能看起来有点不具体,但很难指定具体的复制步骤,因为复制涉及设置至少两个ignite节点并按顺序停止和重新启动它们。因此,让我这样提出问题: 1.您是否注意到这种情况,或者您是否收到其他用户的类似报告? 2.如果是,您可以建议采取哪些步骤来解决此问题? 3.当我读到服务部署机制目前正在大修时,是否应该等待下一版本的ApacheIgnite

UPD:
即使我没有停止/启动节点,在运行的集群上也会遇到类似的问题。我将打开另一个关于SA的问题,它似乎有一个不同的起源

我已经找出了导致上述行为的原因(尽管我不清楚确切原因)

我希望确保Ignite服务仅部署在当前节点上,因此我使用以下C#代码部署该服务:

var services = ignite.GetCluster().ForLocal().GetServices();
services.DeployMultiple("FlatFileService", new Services.Ignite.FlatFileService(), 8, 2);
当我将代码更改为仅依赖NodeFilter将服务的部署限制在一组特定的节点上,并去掉了“GetCluster().ForLocal()”,错误就消失了。最终代码如下:

var flatFileServiceCfg = new ServiceConfiguration
{
    Service = new Services.Ignite.FlatFileService(),
    Name = "FlatFileService",
    NodeFilter = new ProductServiceNodeFilter(),
    MaxPerNodeCount = 2,
    TotalCount = 8
};
var services = ignite.GetServices();
services.DeployAll(new[] { flatFileServiceCfg, ... other services... });

然而,奇怪的是,为什么旧代码在拓扑改变之前仍然有效。

我已经找出了导致所描述行为的原因(尽管我不清楚确切原因)

我希望确保Ignite服务仅部署在当前节点上,因此我使用以下C#代码部署该服务:

var services = ignite.GetCluster().ForLocal().GetServices();
services.DeployMultiple("FlatFileService", new Services.Ignite.FlatFileService(), 8, 2);
当我将代码更改为仅依赖NodeFilter将服务的部署限制在一组特定的节点上,并去掉了“GetCluster().ForLocal()”,错误就消失了。最终代码如下:

var flatFileServiceCfg = new ServiceConfiguration
{
    Service = new Services.Ignite.FlatFileService(),
    Name = "FlatFileService",
    NodeFilter = new ProductServiceNodeFilter(),
    MaxPerNodeCount = 2,
    TotalCount = 8
};
var services = ignite.GetServices();
services.DeployAll(new[] { flatFileServiceCfg, ... other services... });

然而,仍然很奇怪,为什么旧代码在拓扑结构更改之前仍然有效。

您好,您如何访问该服务?你是否到处都有相同的服务对象?可以从节点B访问吗?@EvgeniiZhuravlev感谢您的回复。基本上,我对服务代理执行以下操作。我不知道是不是到处都一样_ignite.GetServices().GetServiceProxy(serviceName)。我从DI容器中获取Ignite实例;DI依赖项的定义如下:.AddSingleton(sp=>{return Ignition.TryGetIgnite()??Ignition.Start(igniteConfig);})>是否可以从节点B访问它我没有试过。我应该吗?嗨,你是如何获得服务的?你是否到处都有相同的服务对象?可以从节点B访问吗?@EvgeniiZhuravlev感谢您的回复。基本上,我对服务代理执行以下操作。我不知道是不是到处都一样_ignite.GetServices().GetServiceProxy(serviceName)。我从DI容器中获取Ignite实例;DI依赖项的定义如下:.AddSingleton(sp=>{return Ignition.TryGetIgnite()??Ignition.Start(igniteConfig);})>是否可以从节点B访问它我没有试过。我应该吗?