Який найбільш надійний та стійкий до помилок спосіб інтеграції сторонніх структур даних за допомогою веб-сервісу в Drupal 7?


8

Я бачив низку стратегій інтеграції віддалених структур даних в Drupal. Стратегії, здавалося, розвиваються в міру стабілізації певних модулів і випробування випадків використання.

Уявіть, у нас є структура даних "Farmers Markets", яка представлена ​​низкою типів даних (ринок, market_hours, вендер, стійло, продукція) тощо, які відкриваються через API REST. Ідентифікатори для зовнішньої служби повинні відповідати в Drupal, тобто, завантажуючи "ринок", ми хотіли б захопити дані з "market_hours" та "stall". Що було б найкращим способом представити це як вміст, доступний лише для читання в Drupal, що синхронізується регулярно?

Я намагаюся оцінити це за такими критеріями:

Структури даних в Drupal:

Вузли проти спеціальних організацій

У багатьох сценаріях, пов’язаних із веб-службами, я бачив, як користуються спеціальними об'єктами. Це спрощує використання CRUD. Однак ці пункти будуть "змістовними", оскільки їх переглядатимуть публічно.

Зберігання (локальне та віддалене):

Я бачив пару прикладів, коли служби завантажуються як віддалені сутності, для яких цей модуль створює бібліотеку для: https://drupal.org/project/wsdata . Це звучить найпривабливіше, але я не бачив багатьох випадків використання. Також є приклади спеціального коду: https://drupal.org/sandbox/fago/1493180

Синхронізація даних:

Канали vs Міграція проти Guzzle vs "Клієнт веб-сервісу" та "Дані веб-служб"

Існує ряд варіантів. Зараз канали підтримують об'єкти. Міграція здається набагато чистішою, ніж канали, особливо для користувацьких сценаріїв. Я також бачив людей, які користуються клієнтом guzzle для синхронізації з віддаленими службами: http://drupalcode.org/project/ckan.git/blob/refs/heads/ckan_dgu_7.x-1.x:/ckan.drush. вкл # l273 . Я також помітив, що модуль WS Client https://drupal.org/project/wsclient надає опцію, створену спеціально для клієнта відпочинку. Дані веб-служб завантажуються безпосередньо з сервісу та зберігають їх локально.

Дякую за будь-які думки.


Я не впевнений, що хтось може дати вам остаточну відповідь щодо того, що це найнадійніше і невідмовне рішення для Вашого конкретного випадку використання.
рубін

Модуль "дані" - це ще одна можливість, яку можна використовувати спільно з модулем каналів (наразі потрібне рішення в цьому питанні - drupal.org/node/1033202 )
rooby

Використання модуля даних просто дозволило б нам зберігати дані в окремих таблицях. Це було б чудово для створення списків за допомогою представлень, але не дозволило б нам використовувати переваги сутнісної системи (будь то вузли чи спеціальні сутності).
acouch

Так, модуль даних має підмодуль data_entity, який створює об'єкти всіх ваших даних даних.
рубін

Відповіді:


16

1. Переформулювання питання

Ваш приклад дозволяє припустити, що дані читаються лише на стороні Drupal, лише в односторонньому синхронізації. Я думаю, що це є найважливішим фактором, який слід враховувати тут, адже фактично яке б рішення ви не реалізували, це буде варіант віддаленого зберігання, синхронізації та локального кешування - навіть якщо локальне кешування в кінцевому підсумку є сутністю в базі даних Drupal.

Тож питання, а не "локальне та віддалене зберігання", буде таким:

  • Якщо ви взагалі кешуєте дані локально;
  • Якщо ви кешуєте дані як фактичні об'єкти та використовуєте канали (або подібні) для регулярної синхронізації даних; АБО
  • Якщо ви використовуєте модуль, виготовлений на замовлення, який забезпечує синхронізацію та кешування.

Стаття, яка може вас зацікавити, знаходиться у " Віддалених об'єктах у Drupal 7 ".

2. Кешування даних

Загалом, кешування даних є хорошою ідеєю:

  • Ви захищені від перебоїв у роботі інших служб або тайм-аутів під час з'єднання;

  • Присутність ваших даних у вашій базі даних Drupal пришвидшить операції;

  • Наявність ваших даних у вашій базі даних Drupal означатиме, що ви швидше отримаєте інтеграцію з іншими модулями, такими як Views (хоча це не гарантується).

Єдиною перевагою не кешування даних є те, що ви ніколи не отримуєте несвіжих даних, що в деяких випадках є кращим - іноді краще відображати не дані, а нестареві дані. Я не вважаю це користю у наведеному вами прикладі, тому я зосередив цю відповідь на рішенні, яке передбачає локальне кешування.

3. Місцеві організації + синхронізація

Якщо ви хочете скористатися локальними сутностями та синхронізувати їх самостійно, ми повернемось до ваших оригінальних питань:

  • Якщо ви використовуєте вузли чи спеціальні об'єкти;

  • Який модуль найкраще синхронізувати.

3.1 Вузли та спеціальні особи

  • Визначення того, що саме є вузлом, є досить відкритим. Сторінка документації по вузлах говорить про те, що вузли "розміщують", які "зберігаються" на вашому сайті - жодне з яких не стосується ваших даних;

  • Як розробник Drupal я би сподівався, що якщо щось є вузлом, то я повинен мати можливість маніпулювати ним на самому сайті;

  • Як користувач Drupal, я б також очікував, що вузли можна редагувати;

  • Цей випуск Drupal 8 https://drupal.org/node/2019031 передбачає, що поняття "лише для читання" - це те, що застосовуватиметься на рівні сутності, а не на рівні пакетів. Якщо це колись реалізується, ви отримаєте користь від цього, спустившись по цьому маршруту.

Підводячи підсумок: ваші дані лише для читання та віддаленого зберігання має більше сенсу використовувати для представлення ваших даних спеціальний тип сутності.

3.2 Синхронізація

У другій частині два основні модулі для цього є, як ви пропонуєте, каналами та міграцією .

Різниця між каналами та міграцією полягає в тому, що канали створюються для регулярного імпортування вмісту, тоді як Migrate - для одноразового перенесення вмісту з одного місця в інше. Migrate підтримує оновлення наявних даних, однак, враховуючи, що обидва модулі добре підтримуються, має сенс використовувати модуль, який було побудовано для завдання, що знаходиться під рукою - канали - це краще відповідність.

Використовуючи обидва модулі (канали для синхронізації, міграція для міграції), я не вважаю канали більш брудними, ніж міграція. Міграція вимагає більше спеціального коду за моїм досвідом, хоча міграція цілих сайтів є складнішою, ніж імпорт окремих типів вмісту, тому важко порівняти.

4. Спеціальний модуль для віддаленого зберігання, синхронізації + кешування

Існує ряд модулів, які можуть допомогти в цьому.

Ви згадали модуль даних веб-служб , а інші згадували модуль даних . Ще один варіант, який слід врахувати - це модуль API віддаленої сутності . Зауважте, що єдиний із тих, у кого я маю досвід, - це модуль даних.

  • Модуль даних веб-служб ще не має випуску - це може означати, що код ще не стабільний, API може змінюватися тощо. Він не підтримує запити полів Entity (відповідно до його сторінки проекту), і швидкий перегляд сховища коду не показує, що він має підтримку Views, тому ви не зможете використовувати Views для відображення своїх сутностей;

  • На мій досвід, модуль даних більше орієнтований на не розробників, які мають дані в таблиці та хочуть виставити їх переглядам. Я знайшов версію Drupal 6 досить неприємною у використанні - хоча це могло змінитися з тих пір;

  • Модуль API віддаленої сутності звучить досить перспективно - він підтримує отримання та кешування віддалених об'єктів та має підтримку Views. Це лише в альфа-релізі - API може все-таки змінюватися. На перший погляд, схоже, немає і підтримки Entity Field Query, і він підтримує лише один тип віддаленого сервісу, тож вам доведеться реалізувати свій власний.

Висновок

Зважаючи на те, що жоден з модулів віддаленого зберігання не підтримує запити по суті Entity, використання фактичних сутностей + каналів - це рішення, яке дасть вам найкращу інтеграцію з вашим сайтом Drupal.

Якщо підтримка Views достатня, і ви не турбуєтесь про потенційну інтеграцію з іншими модулями за допомогою Entity Field Queries, то можливим буде використання API віддаленої сутності - вам потрібно буде впровадити власний віддалений інтерфейс.


Чудова відповідь! Я хочу додати одне, що стосується каналів проти міграції - це те, що в Migrate є чудовий спосіб обробки посилань між елементами в наборах даних і на різних наборах даних. drupal.org/node/1013506
milesw

1
Я щойно написав статтю про налаштування налаштувань за допомогою API віддаленої сутності з підтримкою Views. Див. Розділ Інтеграція віддалених даних у Drupal 7 та оголення їх до переглядів .
колан

0

Якщо вам потрібні погляди, правила, маркери, гачки пошуку, api пошуку та, безумовно, сильна системна інтеграція, на мою думку, вони не можуть вважатися вузлами, але вони повинні бути спеціальними сутностями, які мають власну ідіосинкразію, зберігаючи в базі даних "ідентифікатор сутності" та відношення "зовнішній ідентифікатор" та виклики для отримання інформації, інкапсульовані у "властивості сутності". Нарешті, який би інструмент ви не вибрали для синхронізації даних, я обробляв би їх чергою cron.

Якщо вам просто потрібно отримати і викрити дані пунктуально, я думаю, що кращим вибором було б створити клас інтерфейсу для отримання зовнішніх даних та реалізувати цей інтерфейс з класом, який отримує інформацію з вашої структури "Ринки фермерів".

З повагою


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.