2009-02-12 11 views
2

Je tente d'optimiser autour d'un goulot d'étranglement possible. J'ai une application serveur qui sert des objets à partir d'une base de données à des applications à distance, qui peut travailler avec 1 - n objets de 1 - n types différents (où n peut être un nombre relativement élevé) qui implémentent tous une interface commune mais peut contenir de nombreuses propriétés uniques sur différents types.WCF recommande des approches pour sérialiser plusieurs objets

Les applications client stockent les objets serveur dans un cache local, jusqu'à ce qu'ils soient prêts à les recréer, via le serveur, dans la base de données.

Ceci est actuellement fait dans WCF avec chaque classe définissant un DataContract. En raison de la quantité potentiellement importante d'objets qui peuvent devoir être retransmis au serveur (elle change en fonction de l'implémentation), je préférerais ne plus les faire tous en tant qu'appels individuels, plutôt que d'envelopper tous les objets dans un seul flux sérialisé (ou mieux compressé) et les envoyer via une connexion au serveur.

Je peux tout simplement rouler le mien, mais je préférerais utiliser une approche recommandée, en espérant que quelqu'un puisse en suggérer un. Si vous pouvez me convaincre, je suis également prêt à accepter que mon approche n'est probablement pas la meilleure idée.

Répondre

3

Quelle est la hauteur «relativement élevée»?

Par exemple, une option qui se produit est d'utiliser un objet emballage:

[DataContract] 
public class Wrapper { 
    [DataMember(Order = 1)] 
    public List<Foo> Foos {get {...}} 

    [DataMember(Order = 2)] 
    public List<Bar> Bars {get {...}} 

    [DataMember(Order = 3)] 
    public List<Blop> Blops {get {...}} 
} 

alors vous devriez être en mesure d'envoyer un seul message avec un nombre quelconque de Foo, Bar et/ou Blop dossiers. Mon inclusion de l'attribut Order était délibérée - si vous voulez réduire la taille du flux, vous pouvez considérer protobuf-net - avec la mise en page ci-dessus, protobuf-net peut se connecter à WCF simplement en incluant [ProtoBehavior] sur la méthode (dans le contrat d'opération interface) que vous voulez attaquer (tant sur le client que sur le serveur). Cela permet au transfert d'utiliser le format binaire «tampons de protocole» de google, en utilisant base-64 pour encoder. Si vous utilisez la liaison basic-http, vous pouvez également utiliser MTOM si elle est activée, donc même le base-64 n'est pas un problème. En utilisant ceci, vous pouvez obtenir significant data transfer savings (~ 1/5ème l'espace basé sur les chiffres montrés).

(modifier 1 - protobuf net part du principe que Foo, Bar et Blopégalement utiliser l'attribut Order)

(modifier 2 - Notez que vous pouvez toujours casser la demande dans un certain nombre de taille moyenne Wrapper messages, puis appelez une méthode pour appliquer toutes les modifications une fois que vous les avez au serveur (probablement dans une table de transfert dans la base de données))

+0

Merci pour ce Marc, un peu de matière à réflexion – johnc

+1

Comme toujours, d'autres options sont disponibles et votre kilométrage peut varier ;-p –

+0

Oui, la programmation est si déterministe n'est-ce pas les gars? lol. –

Questions connexes