2010-10-13 7 views
2

Alors j'ai eu un débat avec mon collègue sur WCF RIA Services, et exactement combien de données que nous envoyons au client dans une demande donnée. Voici la configuration:.Net Services WCF RIA: Pour faire la page ou ne pas faire la page? et combien de données pour envoyer le tuyau

Nous créons une application de reporting dans Silverlight et saisir des données d'un service WCF RIA pour remplir différentes grilles et des graphiques. Nous avons deux idées différentes sur la façon de mettre en œuvre le service. Il y a quelques mises en garde qui sont importantes pour prendre cette décision.

Avertissement 1: Un "rapport" peut être n'importe quel nombre de tables/diagrammes, mais très probablement composé de seulement quelques uns chacun.

Avertissement 2: La taille maximale d'une table de données peut être de milliers de lignes.

Avertissement 3: Certaines tables contiendront plus de 50 colonnes (pas notre idée ...). Les utilisateurs auraient besoin de la possibilité d'afficher des colonnes de masquage, car honnêtement, qui pourrait assimiler autant de données à la fois?

Nous avons deux idées différentes:

  1. Créez un Data Contract pour chaque table/tableau et une méthode de service GetTableX()/GetChartX() distinct pour chacun. Nous utiliserions un service de domaine pour cela, donc le filtrage/tri/pagination pourrait être géré sur le serveur, et seulement un certain nombre d'objets seraient retournés.

    Parce qu'un « rapport » pourrait contenir n tableaux/graphiques, cela signifie l'envoi de demandes n chaque fois qu'un Report est chargé, et une demande supplémentaire pour chaque page sur une table. Le service serait également un peu verbeux, 15 rapports (qui vont inévitablement croître), avec peut-être 3-5 méthodes par rapport pourrait signifier 45 à 75 méthodes. Étant donné que les utilisateurs peuvent masquer certaines colonnes et que certaines d'entre elles seront masquées par défaut, une quantité importante de données peut être envoyée au client et non à un événement. Pour autant que je sache, il n'y a pas moyen de limiter ceci avec un DomainService.

  2. Créez un objet Report pour chaque rapport, avec un ensemble de grilles/diagrammes, ainsi que les données de chaque graphique/table, filtrés selon des critères universels pour chaque rapport. Sérialiser et renvoyer l'objet de rapport au client, en laissant Silverlight gérer la pagination/le tri/le filtrage. Cela signifierait beaucoup moins de requêtes vers le serveur, mais la charge utile du message serait également plus importante. Je ne suis pas sûr, car je n'ai pas étudié assez, mais nous aurions probablement à creuser profondément dans WCF RIA Services pour que cela fonctionne, ou nous ferions mieux de racler RIA et de faire notre propre chose au-dessus de WCF. Cependant, cela nous donnerait la possibilité de choisir quelles colonnes doivent être envoyées au navigateur dans le scénario hide/show columns, ce qui réduirait la charge utile globale sur toute la ligne.

tl; dr = Est-il préférable d'envoyer toutes vos données à travers le fil une fois, ou à la page il?

  1. Il semble que la réponse dépend fortement de la quantité de données, mais comment les gars pensez-vous de cette décision?

  2. Combien de données faut-il envoyer dans une requête? Quand la radiomessagerie devient-elle plus efficace? ou au moins superficiellement plus efficace pour l'utilisateur? **

  3. D'un point de vue commercial, quand est-il préférable d'utiliser simplement les outils intégrés plutôt que de rouler les vôtres. Supposons que votre propre serait plus efficace, comment pesez-vous la valeur de cette efficacité contre le travail supplémentaire?

Répondre

0

Dans notre application, nous faisons parfois des RIA appels qui serait le rendement autant qu'un 10Mo de données, mais elle a travaillé dans le sens le plus simple, mais est vraiment venu pour nous mordre dans le cul quand nous avons déployé parce qu'il ya tous types de limites dans l'ensemble du serveur Web < -> HTTP < -> pile de navigateur qui ont causé des problèmes. Je parle des délais, des tailles de mémoire tampon, des tailles de requêtes maximales, etc. Incidemment, il n'est pas simple d'augmenter les délais d'attente pour les appels RIA. Pour faciliter ces douleurs, nous avons commencé à aller chercher de gros appels dans RIA en plus petits morceaux. Nous aurions une requête côté serveur qui, lorsqu'elle est exécutée, renvoie toutes les clés primaires des lignes désirées (par exemple un 10000 guids). Ensuite, sur le client, nous utilisons RIA pour extraire les objets par blocs de 500 à la fois, par la clé primaire.

Le gain le plus important que cela nous a apporté est dans l'expérience utilisateur, car nous pouvons afficher une barre de progression pour la quantité de données chargée. La segmentation est également utile car elle permet au serveur de rester un peu plus réactif. Le chargement de 10 Mo de données en un seul appel occupe exclusivement le serveur, mais le chargement en plusieurs morceaux permet un partage un peu plus fluide des ressources.

Espérons que ça aide.