创建无错运行的Java程序

时间:2014-12-04 13:37:45

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

我是zookeeper,Apache策展人的新手,需要你帮助设计一个prorgram:

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

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

Apache策展人的NodeCache可以用来缓存这3台服务器上的脚本吗? 您的回复将受到高度赞赏。

2 个答案:

答案 0 :(得分:0)

使用三台服务器,无论如何都要运行,您需要一种分布式方法。问题是,如果发生故障,您可能无法解决是否运行脚本的难题。

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

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

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

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

查看Paxos算法以了解问题;并且,一旦您更加意识到这些问题,请回顾您选择的技术,以确定他们试图解决的问题的哪些部分,考虑到“分布式计算的谬误”。也意识到完美的,100%正确的解决方案可能是不可能的;因为,运行脚本的预先选择的机器可能会遇到网络故障,然后按顺序断电,使得机器只假设网络中断。

答案 1 :(得分:0)

这是一个面试问题,对吗?如果是的话,请注意这个答案只会让你中途停止。

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

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

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