2009-04-23 32 views
4

是否有衆所周知的在服務器場中同步任務的最佳實踐?例如,如果我在服務器場上運行基於論壇的網站,並且有兩個主持人嘗試執行某些操作,而這些操作需要寫入數據庫中的多個表,並且這些主持人的請求正由服務器中的不同服務器處理農場,如何實現一些鎖定功能以確保他們不能同時對同一項目執行該操作?如何實現跨服務器場的鎖定?

到目前爲止,我在考慮使用數據庫中的表來同步,例如,檢查表中項目的ID,如果不存在,插入並繼續,否則返回。也可能是一個共享緩存可用於此,但我目前沒有使用這個。

還有其他方法嗎?

順便說一句,我使用MySQL作爲我的數據庫後端。

+0

有多個請求響應試圖同時訪問數據庫服務器。他們在不同的服務器上並沒有太大的改變。 – jfclavette 2009-04-23 01:17:11

+0

確定,但它們同時影響多個記錄,我不希望在第一個請求仍在執行時影響相同記錄的另一個請求。簡而言之,我想在C#中使用類似lock的關鍵字,但希望它以分佈式方式工作。 – 2009-04-23 01:22:06

回答

2

您可能要調查一個分佈式鎖定服務,如Zookeeper。這是Google服務的重新實現,爲應用程序提供非常高速的分佈式資源鎖定協調。不過,我不知道如何將它融入到網絡應用程序中。

0

擁有一個鎖表是一個好方法,它很簡單並且可行。

您也可以將代碼作爲單個服務器上的服務使用,而不是SOA方法。

如果自上次獲取數據後時間戳發生變化,您可以使用事務處理的TimeStamp字段來恢復事務。所以如果有人先獲得優先權。

4

您的問題意味着數據級併發控制 - 在這種情況下,請使用RDBMS的併發控制機制。

如果稍後您希望控制不必將數據實體映射到一個數據實體(例如表記錄訪問)的應用程序級別的操作,則無法爲您提供幫助。通用的解決方案是一個反向代理服務器,它可以理解應用程序級別的語義,並在需要時進行相應的序列化。 (這會對可用性產生負面影響。)

它也可能不會傷害到讀CAP定理!

0

它可能與你無關,因爲問題是舊的,但它仍然可能對其他人有用,所以我會發布它。

您可以對鎖定對象使用「SELECT FOR UPDATE」數據庫查詢,因此實際上使用db來實現鎖機制。

如果你使用ORM,你也可以這樣做。例如,在nhibernate中你可以這樣做:

session.Lock(Member, LockMode.Upgrade);