Quelle est la manière la plus fiable et tolérante aux pannes d'intégrer des structures de données tierces via un service Web dans Drupal 7?

8

J'ai vu un certain nombre de stratégies pour intégrer des structures de données distantes dans Drupal. Les stratégies semblent évoluer à mesure que certains modules se sont stabilisés et que des cas d'utilisation ont été essayés.

Imaginez que nous ayons une structure de données "Farmers Markets" qui est représentée par un certain nombre de types de données (marché, market_hours, vendeur, décrochage, produits) etc. qui sont exposés via une API REST. Les identifiants du service externe devraient être liés dans Drupal, c'est-à-dire que lors du chargement d'un «marché», nous voudrions récupérer les données des «market_hours» et «stall». Quelle serait la meilleure façon de représenter cela en tant que contenu en lecture seule dans Drupal qui est synchronisé régulièrement?

J'essaie d'évaluer cela avec les critères suivants:

Structures de données dans Drupal:

Nœuds vs entités personnalisées

Un certain nombre de scénarios impliquant des services Web que j'ai vus utilisent des entités personnalisées. Il simplifie les opérations CRUD. Cependant, ces éléments seraient du «contenu» dans la mesure où ils seraient consultés publiquement.

Stockage (local vs distant):

J'ai vu quelques exemples où les services sont chargés en tant qu'entités distantes, pour lesquelles ce module crée une bibliothèque pour: https://drupal.org/project/wsdata . Cela semble plus attrayant, mais n'a pas vu beaucoup de cas d'utilisation. Il existe également des exemples de code personnalisé: https://drupal.org/sandbox/fago/1493180

Synchronisation des données:

Feeds vs Migrate vs Guzzle vs 'Web Service Client' vs 'Web Services Data'

Il existe plusieurs options. Les flux prennent désormais en charge les entités. La migration semble beaucoup plus propre que les flux, en particulier pour les scénarios personnalisés. J'ai également vu des gens utiliser un client guzzle pour synchroniser avec les services distants: http://drupalcode.org/project/ckan.git/blob/refs/heads/ckan_dgu_7.x-1.x:/ckan.drush. inc # l273 . J'ai également remarqué que le module WS Client https://drupal.org/project/wsclient fournit une option qui a été créée spécifiquement en tant que client de repos. Les données des services Web se chargent directement à partir d'un service et les mettent en cache localement.

Merci pour toutes vos pensées.

un canapé
la source
Je ne suis pas sûr que quiconque puisse vous donner une réponse définitive sur ce que c'est la solution la plus fiable et tolérante aux pannes pour votre cas d'utilisation spécifique.
rooby
Le module "données" est une autre possibilité, qui peut être utilisée en conjonction avec le module de flux (a actuellement besoin de la solution dans ce numéro - drupal.org/node/1033202 )
rooby
L'utilisation du module de données nous permettrait simplement de stocker les données dans des tables individuelles. Ce serait bien pour créer des listes via des vues mais ne nous permettrait pas d'utiliser les avantages du système d'entités (qu'il s'agisse de nœuds ou d'entités personnalisées).
acouch
Oui, le module de données possède un sous-module data_entity, qui crée des entités de tous vos éléments de données.
rooby

Réponses:

16

1. Reformuler la question

Votre exemple suggère que les données sont en lecture seule du côté Drupal, avec une synchronisation unidirectionnelle uniquement. Je pense que c'est le facteur le plus important à considérer ici, car en fait, quelle que soit la solution que vous implémentez, ce sera une variante du stockage à distance, de la synchronisation et de la mise en cache locale - même si la mise en cache locale finit par être des entités dans la base de données Drupal.

Donc, la question, plutôt que d'être "stockage local vs stockage distant" va être:

  • Si vous mettez en cache les données localement;
  • Si vous mettez en cache les données en tant qu'entités réelles et utilisez des flux (ou similaires) pour synchroniser régulièrement les données; OU
  • Si vous utilisez un module personnalisé qui fournit la synchronisation et la mise en cache.

Un article qui pourrait vous intéresser est " Entités distantes dans Drupal 7 ".

2. Mise en cache des données

En général, la mise en cache des données est une bonne idée:

  • Vous êtes protégé contre les pannes des autres services ou les dépassements de délai dans la connexion;

  • La présence de vos données dans votre base de données Drupal accélérera les opérations;

  • La présence de vos données dans votre base de données Drupal signifie que vous êtes plus susceptible d'obtenir une intégration avec d'autres modules, tels que des vues (bien que cela ne soit pas garanti).

Le seul avantage de ne pas mettre en cache les données est que vous n'obtenez jamais de données périmées, ce qui dans certains cas est préférable - il est parfois préférable de n'afficher aucune donnée plutôt que des données périmées. Je ne vois pas cela comme un avantage dans l'exemple que vous avez donné, je vais donc concentrer cette réponse sur une solution qui implique la mise en cache locale.

3. Entités locales + synchronisation

Si vous optez pour l'option d'avoir des entités locales et de les synchroniser vous-même, nous revenons à vos questions d'origine:

  • Si vous utilisez des nœuds ou des entités personnalisées;

  • Quel module est le meilleur pour la synchronisation.

3.1 Nœuds vs entités personnalisées

  • La définition de ce qu'est exactement un nœud est assez ouverte. La page de documentation sur les nœuds suggère que les nœuds "publient" qui sont "stockés" sur votre site - aucun des deux ne s'applique à vos données;

  • En tant que développeur Drupal, je m'attendrais à ce que si quelque chose est un nœud, je devrais pouvoir le manipuler sur le site lui-même;

  • En tant qu'utilisateur Drupal, je m'attendrais également à ce que les nœuds puissent être modifiés;

  • Ce numéro de Drupal 8 https://drupal.org/node/2019031 suggère que le concept de "lecture seule" est celui qui s'appliquerait au niveau de l'entité, plutôt qu'au niveau du bundle. Si cela est mis en œuvre, vous en bénéficieriez en empruntant cette voie.

Pour résumer: vos données étant en lecture seule et stockées à distance, il est plus judicieux d'utiliser un type d'entité personnalisé pour représenter vos données.

3.2 Synchronisation

Pour la deuxième partie, les deux modules principaux pour cela sont, comme vous le suggérez, Feeds et Migrate .

La différence entre Feeds et Migrate est que Feeds est conçu pour l'importation régulière de contenu, tandis que Migrate est conçu pour le portage unique de contenu d'un endroit à un autre. Migrate prend en charge la mise à jour des données existantes, mais étant donné que les deux modules sont bien pris en charge, il est plus logique d'utiliser le module qui a été créé pour la tâche à accomplir - Les flux sont une meilleure correspondance.

Ayant utilisé les deux modules moi-même (flux pour la synchronisation, migration pour la migration), je ne trouve pas que les flux soient plus compliqués que la migration. La migration a nécessité plus de code personnalisé dans mon expérience, bien que la migration de sites entiers soit plus complexe que l'importation de types de contenu uniques, il est donc difficile de comparer.

4. Module personnalisé pour le stockage à distance, la synchronisation et la mise en cache

Il existe un certain nombre de modules qui peuvent vous aider dans cette tâche.

Vous avez mentionné le module Données des services Web et d'autres ont mentionné le module Données . Une autre option à considérer est le module API d'entité distante . Notez que le seul de ceux que j'ai expérimenté est le module Data.

  • Le module de données des services Web n'a pas encore de version - ce qui peut indiquer que le code n'est pas encore stable, l'API peut changer, etc. Il ne prend pas en charge les requêtes de champ d'entité (selon sa page de projet), et une navigation rapide dans le référentiel de code ne montre aucune preuve qu'il prend en charge les vues - vous ne seriez donc pas en mesure d'utiliser des vues pour afficher vos entités;

  • D'après mon expérience, le module Données est davantage orienté vers les non-développeurs qui ont des données dans une table et qui souhaitent les exposer à des vues. J'ai trouvé la version Drupal 6 assez frustrante à utiliser - même si cela a peut-être changé depuis;

  • Le module API d'entité distante semble assez prometteur - il prend en charge la récupération et la mise en cache des entités distantes et prend en charge les vues. Ce n'est que sur la version alpha - donc l'API pourrait encore changer. À première vue, il ne semble pas non plus prendre en charge Entity Field Query, et il ne prend en charge qu'un seul type de service distant, vous devez donc implémenter le vôtre.

Conclusion

Étant donné qu'aucun des modules de stockage à distance ne prend en charge les requêtes de champ d'entité, l'utilisation des entités + flux réels est la solution qui vous donnera la meilleure intégration avec votre site Drupal.

Si la prise en charge de Views est suffisante et que vous ne vous inquiétez pas d'une intégration potentielle avec d'autres modules via Entity Field Queries, l'utilisation de l'API d'entité distante peut être la voie à suivre - vous devez cependant implémenter votre propre interface distante.

Alice Heaton
la source
Très bonne réponse! Une chose que j'ajouterai concernant les flux par rapport à Migrate est que Migrate a une bonne façon de gérer les références entre les éléments dans les jeux de données et entre les jeux de données. drupal.org/node/1013506
milesw
1
Je viens d'écrire un article sur la configuration des choses avec l'API d'entité distante avec prise en charge des vues. Voir Intégrer des données distantes dans Drupal 7 et les exposer à Views .
colan
0

Si vous avez besoin de vues, de règles, de jetons, de crochets cruds, d'une API de recherche et d'une intégration système définitivement forte, à mon avis, ils ne peuvent pas être considérés comme des nœuds, mais ils doivent être des entités personnalisées avec leur propre idiosyncrasie stockant dans la base de données "l'identifiant d'entité" et le relation "id externe" et avec les appels d'informations de récupération encapsulés dans les "propriétés d'entité". Enfin, quel que soit l'outil que vous choisissez pour synchroniser les données, je le traiterais avec des files d'attente cron.

Si vous avez juste besoin de récupérer et d'exposer des données ponctuellement, je pense qu'un meilleur choix serait de créer une classe d'interface pour récupérer des données externes et d'implémenter cette interface avec une classe qui récupère les informations de votre structure "Farmers Markets".

Cordialement

Enxebre
la source
0

Il y a l' API Field Storage , qui permet des back-ends de stockage enfichables autres que le moteur de base de données par défaut.

colan
la source