为多个源生成唯一ID

时间:2012-11-22 15:32:38

标签: java events

考虑N个数据源,每个数据源都有一个事件流

Event{
    long id;
    Object data;
}

一个流中的某些事件可能具有相同的ID,因为事件可能跨越Updated,New等。因此我们可以看到以下两个流:

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

我现在想将这些组合成一个流s.t.每个订单ID肯定都是唯一的。

简单的方法是使用String而不是long并附加源编号,生成类似:

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

是否有更多的内存合作方式/更好的方法?

2 个答案:

答案 0 :(得分:1)

你的String解决方案很好,实际上很常见。如果你有兴趣使它更紧凑,你可能想要使用整数元组。

分布式系统中使用的另一种常用方法是使用范围分配:拥有一个中央(单例)服务器,该服务器分配每个客户端可以为其ID命名的范围。例如,这样的服务器可以将范围0-99分配给client1,100-199到client2等。当客户端耗尽它分配的范围时,它再次联系服务器以分配新的范围。

答案 1 :(得分: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-areh字节的顺序。 (在这种情况下,它还假定流和事件编号都不会超过65535。)

但是:你的字符串解决方案也很好而且清晰。内存真的那么紧,你不能为每个事件节省额外的50个字节吗?

相关问题