실시간 패킷을 A컴퓨터 --> B컴퓨터 전송시 효과적인 처리 방
글쓴이: winicon / 작성시간: 목, 2005/10/13 - 12:20오전
안녕하세요.
현재 여러가지의 유형의 실시간 패킷을 잡은 즉시
A컴퓨터(서버) --> B컴퓨터(클라이언트) 소켓으로 전송하고 있습니다. (패킷 캡쳐 전송 속도는 초당 1KB 정도 입니다)
문제는
예를 들어 A컴퓨터에서 받고 있는 패킷은 1,2,3,4,5,6 유형의 데이터가 있습니다. 현재 A컴퓨터에서는 1,2,3,4 라는 4가지 유형만 B컴퓨터로 전송하고 있습니다.
그런데 B컴퓨터가 5번 유형의 데이터도 같이 보내(처음 데이터 부터 현재 진행중 계속해서)달라고 A컴퓨터에 요청을 하게 되면 어떻게 처리하면 좋을지 알고 싶습니다.
단) 위에서 B컴퓨터에서 5번 유형의 데이터도 같이 보내달라고 했을때, 5번 유형의 패킷 처음 부터 보내주면서 현재 1,2,3,4번 유형과 같이 이어서 5번도 같이 보내줘야 합니다.
현재 첫번째 생각은 STL의 Queue를 두개의 쓰레드가 공유하여 각각 읽고,쓰기 분담하는것이구요.(5번 유형 데이터 처리가 문제가 될것 같습니다.)
두번째 생각은 A컴퓨터가 패킷를 잡은 즉시 DB(Mysql)에 Insert
하고 B 컴퓨터에서는 DB에 접속하여 수시로 selet하여 데이터를 가져오는것입니다. (5번 유형 데이터 처리 문제는 없을것 같으나, select 속도가 문제가 될것 같습니다.)
어떻게 하면 효과적으로 처리 할수 있을지 답변 부탁 드립니다.
그럼 수고하세요.^^
Forums:
우선 명백한것은 RDMBS 를 이용하는것은 Scalable 하지 않아서
우선 명백한것은 RDMBS 를 이용하는것은 Scalable 하지 않아서 안좋아보입니다.
물론 performance 가 그다지 중요치 않다면 가장 간단한 방법인것은 사실입니다만,
첫째로 scalable 하지 않고, 둘째로 여러 client 가 있을경우, synchronize 하기가
무척 곤란해집니다. ( DB connection 을 Singleton 으로 하지 않는이상.. )
아직 시나리오가 잘 파악이 안됩니다만, protocol 로는 해결이 불가능한가요?
get(1, 4) 하면 1부터 4까지 보내주고,
get(1, 5) 하면 1부터 5까지 보내주고..
만약, 패킷 4개 보내는것과 5개 보내는 로직이 다르다면, 이제 load 를 어디로
줄것인가의 문제가 되어 다른문제가 됩니다만, 제가 개인적으로 선호하는 방법은
클라이언트 프로토콜을 간단히 하게 되는걸 좋아해서, 서버에서 알아서 하도록
하는게 대략 낫을듯 싶습니다.
삽질의 대마왕...
사용자 정의 데이터전송 포맷을 고려하세요.이를테면, 헤더+데이터로 프
사용자 정의 데이터전송 포맷을 고려하세요.
이를테면, 헤더+데이터로 프로토콜을 설계하고,
헤더는 다양한 정보를 가질 수 있겠지만, 일단 타입+데이터길이정도로 정의하고,
1) 헤더에 타입0이고 사이즈가 n이라고 쓰고, 데이터는 1+2+3+4를 보내는 유형이 되게 하고
2) 헤더에 타입1이고 사이즈가 n+m이라면, 데이터는 1+2+3+4+5.
3) 또, 헤더에 타입 2이고 사이즈가 n+m+k이라면, 데이터는 1+2+3+4+5+6등
이런식으로 프로토콜을 설계해서, 사용자 프로토콜포맷 생성후 전송 및 수신후 포맷 디코딩 루틴을 만들어서 해결하면 될듯합니다.
또한, 큐메카니즘을 구현한다면,
송신측에,
1) 패킷수집쓰레드(N개의 쓰레드 가능)
*큐
2) 패킷 송신 쓰레드(또는 통신 전담쓰레드)
1과 2사이에 큐를 구현하고(STL을 쓰건 뭘쓰건간에)
수신측에,
1) 패킷수신 쓰레드(또는 통신 전담쓰레드)
*큐
2) 분석/처리 쓰레드(N개의 쓰레드 가능)
이런 식으로 만드는것이 당연 널리 사용되는 방법중 하나입니다.
만일, 별개 통신세션을 만드는것이 가능하다면, 별개의 세션으로 5를 보내주면 되겠고,
패킷을 수집하는 장비(에이전트?센서?)가 다수개라면, 동기화를 고려할 수 밖에 없는데, 실시간이라고 하셨으므로, 특정시간이 초과되어 도착된 패킷 및 특정 시간이되도록 도착하지 않는 경우에 대한 뭔가(?)의 처리가 요구되겠습니다.
* 패킷의 전송양이 1KB/Sec정도라면 아주 미미하므로 송신대역폭은 별로 고려대상이 안되겠군요.
* DB를 사용하는 것에 대한 고려는,
- 패킷수집기와 패킷수신기간에 여타의문제로 통신이 두절되었었다. 그런데, 늦게라도(나중에라도) 기존에 수집한 정보를 받아봐야 한다. 라면 DB를 쓰는게 좋습니다.
- DB에 인서트하는 시간과 페치하는 시간을 측정하여(적어도 수천만 레코드정도로...) 성능을 고려한후 (초당 몇건의 레코드를 ,,,할 수 있나를 검증) DB사용을 검토하세요.
- STL이나, 여타의 메카니즘 SAM, ISAM등을 이용하는 것도 그리 나빠보이지 않습니다만......분석로직이 다양하고, 프로토타입설계라면 DB를 사용하는 것도 그리 나쁘지 않습니다. 또한 DB를 사용하더라도, 원격지에서 DB에 직접 접속하는 것보다는 별도의 통신모듈을 두고, DB에는 로컬에서만 접속하도록 하는것이
유연한 코딩을 할 수 있는 방법에 해당됩니다.
답변 잘 보았습니다.많은 도움이 될것 같습니다. 감사합니다.
답변 잘 보았습니다.
많은 도움이 될것 같습니다.
감사합니다.
댓글 달기