구글


Server 프로그램의 비애 ▶SW_Coding

얼마전 server프로그램에 생각하지못한 문제가 발생했다
문제의 server는 매 4시간마다 60개의 tcp 클라이언트 접속을 accept하고 , 5초 마다 4개의 udp sender로 부터 상태정보를 받아 db에 갱신하고 로그 파일을 쌓아 두고 다시 rf 수신기, sms 발신기에게 전송 하도록 되어 있다.. 혹시나 해서 필드에 적용 하기 앞서 100개의 tcp테스트 클라이언트와 4개의 udp sender를 접속시켜 시뮤레이션까지 해 보았고 아무런 문제도 발생하지 않았다.


그런데 이게 왠일인가?
어느날 60개의 tcp 클라이언트가 동시에 3차례 connect를 요청하고 자신의 상태를 실어 보내 버린것 아닌가?
다시 말하자면 몇초사이 동시에 180번의 connect요청을 하였고 server는 180번의 db insert와 update를 그리고 180번의 create file, close file을 하고 udp 팻킷을 받아 동시에 처리 해야 하는 상황........

이로 인해 다른 원격지(Local Area )에서 udp로 command 팻킷을 송출했을때 server가 받고 처리 하는 시간이 거의 5초가 소요되었고 다른 tcp 클라이언트의 connect가 실패하는 실로 엄청난 문제가 발생하게 되었다

server를 만들면서 무엇을 고려하지 않았기에 이런 문제가 발생한것일까?
첫째, tcp는 연결 지향 통신 프로토콜.. 연결만 되면 두 원격지 통신사이에 데이터 손실이 없는 안정적인 프로토콜이지만
만에 하나 server가 busy해서 또 다른 tcp client의 connect 요청을 accept를 하지 못하면 client는 3~5번( 0.5 sec간격)
재 시도 후 그냥 포기해버릴 수 있다는것.

두번째, udp는 비연결 지향 통신 프로토콜... server가 바쁘든 ,바쁘지 않든, 받든, 못 받든 무조건 packet을 던져 버리는
프로토콜로 통신 속도는 빠르지만 만에 하나 server가 busy해서 udp 팻킷을 놓쳐 버리거나 udp팻킷을 늦게 처리
할수 있다는 것.

그래 그럼 해결방법은 뭘까?
tcp client의 connect요청에 대해 최대한 빠르게 accept 할수 있도록 하고 connect된 client는 최대한 빠른 시간내 disconnect 될수 있도록 구조를 바꿔 보자. 이렇게..




문제는 이렇게 해결했지만 왠지 모를 자괴감에 얼마동안 우울한 시간을 가지게 한 사건이었다






덧글

댓글 입력 영역