我有五個節點:pending_tasks
,completed_tasks
,running_tasks
,workers
和queues
。 pending_tasks
是保存任務的節點,無論是新節點還是將由於工作節點中的故障而重新觸發的節點。 completed_tasks
保存完成的任務的詳細信息。 running_tasks
保存分配給工人的任務。在PoC實現中,我曾經使用XML編碼的POJO來存儲任務的細節。 pending_tasks
,completed_tasks
和running_tasks
中的節點都是永久性節點。
workers
保存代表可用工人的短暫節點。鑑於它們是短暫的,這些節點表示工人失敗。 queues
與workers
直接相關:在workers
中的每個節點都有一個節點queues
。 queues
中的節點用於保存爲每個工作人員分配的任務。
現在,你需要一個主人。主人負責三件事: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實現。我很樂意討論任何問題。
不同任務之間是否存在依賴關係? – 2015-02-23 07:57:44
@OferLando不,不同任務之間不存在依賴關係。他們彼此獨立。 – john 2015-02-23 18:16:59
看看我寫的這個項目。它做了類似的事情。您可能可以直接使用它或作爲示例:https://github.com/NirmataOSS/workflow – Randgalt 2015-02-23 21:32:57