2011-02-05 3 views
0

우리는 하나의 모듈이 다른 원격 모듈에 고속으로 메시지를 보내는 메시징 시스템을 가지고 있습니다. 수신 모듈은이 메시지를 특정 형식으로 디코딩하여 두 개의 스레드로 전달합니다. 하나는 로거 스레드라고하고 다른 하나는 전달자 스레드입니다.사용할 데이터 구조

이 메시지를 이러한 스레드에 보내기 전에 이러한 메시지를 일종의 그룹화해야합니다.

이 메시지는 초당 약 800 개의 고속으로 전송됩니다.

  1. INT 유형
  2. INT 전송 시스템 ID
  3. INT RECPT 시스템 ID
  4. INT 타임 스탬프
  5. INT 코드
  6. INT 소스 포트를
  7. 다음과 같이

    경고 구조는

  8. INT 대상 포트
  9. 소스 IP 주소 (IPv4 또는 IPv6) 우리는 다음과 같은 세부 구조를 유지할 필요가 경기의 끝에서
  10. 대상 IP 주소 (IPv4 또는 IPv6)

struct{ 
    INT COUNT 
    INT First Alert Timestamp 
    INT Last Alert Timestamp 
    INT First Alert ID 
    INT Last Alert ID 
} 

8 가지 기준과 일치하는 각 경고에 대해 그룹이 생성/선택되고 다른 세부 정보와 함께 카운트가 증가합니다.

IP 주소 필드는 5 개의 필드 (INT 주소 유형, INT 주소 1, INT 주소 2, INT 주소 3 및 INT 주소 4)의 구조이거나 문자열로 변환 된 다음 구조에 저장 될 수 있습니다.

우리는 상당히 언젠가 우리의 머리를 덜컥 덜컥 울리지 만 구조와 알고리즘을 찾을 수 없어서 메모리와 속도가 모두 해결 될 수 있도록 충분히 효율적이지 못했습니다.

따라서 전문가에게 도움을 요청했습니다.

+0

무엇이 일치합니까? 어떤 기준? – btilly

답변

0

일치하는 경고를 저장하는 이중 연결 목록입니다. 첫 번째 및 마지막 AlertID를 쉽게 검색 할 수 있습니다. 이중 링크 목록을 확장하여 개수 필드를 확장 할 수 있습니다.

성능 요구 사항에 따라 식별자에 해시가있는 목록에서 경고를 그룹화 할 수 있습니다. 그리고 그 속도가 충분하지 않으면 식별 필드별로 그룹화 된 더 복잡한 트리 구조를 구현하십시오.

내가 제안 할 수있는 가장 좋은 방법은 가능한 한 가장 간단한 방법으로 작동하도록하는 것입니다. 초당 800은 아무 것도 아닙니다. 그런 다음 성능 문제가있는 경우 최적화하십시오. 테스트 구동 개발을 사용하는 것과 같은 재미있는 일들을 쓰면 평균적인 코드에서 벗어날 수 있습니다!

0

글을 쓸 때 무엇을 할 계획입니까? 어떤 제안이라도 언어에 크게 의존 할 것입니다.

Dictionary<string, ContainerObject>과 같이 시작하는 것이 가장 좋습니다. 여기에서 키는 빠른 검색을 위해 연결된 매개 변수로 구성됩니다.DB 또는 플랫 파일을 말하기 위해 다른 프로세스가 값을 적절하게 로깅하는 동안이 사전을 메모리에서 계속 작업하십시오.

간단하게 유지하면 800 초가 문제가되지 않습니다. 그러나 의사 소통 수단이 중요한 요소가 될 것입니다. 로컬 또는 리모트입니까? 멀리 떨어져 있고 단일 출처에서 오는 경우, 귀하의 천적은 개별 요청에서 완료되면 지연이 될 것입니다.