문제

내 C# 클래스는 TCP 스트림 스타일 소켓 연결을 통해 수신된 대량의 이벤트를 처리할 수 있어야 합니다.클래스 소켓이 TCP 서버로부터 수신하는 이벤트 메시지의 양은 완전히 가변적입니다.예를 들어 때로는 10초 동안 하나의 이벤트 메시지만 수신할 수도 있고, 다른 경우에는 1초 내에 60개의 이벤트 메시지를 수신할 수도 있습니다.

메시지를 수신하기 위해 Socket.ReceiveAsync를 사용하고 있습니다.ReceiverAsync는 수신 작업이 보류 중인 경우 true를 반환하고, 이미 연결에 데이터가 있고 수신 작업이 동기적으로 완료된 경우 false를 반환합니다.작업이 보류 중인 경우 소켓은 IO 완료 스레드에서 내 콜백을 호출하고, 그렇지 않으면 현재(IOC) 스레드에서 내 콜백을 호출합니다.게다가 이벤트 메시지와 함께 이 TCP 서버로 전송된 명령에 대한 응답도 받습니다.응답 메시지는 즉시 처리됩니다.개별적으로 스레드 풀 작업자를 실행합니다.

그러나 이벤트 메시지가 "충분"(N)해질 때까지 또는 더 이상 연결되지 않을 때까지 이벤트 메시지를 대기열에 넣은 다음 스레드 풀 작업자를 실행하여 이벤트 메시지 일괄 처리를 처리하고 싶습니다.또한 모든 이벤트가 순차적으로 처리되기를 원하므로 한 번에 하나의 스레드 풀 작업자만 작업할 수 있기를 바랍니다.

이벤트 메시지 프로세서는 메시지 버퍼를 개체에 복사하고 이벤트를 발생시킨 다음 메시지 버퍼를 다시 링 버퍼 풀로 해제하기만 하면 됩니다.그래서 제 질문은...이것을 달성하기 위한 최선의 전략이 무엇이라고 생각하시나요?

더 많은 정보가 필요하십니까?알려줘요.감사해요!!

도움이 되었습니까?

해결책

나는 초당 60개의 이벤트를 높은 볼륨으로 호출하지 않을 것입니다.낮은 수준의 활동에서는 어떤 소켓 처리 방법이라도 괜찮습니다.나는 단지 select를 사용하여 현재 시스템보다 성능이 훨씬 떨어지는 하드웨어를 사용하여 단일 스레드에서 초당 5,000개의 이벤트를 처리했습니다.

규모를 확장하려는 경우 스레드 간에 메시지를 개별적으로 전달하는 것은 재앙이 될 것입니다.일괄 처리가 필요합니다. 그렇지 않으면 컨텍스트 전환으로 인해 성능이 저하됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top