2012-11-14 2 views
1

식별자 (자동 생성, 숫자, 재사용 가능)를 기반으로 서로 이야기하는 분산 객체 네트워크를 생성해야합니다. 어떻게 충돌을 일으키지 않고 그래프의 각 노드에 객체를 만들 수 있습니까?네트워크를 통해 분산 된 식별자

잠시 동안 마스터 노드를 사용하여 ID를 할당하고 있지만이 솔루션은 다른 노드에서 객체를 비동기 적으로 생성하기 때문에 제거하고 싶습니다. 특히 애플리케이션이 실시간이기 때문에 RDBMS는 중단되지 않습니다.

저는 이것이 오히려 고전적인 분산 컴퓨팅 문제라는 것을 잘 알고 있습니다. 그러나 나는 어쩌면 제대로 검색 할 어휘가 부족할 것입니다.

TCP는 사용할 수있는 유일한 프로토콜이며 네트워크는 대기 시간이 있습니다. 문제가되는 경우 C++로 작업하고 있지만 라이브러리가 아니라 알고리즘을 찾고 있습니다.

답변

2

UUID을 식별자로 사용하는 것이 좋습니다. 이들은 설계 상 고유하므로 추가 알고리즘 지원이 필요하지 않습니다.

+0

이 방법이 효과적 일 수 있지만 크기 오버 헤드가 걱정됩니다. 현재 구현에서는 내 식별자가 16 비트에 맞습니다. –

+0

당신이 사용하는 것보다 8x 증가 할 것입니다. – bobah

0

그냥 임의로 만듭니다. 임의의 128 비트 값을 사용하면 충돌 확률이 너무 작아서 0이라고 가정 할 수 있습니다. 128 비트 UUID 공간에 충돌 확률은 2^64 (생일 역설) 분명히

는 당신이 좋은 엔트로피 소스를 필요가 고전 sha1(time(NULL))이 더 - 이동하지 않습니다이다

더 중요) : 노드의 경우 UUID를 무작위로 선택하면 노드에 UUID를 만들고 제공하는 중앙 코디네이터가 필요하지 않습니다. 각 노드는 자체적으로 자체 UUID를 만듭니다.

2

한 번에 마스터 노드가 ID를 할당하는 대신 한 번에 각 노드에 블록 또는 ID 범위를 할당하도록 할 수 있습니다. 각 노드는 필요에 따라 해당 블록 내에서 ID를 할당합니다.

노드의 ID가 낮아지면 마스터에서 다른 블록을 요청합니다. 이런 식으로 노드는 비동기 적으로 객체를 생성 할 수 있으며 여전히 고유 한 ID를 보장합니다.

개체를 삭제하면 ID가 다시 사용하기 위해 풀로 반환된다고 가정합니다.

마스터 노드가 ID 배포를 담당하지 않게하려면 이더넷 MAC 주소 나 IP 주소에 카운터를 추가하여 ID를 구성하십시오. 이를 위해서는 중복 IP 또는 MAC 주소가 네트워크에 나타나지 않아야합니다. 이 ID는 16 비트보다 커야합니다.

그러나, 모든 노드가 동일한 네트워크 상에있는 경우, 예를 들어. IP 주소 AA.BB.CC.DD이면 DD를 처음 8 비트로 사용하고 다음 8 비트를 카운터로 사용할 수 있습니다. 이렇게하면 노드 당 256 개의 ID 만 제공되기 때문에 충분하지 않을 수 있습니다. 서브넷이 더 작 으면 카운터에 사용할 수있는 비트가 분명히 올라가서 문제를 해결하기에 충분할 것입니다.

+0

저는 그 아이디어가 마음에 들지만, 그것은 엔트로피에 대한 너무 많은 책임을 물체의 재분할에두고 있습니다. 내 응용 프로그램에서는 노드가 모든 객체 생성을 담당하거나 각 노드가 단일 객체를 만들 수 있습니다. 어쩌면 식별자의 크기를 조정하는 것이 트릭 (32 비트 정도) 일 수 있습니다. –

+1

좋은 지적. 내가 왜 객체 생성이 노드들에 균등하게 퍼져 있다고 가정했는지 나는 모른다.32 비트로 가면 하드웨어 일련 번호 또는 노드 고유의 상위 비트를 사용할 수 있으며 나머지 비트는 날짜 + 시간 또는 영구 카운터가 될 수 있습니다. –

관련 문제