2012-11-22 2 views
1
에 대한 고유 ID를 생성

각 이벤트 업데이트, 새로운 등등에 걸쳐 하듯이 하나 개의 스트림 내 이벤트 중 일부는 동일한 ID를 가질 수있는 이벤트여러 소스

Event{ 
    long id; 
    Object data; 
} 

의 흐름과 함께, 데이터의 N 소스를 고려 따라서 다음 두 스트림을 볼 수 있습니다.

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

이제 이것을 하나의 스트림 st 각 주문 ID는 확실히 고유 할 것입니다.

쉬운 방법은 같은 STH 생성, 대신 긴 문자열을 사용하여 소스 번호를 추가하는 것입니다 :

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

더 메모리 coimpact 방법/더 나은 방법이 있습니까?

+0

'N'의 크기는 얼마입니까? '이벤트'에 '이드'가 얼마나 큰가요? – ShyJ

답변

1

String 솔루션은 훌륭하고 실제로 매우 일반적입니다. 좀 더 컴팩트하게 만들고 싶다면 정수형 튜플을 사용하는 것이 좋습니다.

분산 시스템에서 사용되는 또 다른 일반적인 방법은 범위 할당을 사용하는 것입니다. 중앙 (싱글 톤) 서버를 사용하여 각 클라이언트의 ID 이름을 지정할 수 있습니다. 그런 서버는 예를 들어 client1에 0-99, client2에 100-199의 범위를 할당 할 수 있습니다. 클라이언트가 할당 된 범위를 소모하면 서버에 다시 연결하여 새 범위를 할당합니다.

0

스트림/이벤트 번호의 범위에 따라 두 개의 숫자를 하나의 int 또는 long으로 결합하여 스트림 번호를 맨 위에 여러 비트, 이벤트 번호를 여러 비트에 배치 할 수 있습니다. 예를 들면 : 당신이 언급 된 유형의 전형적인 문자열 (말) 50 분에 바이트의 순서와 반대로

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 바이트를 사용합니다. (이 경우 스트림이나 이벤트 번호가 65535를 초과하지 않는다고 가정합니다.)

하지만 문자열 솔루션도 훌륭하고 분명합니다. 정말로 이벤트 당 50 바이트를 절약 할 수없는 메모리가 부족합니까?

관련 문제