2014-12-04 99 views
0

我是新来的饲养员,Apache的策展人,需要你的帮助来设计prorgram创建Java程序表达由最终用户提供)。
考虑我有3台服务器,我需要确保脚本每小时运行一次,即使在服务器关闭的情况下也不会失败(在这种情况下,脚本必须在其他服务器上运行)。每小时脚本只能在一台服务器上运行。
我必须创建一个接口来提供输入这个Java程序。
输入将是(i)要运行的脚本和(ii)计划脚本的Cron表达式。其运行没有失败

1)请提出一个想法如何设计我的程序来实现这一点。如何zookeeper,Apache的馆长可以用在相同的。
2)有没有什么办法可以在最终用户提供的这3台服务器上缓存脚本?

是否可以使用Apache馆长的NodeCache来缓存这3台服务器上的脚本? 您的回应将不胜感激。

回答

0

有了三台服务器,无论哪台服务器都可以运行,您需要采用分布式方法。问题在于,如果发生故障,您可能无法解决是否运行脚本的难题。

首先,您可以让一台计算机连接到其他计算机并告诉它们不要运行。这被称为“压制”方法;但是,如果无法连接到其他计算机,则会出现很多问题。问题在于大多数起步程序员都无法真正了解网络环境对设计程序需要的变化。请花一点时间阅读典型文章fallacies of distributed computing.

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

有了三台电脑,您还将拥有三个不同的时钟,并拥有自己的速度和时间。一个好的分布式解决方案将有一些时间概念,并不直接依赖每台机器的时钟。

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

看看Paxos算法以了解问题;而且,一旦你更加意识到问题,考虑到“分布式计算的谬误”,回头看看你选择的技术,以确定他们试图解决哪些问题的部分。也意识到完美的,100%正确的解决方案可能是不可能的;因为运行脚本的预先选择的机器可能会遭受网络故障,然后依次发生电源故障,使得机器只承担网络中断。

0

这是一个面试问题,对吗?如果是的话,请注意,这个答案只会让你走得很远。

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

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

当然,如果这个面试问题,面试官会问一些后续问题,如“如果脚本中途失败会发生什么?”或者“如果电脑没有相同的时间呢?”你不会(很容易)用ZooKeeper解决这些问题。

+0

这是我必须做的实际任务,但是因为它是一个完整的用例,所以这也可以是一个面试问题。有没有办法让最终用户提供的脚本保存在这3台服务器中? Apache馆长的NodeCache可以用于相同的吗? – user3811124 2014-12-05 05:39:46

相关问题