2009-05-04 4 views
9

Je crée un serveur réseau et démarre plusieurs AppDomains sur le serveur vers lequel les demandes sont acheminées. Quel sera le moyen le plus rapide d'envoyer une charge utile de requête à l'un des AppDomains pour traitement?Envoyer des tableaux d'octets volumineux entre AppDomains dans le même processus

  1. Lire dans la charge utile de la socket dans un tableau d'octets et le marshal.
  2. Marshal le flux réseau (hérite de MarshalByRef) vers AppDomain.
  3. Lire la charge utile. Décodez-le en objets. Maréchal les objets décodés.
  4. Utilisez des canaux nommés pour transférer le tableau d'octets.
  5. Utilisez des connecteurs de bouclage.
  6. Peut-être existe-t-il un moyen de marshaler la connexion socket réelle?

Le décodage crée principalement des objets immuables qui sont utilisés pour déterminer comment satisfaire les clients demandent et l'AppDomain crée alors une réponse et maréchaux revenir à l'AppDomain hôte qui l'envoie à travers la prise.

La méthode devrait préférer moins de mémoire sur moins de CPU.

WCF n'est pas une option.

Répondre

1

TCP binaire à distance est certainement rapide, je ne sais pas combien plus rapide que les prises brutes qui est probablement le plus rapide, mais un PIA royal.

J'ai exécuté 1500 - 2000 req par seconde en production en utilisant le transfert binaire HTTP entre deux boîtes. Sur la même boîte, vous devriez avoir beaucoup de hautes performances en utilisant TCP ou un canal de nommage, en fonction des cycles de processeur nécessaires au traitement des données.

1

Si j'étais vous, je voudrais voir comment Cassini est implémenté. Il fait à peu près exactement ce que vous parlez de faire.

En fait, Cassini a été en quelque sorte remplacé par Webhost, qui est le serveur Web intégré fourni avec Visual Studio. Jetez un oeil à this post sur le blog de Phil Haack pour plus d'informations.

+0

Cassini écoute les connexions dans l'AppDomain distant. Il semble que OP veut écouter sur le socket sur le domaine par défaut AppDomain. –

1

Très bonne question. Si j'arrivais à ce problème, j'utiliserais probablement un flux de mémoire tampon/mémoire tampon et le marshal le flux dans l'AppDomain qui consomme l'objet pour réduire le marshaling ou sérialiser de nombreux graphiques d'objet qui ont été créés dans un AppDomain différent.

Mais là encore, il semble que vous dupliquiez presque complètement la fonctionnalité d'IIS, donc je regarderais/reflector dans l'espace de noms System.Web.Hosting et je verrais comment ils le manipulent et leur WorkerThreadPool etc ....

1

6. Peut-il y avoir un moyen de marshaler la connexion socket réelle ?

Le 6-ème est l'IMO la meilleure option. Socket de perspective de processus est juste une poignée. AppDomains résident dans un processus unique. Cela signifie que les domaines d'application peuvent échanger des poignées de socket.

Si le regroupement de socket ne fonctionne pas, vous pouvez essayer de recréer le socket dans un autre domaine d'application. Vous pouvez utiliser DuplicateAndClose pour ce faire.

Si cela ne fonctionne pas, vous devriez faire quelques tests de performance pour choisir la meilleure méthode de transfert de données. (Je choisirais des tubes nommés ou des fichiers mappés memomry)

Questions connexes