Транзакційні бази даних довгий час були найважливішим компонентом розробки додатків. чому Тому що стабільна база даних, як правило, є найвищою точкою забезпечення правильності в безладному, розподіленому світі. Без них ми переплачували б і недоплачували. Ми втратили б пасажирів, які намагалися дістатися додому з аеропорту, і втратили б товари в наших візках для покупок. Наші онлайн-акаунти будуть втрачені, дубльовані або пошкоджені та стануть непрацездатними.
Насправді транзакційна база даних (зазвичай називається OLTP — скорочення від онлайн-обробки транзакцій — база даних) займала настільки центральне місце в розробці додатків, що з часом вона споживала все більше і більше функцій додатків. Однак мікросервіси та інші сучасні архітектури додатків внесли нові складності в дизайн додатків: розробникам потрібно було керувати даними в різних службах і забезпечувати узгодженість між ними, що змусило їх створювати складні механізми синхронізації та обробки даних усередині компанії.
Таким чином, як галузь, ми спостерігаємо все більше усвідомлення того, що гарантії транзакцій потрібні поза традиційною моделлю. Ми бачимо поява систем, які поширюють надійні транзакційні гарантії за межі бази даних на самі розподілені програми.
Ми відслідковували ці рішення протягом останніх кількох років. Загалом вони прагнуть забезпечити транзакційне керування станом у великій розподіленій програмі, не створюючи проблем із масштабуванням і забезпечуючи сучасне середовище програмування.
Ми вважаємо, що ці рішення приблизно поділяються на дві категорії. Одна категорія оркестровка робочого процесу. Це в основному гарантує, що блок коду буде виконано до кінця, навіть за умови збою. Таким чином, його можна використовувати для детермінованого управління розподіленим кінцевим автоматом без хибності. Друга категорія база даних + робочий процес, який розширює традиційний дизайн бази даних OLTP, дозволяючи виконувати довільний код для тієї ж мети.
Це все ще нова сфера, і існує багато плутанини навколо номенклатури, того, як кожен інструмент використовується на практиці, і хто повинен ним користуватися. Щоб краще зрозуміти, ми запитали практиків із провідних інженерних організацій про їхній стек транзакцій і про те, як вони думають про три ключові поняття для робочих навантажень із транзакціями: стан програми, бізнес-логіка та бізнес-дані.
Перш ніж досліджувати ці нові стеки, ось короткий напівтехнічний відступ, який допоможе зрозуміти, як ми сюди потрапили.
Транзакції, гарантії та сучасні додатки
Дуже приблизний варіант такий: є набір завдань — транзакцій, — які ви хочете або виконати всі, або не виконати жодного. Усе, що проходить між ними (якщо це зроблено частково), призведе до пошкодження. Це важко гарантувати все у розподіленій системі, але бази даних добре справляються з транзакціями. Таким чином, найпростіший спосіб обробки гарантій у багатьох системах – це просто зробити більшість транзакцій і дозволити базі даних обробляти їх.
Сучасні програми — це великі розподілені системи з великою кількістю користувачів, які роблять багато речей. Таким чином, навіть збереження узгодженого стану програми (наприклад, відстеження того, де різні користувачі перебувають у процесі виписки) перетворюється на проблему розподіленої транзакції. У традиційних монолітних архітектурах керування транзакціями за допомогою SQL із базою даних OLTP було певною мірою ефективним. Але в новому, складному світі мікросервісів, які взаємодіють через API вищого рівня (наприклад, REST або gRPC), транзакційні потреби стали розподіленими за своєю природою.
Однак багато компаній, які переходять на мікросервіси, не зробили багато для того, щоб розширити надійні гарантії транзакцій за межі бази даних. І на практиці це так майже завжди В ПОРЯДКУ. Але в міру масштабування додатків зростає невідповідність даних, а також пов’язані з цим недоліки та неузгоджені помилки в бізнес-даних. Що, звичайно, може бути дуже проблематичним. Це змушує розробників додатків мати справу з великою кількістю сценаріїв збоїв і стратегій вирішення конфліктів, а також забезпечувати узгодженість стану, створюючи власні стратегії за допомогою різних архітектурних шаблонів.
ВизначенняБізнес-дані («дані») відноситься до критично важливих для бізнесу даних, які традиційно зберігаються в базі даних OLTP для збереження та обробки (наприклад, інформація профілю користувача, така як ім’я, адреса, кредитний рейтинг тощо). Стан програми відноситься до поточного стану системи; стан програми визначається значенням, що зберігається в системі зберігання даних, і кроком, на якому виконується програма в кінцевому автоматі (наприклад, стан замовлення, наприклад «замовлення отримано», «інвентаризація перевірена», «кредит перевірено» ”, “відправлено”, “повернено”). Бізнес-логіка відноситься до частини програми, яка стосується того, як програма насправді працює або що вона робить, замість деталей виконання (наприклад, «Якщо user_income > $100K & credit_score >650 ⇒ mortgage_approved = TRUE»). |
Для цілей цього обговорення важливо розрізняти стан програми та бізнес-дані. Наприклад, відомості про те, що клієнт ввів свою кредитну картку, але не виписався, є станом програми. Дані для кредитної картки та елементи в кошику заявки є бізнес-даними.
У типовому потоці запит надходить із інтерфейсу, проходить автентифікацію, а потім направляється через шлюз API або GraphQL до відповідної кінцевої точки.
Ця єдина кінцева точка API тепер має керувати десятками чи сотнями мікросервісів, щоб доставити бізнес-транзакцію кінцевому клієнту. Саме тут розробники зазвичай об’єднують усе в блоки бізнес-логіки, а потім використовують комбінацію черг, кеш-пам’яті та закодованих вручну механізмів повторних спроб, щоб отримати дані в базу даних — сподіваємось, зафіксувати як повну транзакцію.
Зі збільшенням масштабу програми зростає складність керування чергами та кешами, а також кількість гострих країв у логіці узгодження, коли виникають проблеми.
Зростання стеків транзакцій, орієнтованих на робочий процес і базу даних
Добре, транзакції важливі. LAMP у базі даних було недостатньо для масштабування. І гігантська куля волосся з черг і логіки повторів надто крихка. Щоб впоратися з цим, протягом останніх кількох років ми спостерігали появу нових рішень, які повертають розумність логіці транзакцій. Їх можна приблизно класифікувати як підходи, орієнтовані на робочий процес, або підходи, орієнтовані на базу даних.
На сьогоднішній день механізми робочих процесів працюють переважно на стані програми, а не на бізнес-даних, і часто потребують певної складності під час інтеграції з традиційними базами даних. Підходи, орієнтовані на базу даних, додають логіку додатків разом із бізнес-даними, але ще не мають такої ж складності виконання коду, як механізми робочого процесу.
На діаграмі нижче наведено приблизний ескіз того, як підходи, орієнтовані на робочий процес і/або базу даних, використовуються в програмі Javascript/Typescript, припускаючи, що використовуються обидва. Хоча сьогодні вони є окремими частинами цієї архітектури, ми бачили перші ознаки тенденції, коли бази даних включають функції робочого процесу, а робочі процеси починають використовувати довговічне зберігання. Таке злиття можливостей вказує на те, що межі між двома підходами стираються і стають менш чіткими в сучасних архітектурах.
Детально про підходи, орієнтовані на робочий процес
Робочий процес — це просто блоки коду, які виконуються на основі подій або таймерів, які розвивають кінцевий автомат програми. Робочий процес транзакцій забезпечує виконання коду з надійними гарантіями, запобігаючи частковим або ненавмисним станам програми. Розробники пишуть логіку, а механізм робочого процесу обробляє транзакції, мутації та ідемпотентність. Різні механізми робочого процесу роблять різні компроміси з точки зору того, скільки деталей транзакції відкриваються розробникам.
Як приклад, нижче наведено візуальне представлення робочого процесу виписки, що працює на Orkes (Conductor):
Існує два грубих підходи за допомогою яких двигуни робочого процесу отримують тягу. В одному (типовим типом якого є Temporal.io) розробники пишуть код, використовуючи стандартні серверні мови програмування (наприклад, Go або Java) і система забезпечить виконання коду до кінця, навіть під час збою. У цій моделі стек програмних викликів зберігається, навіть якщо код очікує завершення виклику блокування (наприклад, читання або запису). Для цього середовище виконання мови змінено, щоб запобігти частковому виконанню коду під час збоїв. Перевага цього підходу полягає в тому, що розробники можуть писати знайомими мовами та легко налагоджувати за допомогою підтримуваного стеку викликів. Ми бачимо, що цей підхід найбільш популярний серед бек-енд команд, які мають справу з великими, складними програмами.
Недоліком є те, що часто потрібно багато роботи з інтеграції та коду оболонки, щоб надати розробникам додатків корисні та безпечні інтерфейси. Іншим недоліком є те, що він покладається на власний рівень виконання, а не на чисту мову, і є крайні випадки, коли виконання відрізнятиметься від середовища виконання рідною мовою. Таким чином, хоча розробники можуть використовувати мови, з якими вони знайомі, вони все одно повинні розуміти, як працює основна система.
Інший підхід, більш популярний серед розробників додатків (зокрема, Typescript/Javascript), полягає в тому, щоб механізм робочого процесу служити оркестровником асинхронних функцій (наприклад, Inngest, Defer і Trigger). У цій моделі події або функції сторонніх розробників спрямовуються до механізму робочого процесу, який потім надсилає логіку, зареєстровану програмістами додатків, які мають повернути керування, коли виникає потреба заблокувати іншу асинхронну функцію. Перевагою є те, що це набагато легший метод інтеграції в програму. Це також забезпечує достатню структуру коду, щоб команда, яка над ним працює, могла легше його зрозуміти. Однак цей підхід може бути складнішим для налагодження без підтримки інструментів, тому налагодження, як правило, залежить від платформи.
Механізми робочого процесу є особливо потужними, оскільки вони дозволяють поступове впровадження існуючими програмами. Їх можна застосовувати поетапно до певних робочих процесів з мінімальною площею. Тим не менш, два найбільші недоліки механізмів робочого процесу пов’язані з тим, що вони не поширюються на базу даних. Як наслідок, немає єдиного джерела істини щодо стану програми та бізнес-даних, яке можна запитувати. Крім того, семантика транзакцій зазвичай відрізняється від семантики бази даних, вимагаючи від розробників додатків обробки граничних умов.
Хоча сьогодні це не є нормою, ми хочемо проілюструвати концептуальну архітектуру того, як робочі процеси в багатьох випадках можна використовувати як постійні сховища даних:
Детально про підходи, орієнтовані на базу даних
Підходи, орієнтовані на базу даних, починаються з бази даних, але розширюють її для підтримки виконання довільного коду, щоб дозволити робочі процеси поряд з керуванням даними. Вони роблять це, передаючи контроль програмістам, щоб вони могли приймати чіткі рішення щодо мутацій, транзакцій та ідемпотентності для звичайних блоків коду — по суті, шляхом безпосереднього розкриття семантики OLTP. Програміст відповідає за збереження бізнес-логіки та бізнес-даних окремо від стану програми.
Дійсно, чисто база даних полягає в тому, що стан програми завжди можна отримати з бізнес-даних. Зазвичай це робиться шляхом збереження стану програми як набору транзакцій, які змінюють бізнес-дані в базі даних. Найпростіше думати про це як про базу даних, яка може виконувати блоки коду з такими ж сильними гарантіями, як описані вище системи робочого процесу.
Внутрішньо ми називаємо це транзакційна платформа логіки додатків (ALTP) підхід, тому що, зрештою, він розширює транзакції OLTP у програмі. Але те, що справді характеризує ALTP, так це те, що для нових додатків він може повністю позбавити розробників додатків потреби безпосередньо керувати внутрішньою інфраструктурою.
Від об’єктива ALTP найпоширеніший підхід почався з Firebase, який пропонує a повний спектр послуг, включаючи авторизацію, сховище даних, бази даних тощо. Firebase і нещодавні учасники, такі як Supabase, залишаються дуже популярними платформами для нових проектів. І хоча вони, як правило, залишаються вірними своїм кореням OLTP — і тому не підтримують виконання довільного коду для транзакційних внутрішніх функцій — Supabase вже починає додавати підтримку для робочих процесів.
Тим не менш, пропозиції ALTP наступного покоління як і Convex, вони дозволяють виконувати довільний код як транзакцію разом із базою даних. Ці пропозиції дозволяють писати повністю сумісний з транзакціями код звичайною мовою (наприклад, Javascript/Typescript), де один блок коду може читати, записувати та змінювати дані — як стан програми, так і бізнес-дані. У певному сенсі це дає розробникам єдине джерело істини, доступне для запитів, і забезпечує примітиви робочого процесу, такі як підписки.
ALTP вирішує проблему механізмів робочого процесу, пов’язаних із від’єднанням від бази даних, але, як наслідок, для отримання переваг користувачі вимагають покладатися на пропозиції своєї бази даних, а не на стандартний OLTP. Як наслідок, ми бачимо, що команди в першу чергу застосовують ALTP для нових програм, а не інтегрують його в існуючі складні серверні модулі.
Діаграма вище є сумішшю багатьох операторів, з якими ми спілкувалися. Деякі просто використовуватимуть механізм робочого процесу. Деякі просто використовуватимуть підхід, орієнтований на базу даних. Але багато хто буде використовувати обидва — особливо коли вони тільки починають приймати робочі процеси. Користувачі механізмів робочого процесу сьогодні, як правило, є робочими групами, які мають справу з великими, складними додатками, хоча ми також бачили, як багато повних команд використовують їх. Рішення Back-end як послуга, як правило, більш зручні для розробників програм і частіше використовуються, коли програма керує вибором технології.
Конвергенція
Стає очевидним, що підходи, орієнтовані на робочий процес, і підходи, орієнтовані на базу даних, знаходяться в протиріччі. Основною причиною цього є те, що хоча стан додатка та стан бази даних логічно відрізняються, вони залежать один від одного, і систему, яка не охоплює обидва, складно визначити правильно та налагодити.
Як приклад розглянемо механізм робочого процесу, який використовується для відстеження кінцевого автомата для процесу оформлення замовлення користувача, і цей користувач додає товар у кошик. Як правило, механізми робочого процесу гарантують виконання кроку коду навіть у разі збою. Однак можуть бути випадки, коли механізму потрібно повторно запустити певний крок під час збою, оскільки не зовсім впевнено, чи був цей крок повністю завершено. Якщо цей крок передбачає запис бізнес-даних у традиційну базу даних (у цьому випадку товар у кошику), а база даних не знає про повторну спробу, у підсумку буде дубльований запис.
Є два способи впоратися з цим. Один із способів полягає в тому, щоб передати проблему розробнику програми, який використовуватиме nonce, наданий системою робочого процесу, щоб гарантувати, що буде написаний лише один елемент. Але це припускає, що розробник розуміє ідемпотентність, яку, як відомо, важко отримати правильно, і це усуває багато магії системи робочого процесу. Інший спосіб полягає в тому, щоб прив’язати механізм робочого процесу до бази даних, яка знає семантику транзакцій робочого процесу. Цього ще не сталося, але не важко повірити, що це станеться.
З іншого боку, підходи, орієнтовані на базу даних, розуміють, що загальний робочий процес дійсно корисний для розробників програм. І тому ми починаємо бачити бази даних (наприклад, Convex), які підтримують традиційні функції баз даних, як-от запити, зміни, індекси тощо, реалізовуючи такі функції, як планування та підписки. Це дозволяє використовувати їх як двигуни робочого процесу. Тобто вони дозволяють виконувати довільні блоки коду з сильними гарантіями.
Як сказав Ян Лівінгстон (який надав відгук про цей твір), «Знову грає класичне «Ви привносите логіку додатка в базу даних чи базу даних у логіку додатка?»... цього разу викликане руйнуванням моноліту». З огляду на таку дихотомію протягом десятиліть, очевидно, що обидві моделі збережуться в короткостроковій перспективі. Набагато менш ясно, що так і залишиться в довгостроковій перспективі.
Особлива подяка Чарлі Полі (Defer), Дену Фарреллі (Inngest), Девіду Хоуршиду (Stately), Іану Лівінгстону (Cape Security), Енесу Акару (Upstash), Джеймсу Каулінгу (Convex), Джеймі Тернеру (Convex), Полу Копплстоуну (Supabase). ), Сему Ламберту (PlanetScale), Тоні Холдсток-Брауну (Inngest), Метту Ейткену (Trigger) за перегляд цієї публікації та надання відгуків. Крім того, дякуємо Бенджаміну Хіндману (Reboot), Фредріку Бьорку (Grafbase), Глауберу Кості (Chiselstrike), Гійому Саллесу (Liveblocks), Максиму Фатєєву (Temporal), Стівену Фабру (Liveblocks) і Вірен Барайя (Orkes) за допомогу дослідження.
* * *
Погляди, висловлені тут, є поглядами окремих співробітників AH Capital Management, LLC («a16z»), які цитуються, і не є поглядами a16z або його філій. Певна інформація, що міститься тут, була отримана зі сторонніх джерел, зокрема від портфельних компаній фондів, якими керує a16z. Хоча отримано з джерел, які вважаються надійними, a16z не перевіряв таку інформацію незалежно та не робить жодних заяв щодо тривалої точності інформації чи її відповідності певній ситуації. Крім того, цей вміст може містити рекламу третіх сторін; a16z не переглядав такі оголошення та не схвалює будь-який рекламний вміст, що міститься в них.
Цей вміст надається лише в інформаційних цілях, і на нього не можна покладатися як на юридичну, ділову, інвестиційну чи податкову консультацію. Ви повинні проконсультуватися з власними радниками щодо цих питань. Посилання на будь-які цінні папери чи цифрові активи наведено лише з метою ілюстрації та не є інвестиційною рекомендацією чи пропозицією надати інвестиційні консультаційні послуги. Крім того, цей вміст не призначений для будь-яких інвесторів чи потенційних інвесторів і не призначений для використання ними, і за жодних обставин на нього не можна покладатися при прийнятті рішення інвестувати в будь-який фонд, яким керує a16z. (Пропозиція інвестувати у фонд a16z буде зроблена лише на підставі меморандуму про приватне розміщення, угоди про підписку та іншої відповідної документації будь-якого такого фонду, і її слід читати повністю.) Будь-які інвестиційні чи портфельні компанії, згадані, згадані або описані не є репрезентативними для всіх інвестицій у транспортні засоби, якими керує a16z, і не може бути гарантії, що інвестиції будуть прибутковими або що інші інвестиції, здійснені в майбутньому, матимуть подібні характеристики чи результати. Список інвестицій, здійснених фондами під управлінням Andreessen Horowitz (за винятком інвестицій, щодо яких емітент не надав дозволу a16z на оприлюднення, а також неоголошених інвестицій у публічні цифрові активи) доступний за адресою https://a16z.com/investments /.
Наведені в ньому діаграми та графіки призначені виключно для інформаційних цілей, і на них не слід покладатися під час прийняття інвестиційних рішень. Минулі результати не вказують на майбутні результати. Зміст відповідає лише вказаній даті. Будь-які прогнози, оцінки, прогнози, цілі, перспективи та/або думки, висловлені в цих матеріалах, можуть бути змінені без попередження та можуть відрізнятися або суперечити думкам, висловленим іншими. Додаткову важливу інформацію можна знайти на сторінці https://a16z.com/disclosures.
- Розповсюдження контенту та PR на основі SEO. Отримайте посилення сьогодні.
- Платоблокчейн. Web3 Metaverse Intelligence. Розширені знання. Доступ тут.
- Карбування майбутнього з Адріенн Ешлі. Доступ тут.
- джерело: https://a16z.com/2023/04/14/the-modern-transactional-stack/
- :є
- $UP
- 1
- 7
- a
- a16z
- МЕНЮ
- вище
- Рахунки
- точність
- через
- насправді
- доповнення
- Додатковий
- Додатково
- адреса
- прийняти
- Прийняття
- Прийняття
- реклама
- рада
- консультативний
- консультативні послуги
- Філії
- Угода
- аеропорт
- ВСІ
- Дозволити
- пліч-о-пліч
- вже
- хоча
- завжди
- та
- Андрієссен
- Андреессен Горовиц
- Інший
- API
- Інтерфейси
- додаток
- додаток
- Розробка додатка
- застосування
- прикладної
- підхід
- підходи
- додатка
- архітектурний
- архітектура
- ЕСТЬ
- ПЛОЩА
- навколо
- AS
- Активи
- гарантія
- At
- Auth
- автентифіковано
- доступний
- обізнаність
- назад
- Back-end
- заснований
- В основному
- основа
- BE
- оскільки
- ставати
- становлення
- буття
- Вірити
- вважається,
- нижче
- Переваги
- Веніамін
- Краще
- між
- За
- Великий
- найбільший
- Блокувати
- блокування
- блоки
- Перерва
- Розрив
- приносити
- приніс
- будувати
- бізнес
- by
- call
- званий
- CAN
- можливості
- капітал
- карта
- випадок
- випадків
- категорії
- Категорія
- центральний
- певний
- проблеми
- зміна
- характеристика
- характеризує
- Введіть дані:
- обставин
- classic
- ясно
- код
- поєднання
- майбутній
- вчинено
- зазвичай
- Компанії
- повний
- Зроблено
- завершення
- комплекс
- складності
- складність
- поступливий
- компонент
- поняття
- концептуальний
- Умови
- конфлікт
- замішання
- Вважати
- послідовний
- складати
- спожитий
- зміст
- навпаки
- контроль
- Опукла
- пошкоджені
- Курс
- обкладинка
- створення
- кредит
- кредитна картка
- критичний
- Поточний
- Поточний стан
- виготовлений на замовлення
- клієнт
- дані
- управління даними
- зберігання даних
- Database
- базами даних
- Дата
- Девід
- угода
- справу
- Пропозиції
- десятиліття
- рішення
- рішення
- доставляти
- залежний
- Отриманий
- описаний
- дизайн
- деталі
- певний
- Розробник
- розробників
- розробка
- відрізняються
- різний
- важкий
- цифровий
- Цифрові активи
- безпосередньо
- Розкрити
- обговорення
- чіткий
- розрізняти
- розподілений
- розподілені системи
- документація
- Ні
- справи
- Не знаю
- вниз
- зворотний бік
- під час
- e
- кожен
- Рано
- Найпростіший
- легко
- край
- Ефективний
- або
- поява
- схвалювати
- Кінцева точка
- витривалий
- примус
- двигун
- Машинобудування
- Двигуни
- досить
- забезпечувати
- гарантує
- увійшов
- повністю
- цілісність
- що входить
- запис
- Навколишнє середовище
- помилки
- особливо
- по суті
- Оцінки
- і т.д.
- Навіть
- Event
- Події
- все
- еволюціонувати
- Вивчення
- приклад
- виключення
- виконувати
- виконання
- існуючий
- досвід
- піддаватися
- виражений
- продовжити
- Face
- Провал
- знайомий
- риси
- зворотний зв'язок
- кілька
- знайти
- Firebase
- потік
- Слід
- для
- Війська
- від
- Повний
- повністю
- функція
- функціональність
- Функції
- фонд
- засоби
- Крім того
- майбутнє
- Отримувати
- шлюз
- Загальне
- в цілому
- отримати
- отримання
- гігант
- Давати
- даний
- дає
- дає
- Go
- буде
- поступовий
- графіки
- Greenfield
- Рости
- гарантувати
- гарантії
- рука
- обробляти
- Ручки
- сталося
- Жорсткий
- Мати
- має
- допомога
- допомогу
- тут
- Головна
- З надією
- Горовіц
- Як
- Однак
- HTTPS
- Величезно
- Сотні
- здійснювати
- важливо
- in
- включати
- У тому числі
- включення
- Збільшує
- зростаючий
- самостійно
- покажчики
- зазначений
- вказує
- індивідуальний
- промисловість
- інформація
- інформація
- Інформаційний
- Інфраструктура
- замість
- Інтеграція
- інтеграція
- взаємодіючих
- Інтерфейси
- введені
- Invest
- інвестиції
- інвестиційні консультації
- інвестиції
- Інвестори
- Емітент
- питання
- IT
- пунктів
- ЙОГО
- Джеймі
- Java
- JavaScript
- подорож
- зберігання
- ключ
- Знання
- мова
- мови
- великий
- останній
- шар
- провідний
- легальний
- легкий
- як
- ліній
- список
- Довго
- втрачати
- серія
- машина
- made
- магія
- зробити
- РОБОТИ
- Робить
- управляти
- вдалося
- управління
- управління
- багато
- Матеріали
- Питання
- макс-ширина
- Сентенція
- Може..
- Меморандум
- згаданий
- злиття
- метод
- мікросервіс
- мінімальний
- модель
- Моделі
- сучасний
- модифікований
- змінювати
- Монолітний
- більше
- найбільш
- Найбільш популярний
- ім'я
- зародження
- рідний
- природа
- Необхідність
- потреби
- Нові
- нормальний
- номер
- отриманий
- of
- пропонувати
- пропонує
- Пропозиції
- Пропозиції
- on
- ONE
- онлайн
- Оператори
- Думки
- порядок
- організації
- Інше
- інші
- поза
- власний
- частина
- особливо
- Минуле
- моделі
- Пол
- продуктивність
- дозвіл
- наполегливість
- Персонал
- частина
- частин
- платформа
- Платформи
- plato
- Інформація про дані Платона
- PlatoData
- ігри
- будь ласка
- точка
- популярний
- портфель
- пошта
- потужний
- практика
- запобігати
- попередження
- в першу чергу
- первинний
- приватний
- Проблема
- процес
- обробка
- профіль
- прибутковий
- програма
- Програміст
- Програмісти
- Програмування
- мови програмування
- Прогнози
- проектів
- перспективи
- забезпечувати
- за умови
- забезпечує
- забезпечення
- публічно
- мета
- цілей
- Штовхати
- put
- запити
- Швидко
- швидше
- Читати
- реалізувати
- причина
- отримано
- останній
- Рекомендація
- примирення
- посилання
- називають
- відноситься
- зареєстрований
- регулярний
- доречний
- надійний
- залишатися
- подання
- представник
- запросити
- вимагати
- Вимагається
- дослідження
- дозвіл
- відповідальний
- REST
- результат
- в результаті
- результати
- відгуки
- рецензування
- райдери
- Зростання
- коренеплоди
- грубо
- прогін
- біг
- сейф
- Зазначений
- Сем
- то ж
- шкала
- Масштабування
- сценарії
- планування
- рахунок
- другий
- Securities
- безпеку
- бачачи
- вибір
- семантика
- сенс
- окремий
- Послуги
- комплект
- гострий
- покупка
- Короткий
- Повинен
- Ознаки
- аналогічний
- просто
- один
- ситуація
- So
- Рішення
- Вирішує
- деякі
- кілька
- складний
- Source
- Джерела
- Говорить
- стек
- Стеки
- standard
- старт
- почалася
- Починаючи
- стан
- Штати
- залишатися
- ніжка
- Крок
- Як і раніше
- зберігання
- зберігати
- зберігати
- магазинів
- зберігання
- стратегії
- прагнути
- сильний
- структура
- тема
- передплата
- підписки
- такі
- достатній
- підтримка
- синхронізація
- система
- Systems
- цілі
- завдання
- податок
- команда
- команди
- Технологія
- terms
- Дякую
- Що
- Команда
- Майбутнє
- інформація
- Держава
- їх
- Їх
- отже
- в ньому
- Ці
- речі
- Мислення
- третя сторона
- три
- через
- TIE
- час
- до
- сьогодні
- Тоні
- занадто
- інструмент
- трек
- Відстеження
- тяги
- торгував
- традиційний
- традиційно
- угода
- Інформація про транзакцію
- транзакційний
- Transactions
- Trend
- викликати
- Правда
- типовий
- типово
- кінцевий
- Зрештою
- при
- що лежить в основі
- розуміти
- розуміння
- розумієш
- потенціал зростання
- us
- використання
- користувач
- користувачі
- зазвичай
- значення
- Транспортні засоби
- перевірено
- версія
- через
- вид
- думки
- Очікування
- шлях..
- способи
- ДОБРЕ
- Що
- Чи
- який
- в той час як
- ВООЗ
- широкий
- волі
- з
- в
- без
- Work
- Робочі процеси
- робочий
- працює
- світ
- б
- запис
- написати код
- лист
- письмовий
- років
- Ти
- вашу
- зефірнет