2009-02-17 14 views
9

Prowadzimy serwis, który wymaga szybkiej komunikacji z innym procesem. Obecnie używamy WCF NetNamedPipeBinding w trybie buforowanym, aby wywoływać metody w usłudze, która wydaje się zapewniać najmniejszy narzut dostępnych powiązań WCF. Czy jest to szybszy sposób, używając zarządzanego kodu?Najszybsza metoda komunikacji z usługą Windows

Edytuj: Bunching requests (Sugerowane poniżej) to opcja już rozważona. Naprawdę zastanawiamy się, czy istnieje alternatywny interfejs API dla komunikatów między procesami, który jest lepszy od WCF przy użyciu potoków nazwanych.

Odpowiedz

8

Jeśli używasz WCF, nazwane potoki są najszybszym sposobem komunikowania się w systemie lokalnym.

Jeśli rzuca dużo danych wokół następnie można zajrzeć do strumieniowego przesyłania swoich API (po prostu dodał System.IO.Stream jako parametr zamiast przekazywać tablicę lub łańcuch itd)

dla Również wydajność, twój model hostingu jest również bardzo ważny, jeśli chodzi o tryb instancji usługi. Książka Juval Lowy o WCF jest naprawdę dobra, gdy przejdziemy przez przykłady kodu do mięsa jego książki.

EDYCJA: W odpowiedzi na komentarz, spójrz na atrybut "ServiceBehaviour", który można zastosować do definicji usługi. (nie twój opis IServiceInterface, ale twoja konkretna implementacja twojej klasy).

Możesz zdefiniować swój kod jako instancję przez PerCall, PerSession lub Singleton. Domyślnie jest to singleton Persesja (dzięki @RichardOD) z trybem współbieżności ustawionym na single i instancjaContextMode ustawiona na true, co umożliwia hostowanie WCF na formularzu okna i uniemożliwia strzelanie sobie w stopę, jeśli nie rozumiesz instancji.

Zasadniczo jeśli pozostawisz ustawienie domyślne, otrzymasz jeden wątkowany, sekwencyjnie przetworzony host WCF.

Usługa MSDN ma pewne uzasadnione informacje na temat tego, co robi każdy typ.

+0

Spence, czy możesz zrozumieć, co masz na myśli przez "tryb instancji usługi". Obecnie działa jako samoobsługowy ServiceHost, który z kolei jest hostowany w standardowej usłudze Windows – spender

+2

@Spence. Wartością domyślną nie jest Singleton, to PerCall lub PerSession w zależności od tego, czy kanał obsługuje sesje. – RichardOD

+0

1 punkt do @RichardOD. Moje przeprosiny, pomylone z domyślnym ustawieniem ConcurrencyMode single, do którego próbowałem się dostać, domyślne ustawienia to zero współbieżności, co wpłynie na skalowalność. – Spence

3

Cóż, czy jesteś powiązany z obszarem (np. Duże wiadomości) lub w obie strony (wiele małych wiadomości)?

W przypadku dużych wiadomości rozważ kompresję (jeśli obciążenie sieci IO jest narzutem) lub bardziej wydajną serializację, taką jak protobuf-net.

W przypadku czatowych interfejsów API należy rozważyć zbieranie wiadomości w celu wykonania mniejszej liczby podróży w obie strony.

+0

To będzie bardziej rozmowny interfejs API. Jednym z jej celów jest obsługa autouzupełniania żądań ze strony internetowej, więc wiązanie nie będzie w tym przypadku możliwe, ale w innych przypadkach powinno to zmniejszyć ruch między dwoma a dziesięciokrotnymi. – spender

Powiązane problemy