Чи має функціональність у БД дорожній блок до масштабованості?


17

Я, можливо, не зможу дати правильну назву питання. Але ось це,

Ми розробляємо фінансовий портал для управління багатством. Ми очікуємо, що понад 10000 клієнтів використовуватимуть додаток. Портал розраховує різні аналітики ефективності на основі технічного аналізу фондового ринку.

Ми розробили багато функціональних можливостей за допомогою Збережених процедур, визначених користувачем функцій, тригерів і т.д. через Базу даних. Ми думали, що ми можемо отримати величезне підвищення продуктивності, роблячи речі безпосередньо в базі даних, ніж через код C #. І ми насправді отримали величезне підвищення продуктивності.

Коли я намагався похвалитись досягненням нашого CTO, він протиставив моє рішення щодо функціональності, реалізованого в базі даних, а не в коді. За його словами, такі програми страждають від проблем масштабованості. З його слів "У ці дні речі зберігаються в пам'яті / кеші. Кластеризовані дані важко керувати з часом. У Facebook, Google немає нічого в базі даних. Це епоха тонких серверів і товстих клієнтів. БД використовується лише для зберігання простих даних і функціональність має бути повністю відірвана від бази даних. "

Чи можете ви, хлопці, дати мені кілька підказок щодо правильності того, що він каже. Як піти про архітектора такий додаток?


3
"і ми насправді отримали величезне підвищення продуктивності" порівняно з чим? Коли ви ніколи не реалізовували однакові функції на клієнті, як ви це знаєте?
Doc Brown

3
Я думаю, що це буде звичайно - це залежить від проекту, реалізації даних та майстерності команди.
Даніель Янков

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

3
У Facebook і Google є проблеми зовсім іншого масштабу для більшості програм - може виникнути проблема з кількістю даних, з якими вам доведеться мати справу з ринкових даних, але сучасні бази даних SQL створені для того, щоб справлятися з приголомшливими обсягами даних.
Мерф

1
Я б, напевно, думав так само, як і ваш CTO, якщо ви не зможете довести, що його рішення недостатньо, і інших способів управління ним не було. Збережені процедури, особливо коли їх кількість збільшується, можуть спричинити величезний бар'єр для переходу до інших БД, якщо потрібно ... не можуть передбачити майбутнє.
Ріг

Відповіді:


23

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

Близькість до даних: Давайте зробимо крок назад. Для введення коду в БД є кілька вагомих причин. Я б заперечував, що найбільшим буде близькість до даних - наприклад, якщо ви очікуєте, що підрахунок поверне кілька значень, але це сукупності мільйонів записів, що надсилають мільйони записів (на запит) мережа, яка має бути об’єднана в інших місцях, є дуже марною і може легко вбити вашу систему. Сказавши це, ви могли досягти такої близькості даних іншими способами, по суті, використовуючи кеші або БД аналізу, де частина агрегації виконується заздалегідь.

Виконання коду в БД:Ефекти вторинної продуктивності, такі як "кешування планів виконання", складніше сперечатися. Іноді кешовані плани виконання можуть бути дуже негативною справою, якщо кешований неправильний план виконання був кешований. Залежно від ваших RDBMS, ви можете отримати максимум користі з них, але ви не отримаєте багато над параметризованим SQL, в більшості випадків (ці плани, як правило, також кешуються). Я б також заперечував, що більшість мовою, що складений або JIT'ed, як правило, працюють краще, ніж їх еквіваленти SQL (наприклад, T-SQL або PL / SQL) для основних операцій та нереляційного програмування (обробка рядків, циклі тощо), тому ви б не хотіли Ви нічого там не втрачаєте, якщо ви використовували щось на кшталт Java або C #, щоб зробити число хрускотом. Дрібнозерниста оптимізація також досить складна - у БД, ви ' часто застрягають із загальним B-деревом (індексом) як вашою єдиною структурою даних. Якщо чесно, то повний аналіз, включаючи такі речі, як тривалі операції, ескалація блокування тощо, може заповнити книги.

Ремонтопридатність: SQL - чудова мова для того, що він був розроблений. Я не впевнений, що це чудово підходить для логіки додатків. Більшість інструментів та практик, які роблять наше життя нестерпним (TDD, рефакторинг тощо), важко застосувати до програмування баз даних.

Продуктивність та масштабованість:Щоб уточнити ці терміни, я маю на увазі це: продуктивність - це те, наскільки швидко ви очікували, що один запит пройде через вашу систему (і повернеться до користувача), на даний момент припускаючи низьке навантаження. Це часто обмежується такими речами, як кількість фізичних шарів, через які він проходить, наскільки добре оптимізовані ці шари тощо. Масштабованість - це те, як продуктивність змінюється зі збільшенням кількості користувачів / завантаження. У вас може бути середня / низька продуктивність (скажімо, 5 секунд + для запиту), але дивовижна масштабованість (здатна підтримати мільйони користувачів). У вашому випадку ви, мабуть, матимете хороші показники, але ваша масштабованість буде обмежена тим, наскільки великий сервер ви можете фізично створити. В якийсь момент ви досягнете цієї межі і будете змушені звертатися до таких речей, як заточування, що може бути неможливим в залежності від характеру програми.

Передчасна оптимізація. Зрештою, я думаю, ви помилилися передчасно. Як зазначали інші, у вас насправді немає вимірювань, які б показували, як працюватимуть інші підходи. Ну, ми не завжди можемо створити повномасштабні прототипи, щоб довести або спростувати теорію ... Але загалом я б завжди вагався, обравши підхід, який торгує ремонтопридатністю (можливо, найважливішою якістю програми) для продуктивності .

EDIT: З позитивної ноти, вертикальне масштабування може розтягнутися в деяких випадках досить далеко. Наскільки мені відомо, SO досить довго працював на одному сервері. Я не впевнений, як це відповідає вашим 10 000 користувачам (я думаю, це залежало б від характеру того, що вони роблять у вашій системі), але це дає вам уявлення про те, що можна зробити (насправді, є далеко Більш вражаючі приклади, це просто трапляється популярним, який люди легко зрозуміють).

EDIT 2: Щоб уточнити та прокоментувати декілька речей, викладених в інших місцях:

  • Re: Атомна консистенція - консистенція кислотних кислот цілком може бути вимогою системи. Вищезазначене насправді не сперечається з цим, і ви повинні усвідомити, що послідовність ACID не вимагає від вас керувати усією діловою логікою всередині БД. Переміщаючи код, який не повинен бути там у БД, ви обмежуєте його працювати у фізичному середовищі решти БД - він змагається за ті ж апаратні ресурси, що і фактична частина управління вашою БД. Що стосується масштабування лише коду на інших серверах БД (але не фактичних даних) - звичайно, це можливо , але що саме ви тут отримуєте, крім додаткових витрат на ліцензування у більшості випадків? Зберігайте речі, які не повинні бути в БД, поза БД.
  • Re: продуктивність SQL / C # - оскільки це, здається, цікавить тему, давайте додамо трохи до дискусії. Ви, звичайно, можете запускати рідний / Java / C # код всередині БД, але, наскільки я знаю, це не те, про що йшлося тут - ми порівнюємо реалізацію типового коду програми у чомусь на зразок T-SQL порівняно з чимось на зразок C #. Існує ряд проблем, які важко було вирішити з реляційним кодом в минулому - наприклад, розгляньте проблему "максимально одночасних входів", де у вас є записи, що вказують на вхід або вихід, і час, і вам потрібно розробити максимальна кількість користувачів, які входили в будь-який час, була. Найпростішим можливим рішенням є перегляд записів і зберігання збільшення / зменшення лічильника під час зустрічі входу / виходу та відстеження максимуму цього значення.може, Я не знаю), найкраще, що ти можеш зробити, це КУРСОР (суто реляційні рішення є різними порядками складності, а спроба вирішити це за допомогою циклу в той час призводить до гіршої продуктивності). У цьому випадку так, рішення C # насправді швидше, ніж ви можете досягти в T-SQL, період. Це може здатися надуманим, але ця проблема може легко проявитися у фінансових системах, якщо ви працюєте з рядками, що представляють відносні зміни, і вам потрібно обчислити віконні агрегації на них. Збережені виклики процедур також вигідніші - викликайте тривіальний SP мільйон разів і подивіться, як це порівнювати з викликом функції C #. Я натякнув на кілька інших прикладів вище - я ще не стикався з тим, щоб хтось реалізував належну таблицю хешів у T-SQL (той, який насправді дає певні переваги), хоча це досить легко зробити в C #. Знову ж таки, є речі, в яких БД дивовижні, і речі, в яких вони не такі приголомшливі. Так само, як я не хотів би робити JOIN, SUM та GROUP BY в C #, я не хочу писати нічого, особливо інтенсивного процесора в T-SQL.

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

Що стосується ремонтопридатності, то використання інструментів даних SQL Server ремонтопридатність є чинником. Насправді, для будь-якої нетривіальної бази даних (у якої є більше 5 таблиць) я вважаю це вимогою.
Jon49

4

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

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


1
+1 заScalability is all about how you manage global state and data inter-dependence.
Естефані Велес

2

І ми насправді отримали величезне підвищення продуктивності.

Я думаю, що вам потрібно встановити орієнтир продуктивності та почати спочатку будувати свій прототип. Зберігати всю логіку в БД - це стара школа (я не маю нічого проти цього), що має справу з архітектурою клієнт-сервер. Хоча, має свої переваги, є ряд недоліків, які потрібно врахувати.

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

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


2

Ваш CTO є 100% неправильним.

Ваші Фінансові номери ОБОВ'ЯЗКОВО постійно додаватись. Це означає, що вам потрібна ACID та реляційна БД - найкраще місце для забезпечення цього. Підвищення продуктивності БД NoSql зазвичай відбувається за рахунок ACID, і це нормально для Google і Facebook, але НЕ для системи, що містить фінансові кошти .

Сказати, що C # працює краще, ніж SQL-код, теж ідіотизм ...


Сказати, що C # працює краще, ніж SQL-код - це теж ідіотизм ... - Але ви не заперечуєте, що код C # є більш масштабованим, правда?
Джим Г.

Ні, це не більш масштабований, бо що там, де не є горлечко пляшки, я можу масштабувати код Sql (не дані) горизонтально так само легко, як я можу горизонтально масштабувати код C #.
Морон

@JimG. Просто для уточнення: "Я можу масштабувати код Sql (не дані) горизонтально так само легко, як я можу горизонтально масштабувати код C #", якщо він був розроблений для цього ... Так само, як і C #, він повинен бути розроблений для масштабування. Ви не можете просто сказати, що C # масштаби краще, це питання планування не мови.
Морон

@JimG. Програмне забезпечення, яке не має масштабів, може бути написане будь-якою мовою, включаючи C #. Будь-яка база даних, яка варта її солі, може зберігати процедури, написані іншими мовами, ніж їх рідна реалізація SQL-ish, і люди, які виходять з глибокого кінця за допомогою NoSQL у ситуаціях, що вимагають ACID, зазвичай закінчують переосмислення більшості коліс, які були гарними реалізовані СУБД.
Blrfl

@Morons: Я думаю, що ми згодні. Я був фактично прирівнюючи дані з «SQL». Набагато дорожче масштабувати базу даних.
Джим Г.

2

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

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