2011-06-22 54 views
1

我試圖完成一些在概念方面很容易理解的東西。我想在不同的機器之間同步一段java代碼。在不同機器上運行的程序有兩個實例不能同時運行。分佈式同步執行

我聽說過zookeeper,jgroups和akka,但是在閱讀文檔時,對於我想要做的事情,似乎有點矯枉過正。有沒有人有任何想法,如果有什麼更直接的使用?

由於提前,

+0

「在不同機器上運行的程序有兩個實例不能同時運行。」這兩個程序的任何協調員都必須存儲有關這些程序執行情況的狀態。有什麼選擇可用於此目的? –

+0

我不確定我明白這個問題。我不擔心運行實例的狀態。我只是擔心他們不會同時處理數據。 – rpvilao

+0

如果你擔心這些進程是否同時處理數據,那麼必須有一些通信協議可以反映某個協調器的進程狀態。或者協調員必須能夠在不請求這些信息的過程的情況下確定這一點,這需要協調員在某處存儲此信息。無論哪種情況,負責同步的協調員都必須存儲整個系統的同步狀態。 OS,JVM等通過跟蹤信號量,互斥鎖等的使用並存儲此信息來完成此操作。 –

回答

3

如果你提到的(也看看Terracotta)是你的需求,也許簡單的數據庫鎖定太複雜了所有的技術?

SELECT FOR UPDATE語句將鎖定給定的數據庫記錄,使其他客戶端運行此查詢來阻止。簡單,但安全可靠。

+0

我想到了這一點,doesn這似乎不是一個好方法。是單點故障。無論如何感謝輸入。 – rpvilao

+0

@rpvilao - 就像@VineetReynolds說的,如果你有其他要求,比如高可用性,你需要澄清你的問題。根據您的規格,某些解決方案可能過於簡單,有些解決方案可能過於簡單。 – manku

2

非常非常基本的解決方案是使用RMI

決定使用一臺機器作爲主機,該機器有一個使用鎖的方法,只允許一個方法調用者通過。

在運行特殊的Java代碼塊之前,您必須通過RMI從所有其他從屬實例調用此特殊方法。