考虑N个数据源,每个数据源都有一个事件流
Event{
long id;
Object data;
}
一个流中的一些事件可能具有相同的id,因为事件可能跨越Updated、New等。因此,我们可以看到以下两个流:
<1, 2, 3, 1, 5, 2>
<3, 3, 4, 5, 4>
现在我想将这些合并到一个流s.t中。每个订单id肯定是唯一的。
最简单的方法是使用字符串而不是long并附加source number,生成如下内容:
<"1 - 1", "1 - 2", "1 - 3", "2-3", "2-3" ... >
是否有更多内存协同影响的方式/更好的方法?
发布于 2012-11-22 23:39:37
您的字符串解决方案很好,而且实际上相当常见。如果您对使其更紧凑感兴趣,那么您可能希望使用整数元组。
分布式系统中使用的另一种常见方法是使用范围分配:拥有一个中央(单例)服务器,该服务器分配每个客户端可以命名其ID的范围。这样的服务器可以例如将范围0-99分配给client1,将100-199分配给client2等。当客户端耗尽分配给它的范围时,它再次联系服务器以分配新的范围。
发布于 2012-11-23 00:26:40
根据流/事件编号的范围,您可以将这两个数字合并为一个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字节?
https://stackoverflow.com/questions/13515912
复制相似问题