2014-12-04 100 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