¿Cuál es la forma más confiable y tolerante a fallas para integrar estructuras de datos de terceros a través de un servicio web en Drupal 7?


8

He visto varias estrategias para integrar estructuras de datos remotas en Drupal. Las estrategias parecen haber evolucionado a medida que ciertos módulos se han estabilizado y se han probado casos de uso.

Imaginemos que tenemos una estructura de datos "Farmers Markets" que está representada por varios tipos de datos (mercado, horas de mercado, vendedor, puesto, producción), etc., que se exponen a través de una API REST. Las identificaciones para el servicio externo tendrían que relacionarse en Drupal, es decir, al cargar un "mercado", querríamos obtener datos de las "horas de mercado" y la "pérdida". ¿Cuál sería la mejor manera de representar eso como contenido de solo lectura en Drupal que se sincroniza regularmente?

Estoy tratando de evaluar esto con los siguientes criterios:

Estructuras de datos en Drupal:

Nodos vs Entidades personalizadas

Una serie de escenarios que involucran servicios web que he visto usan entidades personalizadas. Simplifica las operaciones CRUD. Sin embargo, estos elementos serían "contenido" en el sentido de que serían vistos públicamente.

Almacenamiento (local vs remoto):

He visto un par de ejemplos en los que los servicios se cargan como entidades remotas, para lo cual este módulo crea una biblioteca para: https://drupal.org/project/wsdata . Esto suena muy atractivo, pero no he visto muchos casos de uso. También hay ejemplos de código personalizado: https://drupal.org/sandbox/fago/1493180

Sincronizar datos:

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

Hay muchas opciones. Feeds ahora admite entidades. Migrar parece mucho más limpio que los feeds, especialmente para escenarios personalizados. También he visto personas que usan un cliente guzzle para obtener sincronización con servicios remotos: http://drupalcode.org/project/ckan.git/blob/refs/heads/ckan_dgu_7.x-1.x:/ckan.drush. inc # l273 . También noté que el módulo WS Client https://drupal.org/project/wsclient proporciona una opción que se ha creado específicamente como un cliente de descanso. Los datos de servicios web se cargan directamente desde un servicio y los almacenan en caché localmente.

Gracias por cualquier comentario


No estoy seguro de que alguien pueda darle una respuesta definitiva sobre cuál es la solución más confiable y tolerante a fallas para su caso de uso específico.
rooby

El módulo de "datos" es otra posibilidad, que se puede utilizar junto con el módulo de feeds (actualmente necesita la solución en este número - drupal.org/node/1033202 )
rooby

El uso del módulo de datos solo nos permitiría almacenar los datos en tablas individuales. Esto estaría bien para crear listas a través de vistas, pero no nos permitiría usar los beneficios del sistema de entidades (ya sean nodos o entidades personalizadas).
acouch

Sí, el módulo de datos tiene un submódulo data_entity, que crea entidades de todos sus elementos de datos.
rooby

Respuestas:


16

1. Reformulando la pregunta

Su ejemplo sugiere que los datos se leen solo en el lado de Drupal, solo con sincronización unidireccional. Creo que este es el factor más importante a considerar aquí, porque en efecto, cualquier solución que implemente será una variante de almacenamiento remoto, sincronización y almacenamiento en caché local, incluso si el almacenamiento en caché local termina siendo entidades en la base de datos de Drupal.

Entonces, la pregunta, en lugar de ser "almacenamiento local versus almacenamiento remoto" será:

  • ¿Debería almacenar en caché los datos localmente?
  • Debe almacenar en caché los datos como entidades reales y utilizar Feeds (o similares) para sincronizar los datos regularmente; O
  • Debería usar algún módulo personalizado que proporcione la sincronización y el almacenamiento en caché.

Un artículo que puede interesarle está en " Entidades remotas en Drupal 7 ".

2. Almacenamiento en caché de los datos

En general, el almacenamiento en caché de los datos es una buena idea:

  • Usted está protegido contra interrupciones de los otros servicios o tiempos de espera en la conexión;

  • Tener sus datos presentes en su base de datos Drupal acelerará las operaciones;

  • Tener sus datos presentes en su base de datos de Drupal significará que es más probable que obtenga integración con otros módulos, como Vistas (aunque esto no está garantizado).

La única ventaja de no almacenar en caché los datos es que nunca se obtienen datos obsoletos, lo que en algunos casos es preferible, a veces es preferible no mostrar datos en lugar de datos obsoletos. No veo esto como un beneficio en el ejemplo que ha dado, por lo que enfocaré esta respuesta en una solución que implique el almacenamiento en caché local.

3. Entidades locales + sincronización

Si opta por tener entidades locales y sincronizarlas usted mismo, volveremos a sus preguntas originales:

  • ¿Debe usar nodos o entidades personalizadas?

  • Qué módulo es mejor para sincronizar.

3.1 Nodos vs entidades personalizadas

  • La definición de qué es exactamente un nodo es bastante abierta. La página de documentación sobre los nodos sugiere que los nodos están "publicando" que están "almacenados" en su sitio, ninguno de los cuales se aplica a sus datos;

  • Como desarrollador de Drupal, esperaría que si algo es un nodo, debería poder manipularlo en el sitio mismo;

  • Como usuario de Drupal, esperaría de manera similar que los nodos se puedan editar;

  • Esta edición de Drupal 8 https://drupal.org/node/2019031 sugiere que el concepto de "solo lectura" se aplicaría a nivel de entidad, en lugar de a nivel de paquete. Si esto alguna vez se implementa, se beneficiaría al seguir esta ruta.

Para resumir: sus datos se leen y almacenan de forma remota , tiene más sentido usar un tipo de entidad personalizada para representar sus datos.

3.2 Sincronización

Para la segunda parte, los dos módulos principales para esto son, como sugiere, Feeds y Migrate .

La diferencia entre Feeds y Migrate es que Feeds está diseñado para la importación regular de contenido, mientras que Migrate está diseñado para portar contenido de una sola vez de un lugar a otro. Migrate admite la actualización de los datos existentes, sin embargo, dado que ambos módulos están bien soportados, tiene más sentido usar el módulo que fue construido para la tarea en cuestión: Feeds es una mejor opción.

Después de haber utilizado ambos módulos (Feeds para sincronizar, Migrar para migrar) no creo que los Feeds sean más desordenados que Migrate. Migrar ha requerido más código personalizado en mi experiencia, aunque migrar sitios enteros es más complejo que importar tipos de contenido individuales, por lo que es difícil de comparar.

4. Módulo personalizado para almacenamiento remoto, sincronización + almacenamiento en caché

Existen varios módulos que pueden ayudar con esta tarea.

Usted mencionó el módulo de datos de servicios web , y otros han mencionado el módulo de datos . Otra opción a considerar es el módulo API de entidad remota . Tenga en cuenta que el único con el que tengo experiencia es el módulo de datos.

  • El módulo de datos de servicios web aún no tiene una versión, lo que puede indicar que el código aún no es estable, la API podría cambiar, etc. No admite consultas de campo de entidad (de acuerdo con su página de proyecto), y una exploración rápida del repositorio de código no muestra evidencia de que tenga soporte para vistas, por lo que no podrá usar vistas para mostrar sus entidades;

  • El módulo de datos está más orientado, en mi experiencia, hacia los no desarrolladores que tienen datos en una tabla y desean exponerlos a las vistas. He encontrado que la versión Drupal 6 es bastante frustrante de usar, aunque eso podría haber cambiado desde entonces;

  • El módulo API de entidad remota suena bastante prometedor: admite la recuperación y el almacenamiento en caché de entidades remotas, y tiene soporte para vistas. Solo está disponible en versión alfa, por lo que la API aún puede cambiar. A primera vista, tampoco parece tener compatibilidad con Entity Field Query, y solo admite un tipo de servicio remoto, por lo que tendría que implementar el suyo.

Conclusión

Dado que ninguno de los módulos de almacenamiento remoto admite consultas de campo de entidad, el uso de entidades reales + feeds es la solución que le brindará la mejor integración con su sitio Drupal.

Si el soporte de Vistas es suficiente y no le preocupa la posible integración con otros módulos a través de consultas de campo de entidad, entonces el uso de la API de entidad remota podría ser el camino a seguir; sin embargo, necesitaría implementar su propia interfaz remota.


¡Gran respuesta! Una cosa que agregaré con respecto a Feeds vs. Migrate es que Migrate tiene una buena manera de manejar referencias entre elementos dentro de conjuntos de datos y entre conjuntos de datos. drupal.org/node/1013506
milesw

1
Acabo de escribir un artículo sobre cómo configurar las cosas con la API de entidad remota con soporte para vistas. Consulte Integrar datos remotos en Drupal 7 y exponerlos a Vistas .
colan

0

Si necesita vistas, reglas, tokens, enganches, búsqueda de API e integración del sistema definitivamente fuerte en mi opinión, no pueden considerarse nodos, pero deben ser entidades personalizadas con su propia idiosincrasia que almacenan en la base de datos la "identificación de la entidad" y el relación de "identificación externa" y con las llamadas de información de recuperación encapsuladas en las "propiedades de la entidad". Finalmente, sea cual sea la herramienta que elija para sincronizar datos, la procesaría con colas cron.

Si solo necesita recuperar y exponer los datos puntualmente, creo que una mejor opción sería crear una clase de interfaz para recuperar datos externos e implementar esta interfaz con una clase que recupere la información de su estructura "Farmers Markets".

Saludos


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.