안녕하세요?
아래 소스는 소켓서버의 수신 부분에 대당하는 소스인데요, INDY의 UDP를 이용하였습니다. 클라이언트에서 자신만의 교유한 ID를 전송하면 서버에서는 수신된 ID 와 현재의 날짜와시간을 텍스트화일에 저장하도록 하였습니다. 즉 새로운 ID면 'ID+날짜와시간'을 추가하고 기존의 ID면 날짜와시간만 갱신하도록 하였습니다.
이 상황에서 몇가지 묻고 싶은 것이 있습니다.
1. 여기서 ID는 보통 이메일 아이디인데요, 이정도 크기(10~15byte)면 클라이언트에서 날렸을 경우, 서버소켓에서는 여러번 나누어 받지 않고 한번에 받을 수 있을 거라고 생각이 드는데요, 저의 생각이 맞는지요?
2. 클라이언트(고객)의 동시접속자수가 5,000명이고, 그리고 각 클라이언트는 30초마다 한번씩 ID를 전송한다고 했을때 서버에서는 수신되는 순간마다 아래 프로시져가 실행될텐데요, 즉 StringList를 생성해서 텍스트 화일을 읽어들이고, 내용(ID+날짜와시간)을 추가하거나 업데이트하고.. 갱신된 텍스트화일을 저장하여 free하고.. 를 반복하게 되는데요, 서버부하 측면에서 문제가 없겠는지요? 만약 문제가 있다면 어떻게 하는 것이 옳은 것인지 조언을 주시면 고맙겠습니다.
3. 위와 같은 상황에서는 DB를 이용하는 것보다는 훨씬 성능면에서는 낫겠는지요?
경험하신 분들의 도움을 부탁드립니다.
procedure TUDPMainForm.UDPServerUDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle);
var
DataStringStream: TStringStream;
s: String;
Strings: TStringList;
i:integer;
IDExist:Boolean;
begin
DataStringStream := TStringStream.Create('');
try
DataStringStream.CopyFrom(AData, AData.Size);
Strings :=TStringList.Create;
Try
Strings.LoadFromFile('C:\1234.txt');
IDExist:=False;
for i:=0 to Strings.Count-1 Do
//txt화일에 ID가 존재한다면 '현재 날짜와시간+ID'로 업데이트함.
if pos(DataStringStream.DataString,Strings[i]) > 0 then begin
Strings.Text:=StringReplace(Strings.Text,Strings[i],FormatDateTime('YYYY-MM-DD hh:nn:ss',Now)+
'*'+DataStringStream.DataString,[]);
IDExist:=True;
break;
end;
//txt화일에 ID가 없다면 '현재 날짜와시간+ID' 추가함.
If IDExist=False then Strings.Add(FormatDateTime('YYYY-MM-DD hh:nn:ss', Now)+
'*'+DataStringStream.DataString);
end;
Strings.SaveToFile('C:\1234.txt');
Strings.Clear;
Finally
Strings.Free;
end;
finally
DataStringStream.Free;
end;
end;
저같은경우는 저렇게 read 프로시져에 최대한 빠르게 처리하도록 부하를 모두 없애구요.
일종의 List같은걸 만들어서 미리 5000개의 리스트를 가지고 있다가
UDPServerUDPRead에서는 빠르게 처리하고.
Update된 내용을 다른 쓰레드같은걸 이용해서 DB에 기록합니다.
그런데 동접자가 5000이면 이것도 무리가 되겠네요.
TEXT도 마찬가지구요. 5K짜리를 수도없이 갱신해야 하는데 이런식으로 하신다면 물론 쓰레드를
분리해도 무리가 있을것 같구요. 분리한상태에서
일정주기로 TEXT나 DB로 저장하면 부하는 많이 줄겠네요. 지정된 초에
List에 있는 데이터를 변경사항만 저장하는거죠.