2012-11-22 24 views
1

考慮數據的N源,每個事件生成唯一ID爲多個來源

Event{ 
    long id; 
    Object data; 
} 

流某一個流內的事件可能具有相同的ID,如事件可能跨越更新,新等跨越所以我們可以看到以下兩條流:

<1, 2, 3, 1, 5, 2> 
<3, 3, 4, 5, 4> 

我現在想將這些組合成一個流st每個訂單ID肯定會是唯一的。

最簡單的方法是使用一個字符串,而不是漫長而追加源數量,生成某事像:

<"1 - 1", "1 - 2", "1 - 3", "2-3", "2-3" ... > 

是否有更多的內存coimpact方式/更好的辦法?

+0

'N'有多大? 「事件」中的「id」有多大? – ShyJ

回答

1

你的字符串解決方案很好,而且實際上很常見。如果你有興趣使它更緊湊,你可能想要使用一個整數的元組。

分佈式系統中使用的另一種常見方法是使用範圍分配:有一箇中央(單例)服務器,用於分配每個客戶端可以命名其ID的範圍。例如,這樣的服務器可以將客戶端1的範圍0-99,100-199分配給客戶端2等。當客戶端耗盡分配的範圍時,它會再次與服務器聯繫以分配新的範圍。

0

根據您的流/事件編號的範圍,您可以將這兩個數字合併爲一個int或long,將流編號放在最高位,並將事件編號放在最低位。例如:

public static int getCombinedNo(int streamNo, int eventNo) { 
    if (streamNo >= (1 << 16)) 
     throw new IllegalArgumentException("Stream no too big"); 
    if (eventNo >= (1 << 16)) 
     throw new IllegalArgumentException("Event no too big"); 
    return (streamNo << 16) | eventNo; 
} 

這將只使用每個INT 4個字節中的(比方說)50上下的字節的順序不是爲你提到的類型的典型的字符串。 (在這種情況下,它也假設流和事件編號都不會超過65535.)

但是:您的字符串解決方案也很好,很清晰。內存真的很緊張,你無法在每個事件中多佔50個字節?