1

我有一個應用程序,我有五個不同的任務。這五個任務中的每一個都在特定的一天的不同時間段運行。我將在4個不同的機器上部署這個應用程序。如何讓不同的機器運行不同的任務?

一般來說,我通過使用Apache Zookeeper選擇這四臺機器之間的領導者,在一臺機器上運行所有這五個不同的任務。但有了這種方法,其他三臺機器就會閒置,所以我在想有沒有辦法讓不同的機器運行不同的任務?這意味着這四臺機器中的每一臺都運行來自這五臺機器的一些任務,但沒有兩臺機器運行同一任務

任何人都可以提供一個例子,我將如何做到這一點?

更新: -

我沒有不同的任務之間的依賴。他們都是彼此獨立的。

+0

不同任務之間是否存在依賴關係? – 2015-02-23 07:57:44

+0

@OferLando不,不同任務之間不存在依賴關係。他們彼此獨立。 – john 2015-02-23 18:16:59

+0

看看我寫的這個項目。它做了類似的事情。您可能可以直接使用它或作爲示例:https://github.com/NirmataOSS/workflow – Randgalt 2015-02-23 21:32:57

回答

0

我有五個節點:pending_taskscompleted_tasksrunning_tasksworkersqueuespending_tasks是保存任務的節點,無論是新節點還是將由於工作節點中的故障而重新觸發的節點。 completed_tasks保存完成的任務的詳細信息。 running_tasks保存分配給工人的任務。在PoC實現中,我曾經使用XML編碼的POJO來存儲任務的細節。 pending_tasks,completed_tasksrunning_tasks中的節點都是永久性節點。

workers保存代表可用工人的短暫節點。鑑於它們是短暫的,這些節點表示工人失敗。 queuesworkers直接相關:在workers中的每個節點都有一個節點queuesqueues中的節點用於保存爲每個工作人員分配的任務。

現在,你需要一個主人。主人負責三件事:i)爲新任務觀看pending_tasks; ii)當新工人到達時,觀看workers註冊新的queues,並且當工人失蹤時將任務重新放回pending_tasks;和iii)在completed_tasks中發佈任務的結果(當我做了這個PoC時,結果將通過發佈/訂閱通知機制)。除此之外,由於工人在停工期間可能出現故障,因此主人必須在啓動時進行清理。

主算法如下:

at (start-up) { 
    for (q -> /queues) { 
    if q.name not in nodesOf(/workers) { 
     for (t -> nodesOf(/queues/d.name)) { 
     create /pending_tasks/t.name 
     delete /running_tasks/t.name 
     delete /queues/d.name/t.name 
     } 
     delete /queues/d.name 
    } 
    } 

    for (t -> nodesOf(/completed_tasks)) { 
    publish the result 
    deleted /completed_tasks/c.name 
    } 
} 

watch (/workers) { 
    case c: Created => register the new worker queue 
    case d: Deleted => transaction { 
    for (t -> nodesOf(/queues/d.name)) { 
     create /pending_tasks/t.name 
     delete /running_tasks/t.name 
     delete /queues/d.name/t.name 
    } 
    delete /queues/d.name 
    } 
} 

watch (/pending_tasks) { 
    case c: Created => transaction { 
    create /running_tasks/c.name 
    create persistent node in one of the workers queue (eg, /queues/worker_0/c.name) 
    delete /pending_tasks/c.name 
    } 
} 

watch (/completed_tasks) { 
    case c: Created => 
    publish the result 
    deleted /completed_tasks/c.name 
} 

工人算法如下:

at (start-up) { 
    create /queue/this.name 
    create a ephemeral node /workers/this.name 
} 

watch (/queue/this.name) { 
    case c: Created => 
    perform the task 
    transaction { 
     create /completed_tasks/c.name with the result 
     delete /queues/this.name/c.name 
     delete /running_tasks/c.name 
    } 
} 

,當我想到這個設計的一些注意事項。首先,在任何時候,沒有針對相同計算的任務運行。因此,我在完成計算之後將任務命名。因此,如果兩個不同的客戶端請求相同的計算,則只有一個客戶端能夠成功,因爲只有一個客戶端能夠創建/pending_tasks節點。同樣,如果任務已在運行,則創建節點將失敗,並且不會派遣新任務。

其次,主人和工作人員可能會出現任意故障,並且不會丟失任何任務。如果工作人員失敗,則在/worker中觀看刪除事件將觸發重新分配任務。如果在新的主站到位之前,主站發生故障並且任何給定數量的員工發生故障,則啓動過程會將任務移回/pending_tasks併發布任何未決結果。

第三,我可能已經忘記了一些特殊情況,因爲我無法再訪問此PoC實現。我很樂意討論任何問題。

相關問題