2011-04-01 23 views
2

我需要一個java應用程序來管理數據庫,以將工作單元分配給客戶端。 實際上,它是一個網格應用程序:數據庫充滿了客戶端的輸入參數,並且它的所有元組都必須分發給請求的客戶端。客戶端發送結果後,服務器相應地修改數據庫(例如標記計算的元組)。
現在讓我們假設我有一個充滿元組的數據庫(SQLite或MySQL),並且客戶端請求一組輸入元組:我希望一組工作單元專門發送給一個唯一的客戶端,所以我需要將其標記爲「已經被另一個客戶請求」。 如果我查詢數據庫的第一個(例如5)查詢,同時另一個客戶端提出相同的請求(在多線程服務器體系結構中,並沒有任何同步),我認爲有可能兩個客戶端接收相同的工作 - 單位。如何創建向客戶端分發工作單元的服務器?

我想象的解決方案可能是:
1)讓一個單線程的服務器架構(的ServerSocket.accept()再次調用以前的客戶端請求已送達後,才,使服務器僅有效訪問客戶端)
2)在多線程架構中,使查詢和元組鎖操作同步,以便我獲得一種原子性(有效地對數據庫進行序列化操作)
3)使用原子查詢操作到數據庫服務器(或文件,在SQLite的情況下),但在這種情況下,我需要幫助,因爲我不知道事情真的如何...

但是我希望你能理解我的問題:它與seti @ home非常相似,分配它的工作單元,但是所有分佈式單元與其衆多客戶端的交集都是空的(理論上)。 我的非功能性需求是語言是java,而數據庫是SQLite或MySQL。

回答

1

一些反饋爲每個可能的解決方案......

1)使一個單一線程服務器 架構(的ServerSocket.accept() 又稱爲 以前的客戶端的請求一直後才 服務,使服務器 有效地只有一個客戶在 一次訪問)

ServerSocket.accept()不會允許你這樣做,你可能需要一些其他類型的同步,以允許只有一個線程處於getting tuples的情況。這基本上引導你到你的解決方案(2)。

2)在多線程架構, 使查詢和元組鎖 操作同步,因此我 獲得對數據庫中的種類的原子 (有效地串行化操作 的)

可行,易於實施和解決問題的常用方法。唯一的問題是你對性能,延遲和吞吐量的關心程度,因爲如果你有很多這樣的客戶端,並且工作單元的時間跨度很短,那麼客戶端可能會最終鎖定90%的時間來獲得「令牌」。

該問題的可能解決方案。爲工作單元使用基於散列的分配。假設您有50個工作單位要在50個客戶之間共享。您以這樣的方式爲您的工作單位提供ID,以便您的客戶將獲得某些工作單位。最後,你可以用一個簡單的模塊操作節點分配:

assigned_node_id = work_unit_id % number_of_working_nodes

這種技術被稱爲pre-allocation,對於所有類型的問題不工作,所以這取決於你的應用程序。如果您有很多短時間運行的過程,請使用此方法。

3)使用原子查詢操作到 數據庫服務器(或文件,在案件的SQLite ),但在這種情況下,我需要 幫助,因爲我不知道事情怎麼 真的不用..

它基本上和(2)一樣,但是如果你能夠做到這一點,我懷疑你可以只用SQL,那麼你最終會被綁定到RDBMS的一些特定功能。很可能你需要一些非標準的SQL程序來實現這個解決方案。而且,它沒有解決,你會發現問題與解決方案2.

Summary

解決方案2是更可能的情況佔90%的工作,時間越長,任務是爲這個解決方案更好。如果任務時間很短,那麼一定要選擇基於pre-allocation的算法。

通過解決方案3,您放棄了便攜性和靈活性。

DRY: try some other Open Source systems ...

有跡象表明已經處理此類問題的幾個開源Java項目,他們可能是你矯枉過正,但我​​認爲這是值得一提的他們......

http://www.gridgain.com/

http://www.jppf.org/

1

我建議你閱讀this one之類的文章,看看DB如何爲你做同步工作。

相關問題