문제

WCF 서비스에서 최대의 처리량 성능을 얻어야합니다. 내 테스트 중 하나에서 아래 서비스는 NetTCPBinding을 사용하여 분당 50K 데이터 항목 만 얻었습니다. NetMSMQBinding과 같은 연결 해제 된 바인딩 이이 성능을 향상시킬까요?

서비스 및 클라이언트는 WCF를 사용하고 동일한 기계에서 실행합니다.

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single,
    ConcurrencyMode = ConcurrencyMode.Multiple)]
public class Storage : IStorage
{
    protected List<int> _data = new List<int>();

    public void Insert(int[] data)
    {
        lock (_data)
        {
            _data.AddRange(data);
        }
    }

    public int[] Get()
    {
        lock (_data)
        {
            return _data.ToArray();
        }
    }
}

위의 코드는 실제 코드의 단순화 된 버전입니다.

도움이 되었습니까?

해결책

MSMQ는 TCPBinding보다 느릴 수 있습니다.

동일한 기계에서 실행중인 경우 가장 빠른 바인딩 인 NetNamamedPipeBinding (IPC)을 사용해야합니다.

또한 데이터 직렬화 방법을 확인해야합니다. 프로토콜 버퍼 직렬화는 기본 WCF 바이너리 직렬화보다 훨씬 빠르고 (그리고 약간의 비록) (약간의 조정이 필요합니다).

다른 팁

한 번의 통화가 고립 된 경우 또는 수천 건의 전화가 더 빠르나요?

NetMSMQ는 MSMQ 메시지 대기열을 사용합니다. 메시지를 MSMQ가 처리하는 대기열에 넣으면 해당 대기열에서이를 얻을 수 있습니다. 즉각적인 피드백을받지 못하고 메시지는 일방 통행일뿐입니다.

반면에 NETTCP는 HTTP와 같습니다. 서비스에 요청을 보내고 즉시 응답을받습니다 (모든 것이 잘 진행되는 경우). 메시지가 관련되어 있지 않으면 메시지가 요청/답장입니다.

그래서 나는 당신이 두 바인딩을 비교할 수 있다고 생각하지 않습니다. 그들은 완전히 다른 목적을 제공합니다.

  • 예를 들어 우편 번호를 찾아 해당 위치의 경도/위도를 되 찾으려면 요청/응답 메커니즘을 원합니다 -> NetTCP 사용

  • 예를 들어 문서를 인쇄하거나 데이터베이스 또는 그 특성을 재구성하라는 요청을 입금하려는 경우 결국에는 경향이 있어야하지만 응답을 다시 기대하지는 않지만 나중에 확인할 수 있습니다. 메시지가 올바르게 처리되었습니다.

희망이 조금 더 명확 해지기를 바랍니다. 나는이 두 가지가 실제로 같은 운영 세트를 향하고 있다고 생각하지 않으므로이 두 가지 중에서 직접 선택할 필요가 없을 것입니다. :)

서비스와 클라이언트가 동일한 컴퓨터에서 실행되면 명명 된 파이프와 같은 IPC 메커니즘에 유리한 네트워크를 피할 수 있습니다. 네트워크 트래픽은 IPC 메커니즘을 사용하여 피할 수있는 많은 오버 헤드가 발생합니다.

운송이 거래 속도를 늦추고 있다고 믿을만한 이유가 있습니까? 프로파일 링은 무엇을 말 했습니까? 현재이 서비스는 단일 스레드로 설정되어 있으며 서로를 "고정"하는 여러 호출이 있습니다.

이 서비스는 어떻게 호출/사용됩니까? 멀티 스레드로 만드는 데 도움이됩니까? ReaderWriterLock과 같은보다 정교한 잠금 장치를 사용하여 여러 호출이 동시에 발생할 수 있지만 여전히 "Add"를 차단하는 것은 어떻습니까?

편집 : 이것이 단순화 된 상황이라는 것을 알고 있지만 실제 서비스가 동일한 고려 사항에서 비롯된 것입니까?

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