【问题标题】:Creating Java Program which run without fail [closed]创建运行无误的Java程序[关闭]
【发布时间】:2014-12-05 13:45:53
【问题描述】:

我是 Zookeeper 的新手,Apache 馆长,需要你的帮助来设计一个程序:

我需要创建一个 java 程序,它将每小时运行一个脚本(基于最终用户提供的 cron 表达式)。
考虑到我有 3 台服务器,我需要确保脚本每小时运行一次而不会失败,即使在服务器关闭的情况下(在这种情况下脚本必须在其他服务器上运行)。每小时脚本将仅在一台服务器上运行。
我必须创建一个接口来为这个 java 程序提供输入。
输入将是 (i) 要运行的脚本和 (ii) 用于调度脚本的 Cron 表达式。

1) 请提出一个想法,我该如何设计我的程序来实现这一目标。 zookeeper, Apache curator 怎么可以同时使用。
2) 有没有办法将脚本缓存在最终用户提供的这3台服务器上运行?

可以使用 Apache curator 的 NodeCache 来缓存这 3 个服务器上的脚本吗? 非常感谢您的回复。

【问题讨论】:

    标签: java bigdata distributed apache-zookeeper apache-curator


    【解决方案1】:

    对于三台服务器,其中一台服务器无论如何都要运行,您需要一种分布式方法。问题是一旦出现故障,你可能无法解决是否运行脚本的难题。

    首先,您可以让一台计算机连接到其他计算机并告诉它们不要运行。这称为“压制”方法;但是,当您无法连接到其他计算机时,它会出现很多问题。问题是大多数初级程序员未能真正理解网络环境对他们设计程序的需要所做的改变。请花一点时间阅读典型的fallacies of distributed computing.

    Chron 通过不关心其他计算机上发生的事情来解决这个问题,因此 chron 的设计目标是错误的。

    使用三台计算机,您还将拥有三个不同的时钟,它们具有各自的速度和时间。一个好的分布式解决方案会有一些不直接依赖于每台机器时钟的时间概念。

    分布式解决方案(如果它们要容忍故障或故障)必须能够在没有与其他机器可靠通信的情况下运行。有时该组被分成两半,其中一组机器无法与另一组通信。在许多情况下,两个小组都会执行“关键”动作,因为担心另一组没有这样做。在其他情况下,假设另一组执行了“关键”操作,两组可能都不会执行。一个好的解决方案将确保“关键操作”执行一次,即使计算机无法通信。这通常由“多数”完成,如果您无法访问至少大多数相关机器,您的组(法定人数)就无法执行关键操作。

    查看 Paxos 算法以了解问题;并且,一旦您对问题有了更多的了解,请回顾您选择的技术,以确定考虑到“分布式计算的谬误”,他们试图解决问题的哪些部分。还要意识到一个完美的、100% 正确的解决方案可能是不可能的;因为,运行脚本的预选机器可能会遇到网络故障,然后依次出现电源故障,这样启动的机器只是假设只有网络中断。

    【讨论】:

      【解决方案2】:

      这是一个面试题,对吧?如果是,请注意,这个答案只会让你走上正轨。

      最简单的解决方案是让所有三个服务器都运行,并尝试获取锁来执行处理。见http://zookeeper.apache.org/doc/trunk/recipes.html#sc_recipes_Locks

      为确保只有一台服务器运行作业,您需要记录上次执行时间。这只是“使用已知键存储值”,您可以在其中一个介绍教程中找到它。

      当然,如果这一个面试问题,面试官会问一些后续问题,例如“如果脚本中途失败会怎样?”或者“如果计算机没有相同的时间怎么办?”你不会(轻易)用 ZooKeeper 解决这些问题。

      【讨论】:

      • 这是我必须做的实际作业,但是因为它是一个完整的用例,所以这也可以是一个面试问题。有什么方法可以保留最终用户提供的脚本,缓存在这 3 个服务器中? Apache curator 的 NodeCache 能不能做同样的事情?
      猜你喜欢
      • 1970-01-01
      • 2016-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-24
      • 1970-01-01
      • 1970-01-01
      • 2017-02-08
      相关资源
      最近更新 更多