2011-08-16 3 views
5

현재 실시간 프로세스에 명령을 보내고받는 C# 소켓 서버를 개발 중입니다. 클라이언트는 안드로이드 장치입니다. 현재 실시간 요구 사항은 "부드럽다". 그러나 앞으로는 더 엄격한 타이밍 요구가 발생할 수있다. 앞으로 잠재적으로 위험 할 수있는 명령을 크레인에 보 내게 될 것입니다.실시간 응용 프로그램을위한 비동기 소켓과 동기 소켓 서버

서버가 작동하고 있으며 내 현재의 동기 소켓 서버 디자인과 잘 어울립니다. 데이터 수신 및 전송을위한 별도의 스레드가 있습니다. 비동기 서버 소켓 접근을 시도 할 이유가 있을지 궁금합니다. 안정성 및/또는 빠른 성능을 제공 할 수 있습니까?

+1

비동기 디자인은 처리하기 위해 하나 이상의 클라이언트 및/또는 여러 개의 메시지/연결이 병렬로 처리되는 경우에만 유용합니다 ... 비동기식 디자인으로 서버를 훨씬 확장 성있게 만듭니다. – Yahia

답변

6

실시간 정의에 비유 할 때 비동기식 소켓은 요청 처리 본문을 더 빨리 만들지는 않지만 동시성 (한 번에 수행 할 수있는 요청 수)을 늘릴 것이라고 말합니다. 모든 프로세서가 처리 중일 때 어떤 이득도 얻지 못할 것입니다. 이것은 프로세서가 소켓을 받기 위해 대기하는 상황에서만 이득이됩니다.

실시간 요구 사항이 실시간 요구 사항이 x 시간 응답을 보장 할 필요가있는 것과 같으면 C# 및 .NET에서 보증하지 않습니다. 그러나 이것은 현재와 미래의 "소프트"정의에 따라 다릅니다. 이 좋은 응답 시간을 얻으려면이 발생하지만 실제 시스템과 혼동하지 마십시오.

+1

답변 해 주신 Adam! 나는 비동기 소켓 서버에 대한 모든 게시물이 혼란스러워지고 있다고 생각하지만 지금은 어떤 상황에 있는지 알고 있습니다. 그리고 저는 귀하의 메모에 완전히 동의합니다. C#은 실시간 요구 사항에 적합한 선택이 아닙니다. 더 어려운 요구 사항에 관해서라면 아마 C로 서버를 만들 예정입니다. 또 다른 한가지는 TCP 소켓이 실시간 통신을위한 실행 가능한 옵션인지 아니면 다른 것을 고려해야합니까? – Cartaya

+1

비동기 C#과 비교하여 동기식 C를 수행하는 경우 자신에게 큰 실수를 저지르고 있습니다. – Henrik

+0

잠정적 매체 (즉, 네트워크)를 통한 모든 종류의 통신은 실시간 시스템에서 훌륭하게 될 수 없습니다. TCP는 신뢰성을 원한다면 충분히 좋은 선택입니다. –

1

비공식적 인 애플리케이션의 유용성에 의심이가는 경우에는 this에 대해 반드시 읽어보아야합니다. 비동기식 솔루션이 여러분의 어플리케이션에 추가 할 수있는 것에 대한 명확한 아이디어를 제공합니다.

+0

LMAX 참조 게시 주셔서 감사합니다. 매우 흥미로운. – kakridge

+0

http://disruptor.googlecode.com/files/Disruptor-1.0.pdf - Fowler의 컷 - 복사 - 붙여 넣기 단순화가 아닌 읽어야 할 책입니다.) – Henrik

0

더 안정적이거나 빠른 성능을 얻지 못할 것이라고 생각합니다. 실제로 "실시간"시스템 인 경우 동기식이어야합니다. "거의 실시간"을 견딜 수 있고 오랜 시간 또는 비싼 계산 작업이있는 경우 비동기 방식을 고려할 수 있습니다. 비록 내가 필요하지 않다면 나는 복잡성을 추가하지 않을 것이다.

0

실시간 인 경우 통신이 대기열에 의해 뒷받침되기를 원하므로 그 대기열에서 일시적인 논리를 증명할 수 있습니다. 이것은 nio/io-completion-ports/async가 제공하는 것입니다. 동기식 프로그래밍을 사용하는 경우 RAM에서 네트워크 카드로 데이터를 복사하는 동안 CPU를 낭비합니다.

또한 서버가 절대적으로 단일 스레드임을 의미합니다. 비동기로도 단일 스레드가있을 수 있지만 여전히 수천 개의 요청을 처리 할 수 ​​있습니다.

예를 들어 클라이언트가 DOS 공격을 수행하려고한다고 가정 해보십시오. 그는 1 바이트의 데이터를 연결하고 보냈습니다. 이제 응용 프로그램이 연결 시간 초과에 대한 추가 명령을 수신 할 수 없게되어 상당히 클 수 있습니다. async를 사용하면 SYN 패키지를 다시 ACK하지만 코드가 전체 전송을 기다리지는 않습니다.

+0

그는 UDP를 사용하고 있습니다. ACK 공격은 적용되지 않습니다. 귀하의 조언이 그의 신청서의 실시간 성질을 강화하지는 않습니다. CPU 성능과 네트워크 보안을 향상시킵니다. 비동기식 메시지 대기열에서 임시 논리의 관점에서 작성할 수 있다면 서비스 속도가 떨어지면 대기열의 내용을 조작하여 '따라 잡기'위도를 가질 수 있습니다. 동기식 솔루션이 피할 수있는 서비스 속도의 의사 랜덤 변동을 도입합니다 ('크레인'에 대한 링크가 완전히 전용/예측 가능하게 잠복 된 경우에만 관련이 있습니다). –

+0

그는 어디서 UDP를 사용하고 있다고 말합니까? 나는 그것에 대한 언급을 찾을 수 없다. 내가 당신에게 동의하지는 않지만, 하나 이상의 연결을 제공하는 싱크 소켓 대신 비동기를 사용하면 대기 시간이 줄어들 것입니다. 인터넷을 통해 킬러가됩니다. 인터넷은 잠재적으로 잠재 패키지를 프로세스에 보내지 않습니다. - 그래서 나는 당신이 말하는 것에 대해 어떻게 적용되는지 보지 못합니다. 또한 변동이 있다면 무엇이 중요할까요? 그게 무슨 뜻입니까? - 여기서 짐작할 수 있습니다 - 패키지는 순서가 잘못되어 어쨌든 임의로 지연 될 수 있습니다. – Henrik

+0

당신은 그가 UDP에 대해서는 언급하지 않았 음이 틀림 없습니다. 왜 내가 그걸 가정했는지 모르겠다. 어쩌면 산업용 앱 (크레인)에 대한 언급이 내 머리 속에 넣었을지도 모른다. –