TsgcWebSocketServer › 속성 › QueueOptions
스레드 간 경합을 방지하기 위해 내부 연결별 큐를 통해 발신 메시지를 직렬화합니다.
property QueueOptions: TsgcWSQueueServer_Options read FQueueOptions write SetQueueOptions;
Text.Level=qmNone, Binary.Level=qmNone, Ping.Level=qmNone, MaxQueueSize=0, OverflowPolicy=qopDropOldest
활성화되면 메시지가 내부 큐에 배치되고 호출자의 스레드 대신 연결 스레드의 컨텍스트에서 전송됩니다. 이렇게 하면 여러 스레드가 동일한 연결에 동시에 쓸 때 필요한 잠금이 제거됩니다. 각 메시지 유형(Text, Binary, Ping)은 자체 Level 속성을 가진 하위 객체이며, 이 속성으로 독립적인 우선순위를 할당합니다. qmNone은 큐를 건너뛰고(기본값), qmLevel0이 먼저 처리되고, 그 다음 qmLevel1, 마지막으로 qmLevel2가 처리됩니다. 예를 들어 Text.Level 및 Binary.Level을 qmLevel2로, Ping.Level을 qmLevel1로 설정하면 ping이 일반 트래픽보다 먼저 전달되는 것이 보장됩니다. QueueOptions는 기본 IOHandler에서만 지원됩니다. IOHandlerOptions.IOHandlerType이 iohIOCP 또는 iohEPOLL인 경우 서버가 시작될 때 큐가 꺼집니다. 세 가지 수준이 모두 qmNone으로 재설정되고, OnError 이벤트가 이를 보고하며, 메시지는 호출자 스레드에서 인라인으로 전송됩니다. 서버가 이미 수신 대기 중인 상태에서 할당된 수준은 새 연결마다 같은 방식으로 재설정됩니다.
MaxQueueSize는 연결별 큐가 보유할 수 있는 메시지 수를 제한합니다. 0(기본값)은 무제한을 의미하며 이전 동작을 유지합니다. 제한에 도달하면 OverflowPolicy가 새 메시지의 처리 방식을 결정합니다. qopDropOldest(기본값)는 공간을 확보하기 위해 가장 오래된 큐 메시지를 버리고, qopDropNewest는 새 메시지를 버리며, qopDisconnect는 메시지를 버리고 연결을 닫습니다. 제한에 도달할 때마다 OnSendBufferFull 이벤트가 먼저 발생하므로 애플리케이션이 느린 소비자를 감지하거나 메시지 폐기를 재정의할 수 있습니다.
oServer := TsgcWebSocketServer.Create(nil);
oServer.QueueOptions.Text.Level := qmLevel2;
oServer.QueueOptions.Binary.Level := qmLevel2;
oServer.QueueOptions.Ping.Level := qmLevel1;
oServer.Active := true;