2012-01-18 50 views
3

這是我遇到的情況:我有兩個similair Java應用程序運行在不同的服務器上。這兩個應用程序都使用提供的Web服務從同一網站獲取數據。但該網站當然不知道第一個應用程序採用了與第二個應用程序相同的數據和平。提取數據後應保存在數據庫中。所以我有兩次在數據庫中保存相同的數據的問題。如何同步兩個Java應用程序?

我該如何避免在我的分貝重複條目?

可能有兩種方法:

1)使用數據庫端。寫一些看起來像「插入如果唯一」的東西。

2)使用服務器端。編寫一些中間服務,它將接收來自兩個數據獲取器的響應並以某種方式處理它們。

我想第二個解決方案更有效。

你能提供一些關於這個話題的建議嗎? 您將如何實施該中間服務?如何實現服務之間的通信?如果我們使用HashMap來存儲接收到的數據,那麼我們如何估計我們的系統可以處理的HashMap的最大大小?

回答

3

你真的需要在兩個服務器同時獲取數據?檢查中的每個條目如果不存在,則插入可能會很昂貴。合併多次提取也很耗時。並行獲取有什麼好處嗎?考慮在一次有一個提取器。

您將面臨的問題是,您必須選擇哪一個分佈式進程應該執行數據提取並將其存儲在數據庫中。

這是某種Leader Election的問題。

看看Apache ZooKeeper這是分佈式協調服務。 有一個receipt如何使用ZooKeeper來實現領導選舉。

有很多已經實現此收據的框架。我建議你使用Netflix curator。有關負責人選舉的更多詳情,請致電wiki

+0

Mairbek,謝謝你的回覆。這種方法的一個問題是,我的所有應用程序都應該完全相同。所以我不能把取出的代碼放到第一個應用程序中,也不要把它放到第二個應用程序中。或者你的意思是Apache Zookeeper可以解決這個問題?真的,我想這可以成爲解決這個問題的第三種方法:創建一個只在其中一個應用上運行獲取例程的服務。換句話說,我需要一些能夠爲我的應用產生信號的東西來獲取操作。 – KutaBeach 2012-01-18 15:54:29

+0

您正在運行的代碼應該是相同的。你只需要在分佈式過程中達成共識,其中一個人應該擔任領導者。 例如,如果您有兩臺相同的服務器。在開始時,他們都必須決定他們中的哪一個是領導者。這可以使用ZooKeeper完成。如果第一個服務是領導者,它將獲取數據並將其保存到數據庫中,第二個服務器處於空閒狀態,反之亦然。 – 2012-01-18 16:01:31

+0

這意味着我應該爲此做一些事情 - 更改屬性文件,更改應用程序代碼,從一些應用程序屬性對代碼進行編碼等。這會使我的應用程序不完全相同。或者你建議使用一些外部服務會選擇領導者? – KutaBeach 2012-01-18 16:06:17

3

有這種問題的分佈式框架。

  • Hazelcast - 可以讓你有一個分佈式ConcurrentMap跨多個JVM的。
  • Terracotta - 使用它的DSO(分佈式共享對象,我認爲),它會保持整個JVM一個Map實現; S
+0

這非常有用!謝謝,戴維斯! – KutaBeach 2012-01-19 08:26:02

相關問題