2014-10-25 10 views
0

나는 여기서 수정 된 Kademlia P2P 시스템을 작성하고 있지만 여기서 설명하는 문제는 원래 구현과 매우 유사합니다.Effiencient Kademlia Buckets

그래서 k- 버킷을 구현하는 가장 효율적인 방법은 무엇입니까? 내게 중요한 것은 액세스 시간, 병렬 처리 (읽기 & 쓰기) 및 메모리 절약입니다.

ConcurrentLinkedQueue 및 ConcurrentHashMap을 사용하여 생각하고 있지만 꽤 복잡하고 불쾌한가요?

지금은 단순히 LinkedList를 동기화하고 있습니다.

import java.util.LinkedList; 

class Bucket { 
    private final LinkedList<Neighbour> neighbours; 
    private final Object lock; 

    Bucket() { 
     neighbours = new LinkedList<>(); 
     lock = new Object(); 
    } 

    void sync(Neighbour n) { 
     synchronized(lock) { 
      int index = neighbours.indexOf(n); 
      if(index == -1) { 
       neighbours.add(n); 
       n.updateLastSeen(); 
      } else { 
       Neighbour old = neighbours.remove(index); 
       neighbours.add(old); 
       old.updateLastSeen(); 
      } 
     } 
    } 

    void remove(Neighbour n) { 
     synchronized(lock) { 
      neighbours.remove(n); 
     } 
    } 

    Neighbour resolve(Node n) throws ResolveException { 
     Neighbour nextHop; 
     synchronized(lock) { 
      int index = neighbours.indexOf(n); 
      if(index == -1) { 
       nextHop = neighbours.poll(); 
       neighbours.add(nextHop); 
       return nextHop; 
      } else { 
       return neighbours.get(index); 
      } 
     } 
    } 
} 

가 나는 또 다른 이웃 퇴거 과정을 구현 한, 궁금하지 마십시오 :

여기 내 코드입니다.

답변

1

그래서 k- 버킷을 구현하는 가장 효율적인 방법은 무엇입니까?

다릅니다. 종소리와 호각 (예 : 버킷 분리, 멀티 호밍)으로 구현하려면 유연한 목록이나 트리가 필요합니다. 제 경험상 쓰기 배열 복사 + 바이너리 검색은 전체 버킷 수를 거의 수정하지 않기 때문에 라우팅 테이블에 적합합니다 (버킷의 내용 만).

CoW 의미론을 사용하면 배열의 현재 복사본을 가져 와서 관심있는 버킷을 검색 한 다음 버킷을 잠글 수 있기 때문에 잠금이 덜 필요합니다. 또는 각 버킷 내부에 원자 배열을 사용하십시오. 물론 이러한 최적화는 높은 처리량을 예상하는 경우에만 필요합니다. 대부분의 DHT 노드는 트래픽이 거의없고 초당 몇 개의 패킷을 볼 수 있습니다. 즉 처리량이 많은 특수 노드를 구현하지 않으면 여러 스레드를 포함 할 필요가 없습니다. 데이터를 처리하기 위해 여러 스레드가 필요합니다.

CoW는 라우팅 테이블과 유사한 룩업 캐시 나 룩업 중에 만들어진 임시 방문 노드/대상 노드 집합이 빠르게 수정되기 때문에 잘 작동하지 않습니다. 높은로드가 예상되는 경우 ConcurrentSkipListMaps를 선택하는 것이 좋습니다. 만약 단순화 근사 구현하려면

는 단지 고정 크기 어레이에게 배열 인덱스가 공유 프리픽스 비트가 노드 ID에 대하여 카운트 (160)의 요소를 사용한다. 이것은 상당히 잘 수행되지만 개정 된 kademlia 논문에서 제안 된 최적화 중 일부는 허용하지 않습니다.