我是新来的动物园管理员,阿帕奇策展人,我需要你的帮助来设计一个程序:
我需要创建一个java程序,它每小时运行一个脚本(基于终端用户提供的cron表达式)。
假设我有3台服务器,我需要确保脚本每小时运行一次,即使在服务器出现故障的情况下也是如此(在这种情况下,脚本必须在其他服务器上运行)。每小时脚本将只在一台服务器上运行。
我必须创建一个接口来提供这个java程序的输入。
输入将是(i)要运行的脚本和(ii) Cron表达式来调度脚本。
1)请建议我如何设计我的程序来实现这个目标。如何动物园管理员,阿帕奇策展人可以使用相同的。
( 2)在这3台终端用户提供的运行服务器上有缓存脚本的方法吗?
Apache的NodeCache可以用于在这3台服务器上缓存脚本吗?您的答复将不胜感激。
发布于 2014-12-04 14:01:40
对于三台服务器,其中一台无论如何都要运行,您需要一种分布式方法。问题是,在失败的情况下,您可能无法解决是否运行脚本的难题。
首先,您可以让一台计算机连接到其他计算机,并告诉他们不要运行。这被称为“按兵不动”的方法;但是,当你无法连接到其他计算机时,它会有很多问题。问题是,大多数刚开始的程序员都无法真正理解网络环境对他们如何设计程序所做的改变。请花点时间阅读一下典型的分布式计算的谬误。
Chron通过不关心其他计算机上发生的事情来解决这个问题,所以chron有错误的设计目标。
有了三台电脑,你也会有三个不同的时钟,有自己的速度和时间。一个好的分布式解决方案将有一些时间的概念,而不是直接依赖每台机器的时钟。
分布式解决方案(如果要容忍故障或故障)必须能够在不与其他机器进行可靠通信的情况下运行。有时,组被分成两半,其中一组机器无法与另一组通信。在许多情况下,两组都会在担心另一组没有执行“关键”动作的情况下执行“关键”动作,而在其他情况下,假设另一组执行“关键”动作,两组可能不会执行“关键”操作。一个好的解决方案将确保“关键操作”只执行一次,即使计算机无法通信。这通常是由“多数”完成的,如果您无法访问至少大多数涉及到的机器,您的组(仲裁)就无法执行关键操作。
看看Paxos算法来了解这些问题;一旦你对问题有了更多的认识,回头看看你选择的技术,看看他们试图解决的问题中的哪一部分,考虑到“分布式计算的谬误”。还要意识到,一个完美的、100%正确的解决方案可能是不可能的;因为,预先选择的运行脚本的机器可能会遭受网络故障,然后按顺序发生电源故障,这样up机器就会假设只有网络中断。
发布于 2014-12-04 14:51:56
这是个面试问题,对吧?如果是,请注意这个答案只会让你半途而废。
最简单的解决方案是让所有三个服务器运行,并尝试获取一个锁来执行处理。请参阅锁
为了确保只有一台服务器运行作业,您需要记录最后的执行时间。这只是“用已知键存储一个值”,您可以在其中一个入门教程中找到它。
当然,如果这是一个面试问题,面试官会问后续的问题,比如“如果剧本中途失败会发生什么?”或者“如果计算机没有相同的时间怎么办?”您不会(很容易)用ZooKeeper解决这些问题。
https://stackoverflow.com/questions/27295455
复制相似问题