考虑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" ... >
是否有更多的内存合作方式/更好的方法?
答案 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个字节吗?