2016-12-04 47 views
1

我需要爲我的同步數據庫客戶端預先分配簡潔的整數主鍵(來自連續範圍)。在同步Realm上創建聯機優先對象,以保證客戶端對象的所有權

該用例非常簡單:我需要打印帶有短序號的票證,在移動客戶端具有間歇性連接的情況下。這些數字必須足夠短,以便在嘈雜的環境中通過糟糕的擴聲系統讀取,以授予門獎。

Realm對於任務似乎很完美 - 但我需要允許每個客戶端在連接到服務器時預先分配一組保證唯一的序列號,以便他們可以稍後打印票證,即使在離線。

class TicketNumber extends RealmObject { 
    @PrimaryKey int serialNumber; 
    String clientId; // instance identifier unique to each client 
} 

我的意圖是,客戶端A執行事務創造了一堆開始MAX(SERIALNUMBER)+1 TicketNumber對象,設置其自己的clientId每一個。如果客戶端B已經在該範圍內創建了TicketNumber對象,我希望能夠依靠事務失敗(拋出ObjectExists)。

但是,如果客戶端A或客戶端B在創建時斷開連接,它將愉快地在相同範圍內創建本地副本。同步發生時,它將衝突對象的clientId設置爲客戶端創建它的最後一個客戶端。很顯然,如果兩個客戶已經打印了具有相同序列號的票證,這對我來說是個問題。

正如我所看到的,爲了保證客戶對票號的所有權,我需要做「在線優先」的對象創建,這樣我才能觀察並對衝突做出反應。有什麼方法可以知道領域客戶端的連接狀態嗎?我試圖做甚至可能嗎?我是否必須等待計數器可用?

回答

0

跨分佈式設備生成本地標識的最簡單方法不是使用整數範圍和限制範圍,但UUID:UUID.randomUUID().toString()應該足夠好,因爲它是128位值。硬件故障或地球光線交換位錯誤的機會大於兩個設備上的兩個相同的密鑰。

這基本上是所有其他分佈式數據庫所做的。

+0

這表明,對於4個客戶端中的100張票,我會創建一個帶有UUID +局部遞增數字0-24的複合鍵。這將我的密鑰長度增加了19倍,從7位增加到128 + 5。它並沒有真正解決我需要預先分配順序序列號的問題。編輯的問題包括序號必須簡潔,最好從數字上連續的範圍。 –