Question

Je travaille actuellement sur un service Web et il est possible que les résultats renvoyés soient assez volumineux (> 5 Mo).

Il est parfaitement valable que cet ensemble de données soit aussi volumineux et que le service Web puisse être appelé synchrone ou asynchrone, mais je me demande ce que pensent les gens sur les points suivants :

  1. Si la connexion est perdue, l'intégralité de ResultSet devra être régénérée et envoyée à nouveau.Y a-t-il un moyen de faire une sorte de «CV» si la connexion est perdue ou réinitialisée?

  2. L'envoi d'un ensemble de résultats aussi volumineux est-il même approprié ?Serait-il préférable d'implémenter une sorte de « pagination » dans laquelle l'ensemble de résultats est généré et stocké sur le serveur et le client peut ensuite télécharger des morceaux de l'ensemble de résultats en plus petites quantités et réassembler l'ensemble à sa fin ?

Était-ce utile?

La solution

J'ai vu les trois approches, paginé, stocker et récupérer, et poussée massive.

Je pense que la solution à votre problème dépend dans une certaine mesure de la raison pour laquelle votre jeu de résultats est si volumineux et de la manière dont il est généré.Vos résultats augmentent-ils avec le temps, sont-ils calculés d’un seul coup puis repoussés, souhaitez-vous les diffuser dès que vous les avez ?

Approche de pagination

D'après mon expérience, l'utilisation d'une approche de pagination est appropriée lorsque le client a besoin d'un accès rapide à des morceaux de taille raisonnable de l'ensemble de résultats, similaires aux pages des résultats de recherche.Les considérations ici sont la conversation globale de votre protocole, la mise en cache de l'ensemble des résultats entre les demandes de page client et/ou le temps de traitement nécessaire pour générer une page de résultats.

Stocker et récupérer

Le stockage et la récupération sont utiles lorsque les résultats ne sont pas un accès aléatoire et que la taille du jeu de résultats augmente à mesure que la requête est traitée.Les problèmes à considérer ici sont la complexité pour les clients et si vous pouvez fournir à l'utilisateur des résultats partiels ou si vous devez calculer tous les résultats avant de renvoyer quoi que ce soit au client (pensez au tri des résultats des moteurs de recherche distribués).

Poussée massive

L’approche de poussée massive est presque certainement imparfaite.Même si le client a besoin de toutes les informations et qu'elles doivent être regroupées dans un ensemble de résultats monolithique, je recommanderais d'adopter l'approche de WS-ReliableMessaging (soit directement, soit via votre propre version simplifiée) et regroupez vos résultats.En faisant cela, vous

  1. s'assurer que les pièces parviennent au client
  2. pouvez jeter le morceau dès que vous recevez un reçu du client
  3. peut réduire les problèmes possibles de consommation de mémoire liés à la nécessité de conserver 5 Mo de XML, DOM ou autre en mémoire (en supposant que vous ne traitez pas les résultats en streaming) côté serveur et client.

Comme d'autres l'ont dit, ne faites rien tant que vous ne connaissez pas la taille de votre ensemble de résultats, la manière dont il est généré et les performances globales qui sont de véritables problèmes.

Autres conseils

Il n'y a pas de loi stricte contre 5 Mo en raison de la taille définie.Plus de 400 Mo peuvent être difficile à envoyer.

Vous obtiendrez automatiquement des gestionnaires asynchrones (puisque vous utilisez .net)

Implémentez une sorte de «pagination» où le résultat est généré et stocké sur le serveur et le client peut ensuite télécharger des morceaux du résultat en montants plus petits et réassembler l'ensemble à leur fin

Cela se produit déjà pour vous -- cela s'appelle tcp/ip ;-) Réimplémenter cela pourrait être excessif.

De la même manière --

L'ensemble des résultats devra être régénéré et renvoyé

Si c'est MS-SQL, par exemple, qui génère la majeure partie de l'ensemble de résultats, sa régénération profitera d'une certaine mise en cache implicite dans SQL Server et les générations suivantes seront plus rapides.

Dans une certaine mesure, vous pouvez ne pas vous soucier de ces problèmes, jusqu'à ce qu'ils apparaissent comme de « vrais » problèmes – parce que la ou les plates-formes que vous utilisez prennent en charge pour vous une grande partie des goulots d'étranglement en matière de performances.

Je suis quelque peu en désaccord avec le commentaire de secretGeek :

Cela se produit déjà pour vous -- cela s'appelle tcp/ip ;-) Réimplémenter cela pourrait être excessif.

Il y a des moments où vous souhaiterez peut-être faire exactement cela, mais uniquement du point de vue de l'interface utilisateur.Si vous implémentez un moyen de diffuser les données vers le client (via quelque chose comme un mécanisme de pushlets) ou de les diviser en pages comme vous le suggérez, vous pouvez alors charger un très petit sous-ensemble sur le client, puis créer lentement l'interface utilisateur avec la totalité des données.

Cela donne une interface utilisateur plus fluide et plus rapide (du point de vue de l'utilisateur), mais vous devez évaluer si l'effort supplémentaire en vaudra la peine...parce que je ne pense pas que ce sera une quantité de travail insignifiante.

Il semble donc que vous seriez intéressé par une solution qui ajoute les paramètres « numéro d'enregistrement de départ » et « numéro d'enregistrement final » à votre méthode Web.(ou 'numéro de page' et 'résultats par page')

Cela ne devrait pas être trop difficile si le magasin de sauvegarde est un serveur SQL (ou même MySQL), car ils ont intégré la prise en charge de la numérotation des lignes.

Malgré cela, vous devriez pouvoir éviter toute gestion de session sur le serveur, éviter toute mise en cache explicite de l'ensemble de résultats et simplement compter sur la mise en cache du magasin de sauvegarde pour vous simplifier la vie.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top