Попередження: велика публікація, деякі думки, невизначені "роби те, що найкраще підходить для тебе"
Як правило, це робиться як засіб реалізації «шестикутної архітектури» навколо вашої бази даних. Ви можете мати веб-додатки, мобільні додатки, настільні додатки, масові імпортери та обробку фонових даних, всі споживають вашу базу даних рівномірно. Звичайно, ви могли певною мірою зробити те саме, написавши багату бібліотеку для доступу до вашої бази даних, і всі ваші процеси використовують цю бібліотеку. І справді, якщо ви перебуваєте в невеликому магазині з дуже простою системою, це, мабуть, кращий шлях; Це простіший підхід, і якщо вам не потрібні розширені можливості більш складної системи, навіщо платити за складність? Однак якщо ви працюєте з великим, вдосконаленим набором систем, які всі потребують взаємодії з вашою базою даних в масштабі,
Незалежність та обслуговування платформи
Якщо у вас є база даних, і ви пишете бібліотеку Python для взаємодії з цією базою даних, і всі тягнуть її в цю бібліотеку для взаємодії з базою даних, це чудово. Але, скажімо, раптом вам потрібно написати мобільний додаток, і тепер цей мобільний додаток повинен поговорити з базою даних. І ваші інженери iOS не використовують Python, а ваші Android-інженери не використовують Python. Можливо, хлопці з iOS хочуть використовувати мови Apple, а інженери Android хочуть використовувати Java. Тоді ви застрягли б у написанні та підтримці бібліотеки доступу до даних трьома різними мовами. Можливо, розробники iOS та Android вирішили використовувати щось на кшталт Xamarin, щоб максимально використовувати код, яким вони можуть ділитися. Ідеально, за винятком того, що вам, мабуть, все ж доведеться перенести бібліотеку доступу до даних до .NET. І тоді ваша компанія щойно придбала іншу компанію, яка Веб-додаток s - це розрізнений, але пов’язаний із цим продукт, і бізнес хоче інтегрувати деякі дані з платформи вашої компанії в платформу нещодавно придбаного дочірнього підприємства. Тільки є одна проблема: дочірня компанія була стартапом і вирішила написати основну частину своєї заявки в Dart. Крім того, з будь-яких причин (напевно, поза вашим контролем) мобільна команда, яка пілотувала Xamarin, вирішила, що це не для них, і вони скоріше використовуватимуть інструменти та мови, характерні для мобільних пристроїв, для яких вони розроблять. Але поки ви були на цій фазі, ваша команда вже доставила значну частину вашої бібліотеки доступу до даних у .NET, а інша команда компанії написала деякі шалені речі з інтеграції Salesforce і вирішила зробити все це в .NET, оскільки там вже була бібліотекою доступу до даних для.
Отже, через дуже реалістичний поворот подій у вас є бібліотека доступу до даних, написана в Python, .NET, Swift, Java та Dart. Вони не такі приємні, як ви хотіли б, щоб вони були. Ви не можете використовувати ORM так ефективно, як хотіли б, оскільки кожна мова має різні засоби ORM, тому вам довелося написати більше коду, ніж хотілося б. І ви не змогли приділити стільки часу кожному втіленню, як хотіли б, бо їх 5. А версія Dart бібліотеки особливо волохата, тому що вам довелося передавати свої власні трансакційні речі для частини цього, оскільки бібліотеки та підтримка просто не були там. Ви намагалися зробити так, що через це програма Dart повинна мати функціонал лише для читання для вашої бази даних, але бізнес вже вирішив, що будь-які функції, які вони планували, варті додаткових зусиль. І виявляється, є помилка в деякій логіці перевірки, яка існує у всіх цих втіленнях вашої бібліотеки доступу до даних. Тепер вам потрібно написати тести та код, щоб виправити цю помилку у всіх цих бібліотеках, отримати огляди коду на зміни, що внесені до всіх цих бібліотек, отримати QA для всіх цих бібліотек та випустити ваші зміни до всіх систем, використовуючи всі ці бібліотеки. Тим часом ваші клієнти незадоволені і розпочали роботу в Twitter, поєднуючи в собі поєднання вульгарностей, які ви ніколи не могли б уявити, що можна було б задумати, не кажучи вже про націлену на флагманський продукт вашої компанії. А власник продукту вирішує взагалі не дуже розуміти ситуацію.
Будь ласка, розумійте, що в деяких середовищах наведений вище приклад є лише надуманим. Також врахуйте, що ця послідовність подій може розгортатися протягом кількох років. Як правило, коли ви добираєтесь до того, що архітектори та ділові люди починають говорити про підключення інших систем до вашої бази даних, саме тоді вам потрібно буде "поставити API REST перед базою даних" на свою дорожню карту. Подумайте, якщо на початку, коли було зрозуміло, що дана база даних почне розповсюджуватися кількома системами, перед нею буде розміщений веб-сервіс / REST API. Виправити помилку перевірки було б набагато швидше та простіше, оскільки ви робите це один раз, а не 5 разів. І випустити виправлення було б набагато простіше скоординуватись, тому що ви
TLDR; Простіше централізувати логіку доступу до даних та підтримувати дуже тонких клієнтів HTTP, ніж розповсюджувати логіку доступу до даних для кожної програми, якій потрібно отримати доступ до даних. Насправді ваш HTTP-клієнт може навіть генеруватися з метаданих. У великих системах API REST дозволяє зберігати менше коду
Продуктивність та масштабованість
Деякі люди можуть вірити, що спілкування з базою даних безпосередньо замість того, щоб спочатку пройти веб-сервіс, відбувається швидше. Якщо у вас є лише одна заявка, це, безумовно, так. Але у більших системах я не згоден з настроями. Врешті-решт, на певному рівні масштабів буде дуже вигідно розмістити якийсь кеш перед базою даних. Можливо, ви використовуєте Hibernate і хочете встановити Infinispan сітку як кеш L2. Якщо у вас є кластер із чотирьох надійних серверів для розміщення вашої веб-служби окремо від ваших програм, ви можете дозволити собі вбудовану топологію із синхронною реплікацією. Якщо ви спробуєте помістити це на кластер із 30 серверів прикладних програм, витрати на включення реплікації в цій програмі будуть занадто великими, тож ви ' Вам доведеться або запустити Infinispan в розподіленому режимі, або в якомусь виділеному топології, і раптом Hibernate повинен вийти через мережу, щоб прочитати з кеша. Крім того, Infinispan працює лише на Java. Якщо у вас є інші мови, вам знадобляться інші рішення кешування. Мережеві накладні витрати на перехід від вашої програми до вашого веб-сервісу до досягнення бази даних швидко компенсуються необхідністю використання набагато складніших кешових рішень, які, як правило, мають власні накладні витрати.
Крім того, цей рівень HTTP вашого API REST забезпечує ще один цінний механізм кешування. Ваші сервери для вашого REST API можуть розміщувати заголовки кешування на їх відповіді, і ці відповіді можуть кешуватися на мережевому шарі, який масштабує надзвичайно добре. У невеликих налаштуваннях з одним або двома серверами найкраще використовувати просто кеш пам'яті в програмі, коли він спілкується з базою даних, але у великій платформі з багатьма програмами, що працюють на багатьох серверах, ви хочете використовувати мережа для кешування кешування, тому що при правильній настройці щось на зразок кальмарів чи лаку чи nginx може наблизитись до божевільних рівнів порівняно невеликого обладнання. Сотні тисяч або мільйонів запитів в секунду пропускної здатності набагато дешевше зробити з кеша HTTP, ніж з сервера прикладних програм або бази даних.
Крім того, якщо кількість клієнтів все вказує на вашу базу даних, замість того, щоб усі вони вказували на декілька серверів, що, в свою чергу, вказувало на базу даних, може зробити налаштування бази даних та об'єднання з'єднань набагато складніше. Взагалі, більшість фактичного навантаження на сервері додатків - це додатки; очікування повернення даних із бази даних часто забирає багато часу, але, як правило, не дуже обчислювально дорого. Вам може знадобитися 40 серверів для обробки завантаженості вашої програми, але вам, ймовірно, не потрібно 40 серверів, щоб упорядкувати отримання даних із бази даних. Якщо ви присвятите це завдання веб-службі, веб-служба, ймовірно, працює на набагато менших серверах, ніж решта програми, що означає, що вам знадобиться набагато менше підключень до бази даних. Що важливо, тому що бази даних зазвичай "
TLDR; Налаштування, масштабування та кешування доступу до даних простіше, коли це щось відбувається в одній спеціалізованій веб-службі, ніж це відбувається, коли це відбувається в багатьох різних програмах, використовуючи різні мови та технології
Заключні думки
Будь ласка, не відволікайтесь від цього думки: "О, о, я завжди повинен використовувати API REST для отримання своїх даних" або "Цей ідіот намагається сказати, що ми робимо це неправильно, оскільки наш веб-додаток безпосередньо спілкується з базою даних, але наші речі чудово працюють! " . Основний момент, який я намагаюся зробити, - це те, що різні системи та різні підприємства мають різні вимоги; У багатьох випадках ставити API REST перед вашою базою даних насправді не має сенсу. Це більш складна архітектура, яка вимагає виправдання цієї складності. Але коли складність виправдана, є тонна перевага від наявності REST API. Можливість зважити різні проблеми та вибрати правильний підхід для вашої системи - це те, що робить хорошого інженера.
Крім того, якщо API REST перешкоджає налагодженню речей, на цій картині, ймовірно, щось не так або відсутнє. Я не вірю, що додавання шару абстракції суттєво ускладнює налагодження. Коли я працюю з великими, n-ярусними системами, мені подобається переконатися, що я маю контекст розподіленого журналу. Можливо, коли користувач ініціює запит, згенеруйте GUID для цього запиту та введіть ім’я користувача цього користувача та запит, який він зробив. Потім передайте цей GUID, коли ваша програма переговорить з іншими системами. Завдяки правильній агрегації та індексації журналів, ви можете запитувати всю свою платформу для користувача, який повідомляє про проблему, і мати видимість у всіх своїх діях, і вони проскакують через систему, щоб швидко визначити, де все пішло не так. Знову ж таки, це більш складна архітектура,
Джерела:
http://alistair.cockburn.us/Hexagonal+architecture
https://github.com/brettwooldridge/HikariCP/wiki/ About-Pool- Sizing