【问题标题】:Infinispan failover capabilityInfinispan 故障转移功能
【发布时间】:2014-11-27 01:42:26
【问题描述】:

我正在尝试利用 Infinispan 的分布式任务故障转移,但我似乎无法让它工作。关于我正在尝试做的事情的一点背景:

我在一个集群中有两个服务器节点。这两个节点共享一个分布式缓存,缓存包含用于运行任务的信息。我正在尝试在它们上实现故障转移功能,以便如果任务在服务器 #1 上运行并且它出现故障,服务器 #2 将能够接收并完成任务。

1) 我首先创建了一个 DistributedCallable 对象: (MyJob) MyJob myJob = new MyJob(param1, param2);

2) 然后我创建一个 DistributedExecutorService 和一个 DistributedTaskBuilder 并使用提供的 Infinispan 随机节点故障转移策略对其进行配置:

DistributedExecutorService execService =
        new DefaultExecutorService(cacheManager.getCache());
DistributedTaskBuilder<Boolean> taskBuilder = 
        execService.createDistributedTaskBuilder(myJob);
taskBuilder = taskBuilder.failoverPolicy(DefaultExecutorService.RANDOM_NODE_FAILOVER);

3) 我构建了分布式任务,然后使用 DistributedExecutorService 运行它:

DistributedTask<Boolean> distTask = taskBuilder.build();
execService.submit(distTask);

在我的测试过程中,我确实看到 DistributedTask 被发送到服务器 #1 或服务器 #2,并且分布式缓存正在被两台服务器正确更新。但是,当我尝试测试故障转移时,它似乎不起作用。

例如: 当任务在服务器 #1 上运行时(我将任务设置为睡眠约 20 秒),我杀死服务器 #1,但我没有看到任务正在重新运行或被服务器 #2 拾取。反之亦然。

我不确定我是否遗漏了任何内容,我已根据 Infinispan 7.0.x 用户指南完成此操作。为了使故障转移工作,我是否需要使用提供的服务器模块之一(Hot Rod/Memcached/REST Server/WebSocket Server)?我在其嵌入式模式下(在实际应用程序中)使用 Infinispan,并且文档看起来使用分布式执行框架应该提供故障转移。

任何帮助将不胜感激!

【问题讨论】:

    标签: jboss failover infinispan


    【解决方案1】:

    看来要应用故障转移策略,您需要等待此类任务的结果:

    DistributedTask distTask = taskBuilder.build();
    Future future = execService.submit(distTask);
    Object ignoredReturnValue = future.get();
    

    不利的一面是,如果发起者节点(您调用此代码的地方)崩溃,则无法应用故障转移策略。

    【讨论】:

    • 我已将其设置为等待结果。我设置了一个场景,如果在其上运行任务,非发起者节点将抛出异常。发起者节点确实从其他节点捕获了分布式任务抛出的异常,但它仍然没有重新运行该任务。
    猜你喜欢
    • 2017-04-28
    • 2015-09-14
    • 2015-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多