Azure DocumentDB супраць MongoDB

Сінтэтычнае параўнанне

DocumentDB - гэта база дадзеных NoSQL як паслуга, гэта частка платформы Microsoft Azure. Як сховішча дакументаў, ён трапляе ў тую ж катэгорыю, што і MongoDB, CouchDB або RethinkDB, і гэтак жа, як і яны, ён апрацоўвае дакументы ў фармаце JSON.

Пры разглядзе пытання аб інтэграцыі крамы дакументаў NoSQL у свае сістэмы многія кампаніі выбіраюць MongoDB, паколькі ён - адзін з самых папулярных рухавікоў NoSQL там, і за апошнія гады ён стаў вельмі надзейным. Я адчуваю, што DocumentDB звычайна не ўлічваецца пры прыняцці гэтага рашэння, хаця яго характарыстыкі робяць яго сур'ёзным супернікам MongoDB, і нават у некаторых сітуацыях даюць больш высокія перавагі.

Паколькі я адчуваю, што DocumentDB не атрымлівае любові, якую ён заслугоўвае, я вырашыў напісаць гэта сінтэтычнае і аб'ектыўнае параўнанне DocumentDB і MongoDB, падмацаванае ўказальнікамі адпаведных дакументацый. Спадзяюся, гэта можа паслужыць вам арыенцірам пры спробах узважыць усе плюсы і мінусы кожнай платформы.

Абнаўленні да гэтай публікацыі

[Лістапад 2016] Выдалены ўсе згадкі пра адсутнасць лакальнага эмулятара для DocumentDB, паколькі Microsoft абвясціла пра агульную даступнасць такой версіі для лакальнай распрацоўкі. Звярніце ўвагу, што лакальны эмулятар даступны толькі для Windows у цяперашні час (дзякуй Дэвіду Мэйсану за прапанаваную праўку!).

[Лістапад 2016] Прыбрана згадка пра дакументы, якія мінаюць тэрмін дзеяння, якія з'яўляюцца эксклюзіўным для DocumentDB, бо Бо Бэндцэн ласкава адзначыў, што MongoDB мае падобныя магчымасці.

[Студзень 2017] Дададзены раздзел пра нестандартную ўбудаваную бяспеку DocumentDB, прапанаваную Мэры Бранскомб.

Падабенства

Канцэптуальна паміж двума базамі дадзеных ёсць некалькі асноўных падабенстваў:

  • Дакументы захоўваюцца і падаюцца ў фармаце JSON
  • Дакументы можна знайсці пры дапамозе насычанай мовы запытаў, якая добра адпавядае сінтаксісу JSON

Асаблівасці, унікальныя для MongoDB

Для пачатку пералічым асноўныя функцыі MongoDB, у якіх адсутнічае аналагічны аналог DocumentDB.

Багатыя магчымасці запытаў пры дапамозе канвеера

Трубаправод зборкі MongoDB - гэта вельмі магутная функцыя, якая дазваляе будаваць трубаправод, які складаецца з этапаў апрацоўкі дадзеных, кожны фільтруе і трансфармуе дакументы з калекцыі. Магчымасці гэтага газаправода амаль бязмежныя, і яго гнуткасць можа задаволіць практычна любыя пытанні.

Для параўнання, SQL-падобны сінтаксіс запытаў DocumentDB дазваляе толькі простае фільтраванне па дакументах, нават не маючы такіх "асноўных" канструкцый, як падлік або сума (хаця яны працуюць над гэтым і тым часам вы можаце абыйсці з JavaScript на баку сервера). Зручны ліст для запытаў можна знайсці тут.

Паменшыце карту

Прыблізна падобная на канвеерную зборку, функцыя памяншэння карт MongoDB дазваляе дакументам калекцыі праходзіць праз два асобныя этапы, якія ітэратыўна пераўтвараюць (альбо праекты), а потым групуюць дакументы. Абодва этапы вызначаюцца ў Javascript.

У DocumentDB такога паняцця няма, хаця падобныя вынікі можна атрымаць, захоўваючы захаваныя працэдуры (гл. Ніжэй).

Поўнатэкставыя паказальнікі

Сярод розных тыпаў індэксаў, даступных у MongoDB, тэкставы індэкс прапануе поўнатэкставы пошук.

DocumentDB не прадугледжвае поўнага тэкставага індэксавання. Рэкамендаваны спосаб дадаць поўнатэкставы пошук у базу дадзеных DocumentDB - гэта спалучэнне яго з паслугай пошуку Azure; паміж імі ёсць добрая інтэграцыйная гісторыя.

Іншыя платформы падтрымліваюцца драйверамі на базе кліента

Я думаю, што важна адзначыць, што драйверы MongoDB падтрымліваюць вельмі шырокі спектр платформаў, тады як DocumentDB мае толькі SDK для .NET, Java, Python і Node.js - але вы можаце паспрабаваць поспех, выкарыстоўваючы любы драйвер MongoDB з DocumentDB дзякуючы яго падтрымцы. для пратакола MongoDB.

Асаблівасці, унікальныя для DocumentDB

Давайце зробім зваротную практыку і пералічым функцыі DocumentDB, якія нельга знайсці ў MongoDB.

Сервер Javascript

Гэта ключавая асаблівасць DocumentDB. Ён мае багаты серверны API Javascript, які дазваляе ствараць функцыі апрацоўкі дадзеных. Гэтыя функцыі на баку сервера могуць мець 3 розныя формы:

  • захаваныя працэдуры, якія могуць зрабіць амаль усё, што заўгодна (устаўка, запыт, абнаўленне дакументаў) і тэлефанаваць праз SDK або REST API
  • трыгеры (або гачкі), якія выконваюцца да або пасля пэўных аперацый (напрыклад, пры ўстаўцы дакумента)
  • АДС (функцыі, вызначаныя карыстальнікам), якія можна выклікаць і пашырыць мову запытаў SQL, неяк звужаючы разрыў з багатымі магчымасцямі запытаў MongoDB.

Цяпер MongoDB можа таксама выконваць сервер Javascript, але я разумею:

  • Знізіць карту і $, дзе аператар запытаў можа выкарыстоўвацца толькі для запытаў, а не для абнаўленняў
  • Функцыі Javascript, якія можна захоўваць у спецыяльнай калекцыі сістэмы, падыходзяць толькі для мэтаў адміністравання або абслугоўвання.

У дакументацыі MongoDB выразна гаворыцца, што пры выкананні Javascript на серверы існуюць абмежаванні на прадукцыйнасць; для параўнання, DocumentDB сапраўды распрацаваны для гэтай мэты, бо ён папярэдне кампілюе ваш код Javascript, а затым захоўвае і выконвае атрыманы байт-код.

Здзелкі

Дзякуючы згаданым вамі працэдурам, якія захоўваюцца Javascript, у калекцыі DocumentDB можна здзяйсняць транзакцыі ACID. Яно працуе вельмі проста: калі ваша функцыя Javascript завяршаецца, усе аперацыі па напісанні выконваюцца; калі функцыя кідае нейкае выключэнне, усе аперацыі адкручваюцца назад.

Акрамя MongoDB, па сутнасці, няма аніякай канцэпцыі транзакцый, акрамя таго, што аднатоннасць атамнай дакументацыі азначае, што ўстаўка або абнаўленне дакумента гарантавана атамнай, але аперацыя па напісанні некалькіх дакументаў не з'яўляецца атамнай у цэлым.

Поўная індэксацыя па змаўчанні

DocumentDB выкарыстоўвае даволі рашучы падыход да індэксацыі: па змаўчанні ён індэксуе ўсе палі дакументаў, якія вы захоўваеце! Шмат хто з вас можа ўспрымаць гэта як марнаванне часу на апрацоўку часу і месца для захоўвання, што сумленна ў пэўнай ступені - але гэта дае цікавую перавагу, прапаноўваючы выдатнае выкананне запытаў з каробкі. Для тых, хто аддае перавагу лепш кантраляваць тое, што індэксуецца, заўсёды можна вызначыць уласную палітыку індэксавання.

(Лёгкае) глабальнае распаўсюджванне

Яшчэ адным нядаўнім дадаткам да магчымасцей DocumentDB з'яўляецца глабальнае распаўсюджванне. У асноўным гэтая функцыя дазваляе маштабаваць ваш асобнік DocumentDB у розных рэгіёнах свету і вызначыць, які тып узгодненасці чакаецца паміж рэгіёнамі - ад моцнага да канца. Можна нават наладзіць аўтаматычнае і празрыстае адставанне ў розных рэгіёнах.

Вядома, разгортванне сусветнага кластара вузлоў MongoDB, безумоўна, магчыма, але тое, што я хачу падкрэсліць тут, гэта лёгка наладзіць такі кластар. Гэта відавочна перавышае асноўныя функцыі DocumentDB і звязана з яго характарам PaaS, але я не веру, што ёсць які-небудзь пастаўшчык паслуг, які прапануе такую ​​геа-размеркаваную настройку для MongoDB (пры такой цане і прастаце выкарыстання).

Бяспека

Варта адзначыць, што ў якасці службы DocumentDB забяспечвае ўбудаваны кантроль бяспекі і доступу, які па змаўчанні існуе… Адсутнічае доступ адміністратара без пароля! Акрамя таго, ён таксама дае магчымасць кантраляваць доступ да калекцый і дакументаў дробназярністымі спосабамі, ствараючы карыстальнікаў і звязваючы іх з гэтымі рэсурсамі праз правы доступу, абароненыя паролем.

Цэнаўтварэнне

Апошнім, але, безумоўна, не менш важным крытэрам параўнання з'яўляецца кошт. Але мы павінны быць асцярожныя, каб не параўноўваць яблыкі і апельсіны: DocumentDB належыць да сямейства PaaS, тады як MongoDB - гэта база дадзеных, а не сэрвіс. Такім чынам, давайце возьмем mLab, прапанову MongoDB PaaS, у якасці параўнання.

Спачатку варта ўдакладніць, як улічваецца кошт рахунку DocumentDB. Кожная калекцыя выстаўляецца за кошт 2 памераў:

  • выкарыстанае сховішча, па 0,25 USD за ГБ / месяц
  • зарэзерваваны запыт адзінак у секунду, пры ~ 6 USD за 100 RU / месяц

Колькасць рэзерваў, якія вы рэзервуеце, дыктуе гарантаваную прапускную здольнасць, якую вы атрымаеце (хочаце даведацца больш пра запытныя блокі? Праверце мой пост!). У прынцыпе, RU ўяўляе сабой "апрацоўку, неабходную для прачытання аднаго дакумента 1 КБ з 10 уласцівасцямі". Калі казаць, ацаніць рэальную кошт складаных аперацый, такіх як вялікія запыты альбо складаная захоўваемая працэдура, няпроста, хоць гэта кіраўніцтва вельмі дапамагае. Але мы можам зрабіць зваротную практыку, паглядзеўшы, колькі RU мы маглі б атрымаць за цану плана mlab.

Тое, што я не згадваў дагэтуль, - гэта тое, што DocumentDB працуе на мясцовым SSD, таму для таго, каб правесці сумленнае параўнанне, давайце возьмем з гэтай старонкі план «Высокая прадукцыйнасць М3», які на момант напісання артыкула (верасень 2016 г.) па цане 1390 долараў штомесяц за 80 Гб сховішчы.

  • З гэтых 80 ГБ на рахунак DocumentDB будзе выстаўлена 20 долараў
  • Гэта пакідае 1370 USD, або больш за 22800 RU

Раней я ўжо згадваў, што складана ацаніць “значэнне” RU, але з майго досведу 22 800 - гэта шмат, што ўваходзіць у дыяпазон 200 складаных запытаў у секунду. І хаця гэтак жа складана ацаніць магчымасці гэтага плана "High Performance M3", я б сказаў, што мы гуляем у падобным маштабе ці, прынамсі, не на парадкі.

Акрамя таго, што прыемна з эластычнасцю RU ў тым, што ён распрацаваны як адзінка маштабу, а гэта азначае, што вы можаце пачаць са сціплай колькасці RU і (лёгка) маштабаваць яго, паколькі выкарыстанне вашых калекцый павялічваецца, а яшчэ карыстаючыся перавагамі мясцовых SSD з самага пачатку.

А як з коштам блакавання пастаўшчыка?

Занепакоенасць, якую выказалі многія, заключаецца ў блакаванні пастаўшчыкоў: калі я выкарыстоўваю DocumentDB, я не толькі з Microsoft, але і з Azure як платформай. Вы нават можаце сцвярджаць, што адсутнасць такой рэгістрацыі павінна была пералічыцца ў перавагах MongoDB перад DocumentDB. Я згодзен. А якая рэальная кошт гэтага блакавання?

DocumentDB захоўвае дакументы ў фармаце JSON. Гэта стандартны фармат, які выкарыстоўваецца ў большасці баз дадзеных NoSQL (эй, нават SQL Server размаўляе на JSON!), Таму перанос дакументаў з DocumentDB і ўвядзенне іх у іншую базу дадзеных не павінны быць праблемай.

Асноўны тэхнічны замак, з якім вы павінны мець справу, - гэта інтэрфейс запытаў: у кожнай базы дадзеных ёсць свой спосаб запыту дакументаў. Вялікую частку часу вы выконваеце гэтыя запыты праз нейкі SDK альбо драйвер, таму з пункту гледжання кода прыкладання, блакаванне або прыхільнасць да пэўнай базы дадзеных адбываецца галоўным чынам з інтэрфейсу гэтага SDK. Але тады, калі вашы распрацоўшчыкі ўсё робяць правільна, гэты інтэрфейс павінен быць інкапсуляваны за нейкі інтэрфейс доступу да дадзеных, які хавае дэталі рэалізацыі ў астатняй частцы прыкладання.

І калі вы хвалюецеся тым, што вы можаце перанесці на MongoDB на больш познім этапе, памятайце, што DocumentDB мае сумяшчальнасць пратаколаў з MongoDB, гэта азначае, што вы можаце выкарыстоўваць любы драйвер MongoDB для доступу да DocumentDB і выканання большасці аперацый CRUD.

Як рэкамендую накіроўваць сваё рашэнне

Складаючы вынікі, вось першыя пытанні, якія, я думаю, вы маглі б задаць сабе, калі вам трэба зрабіць выбар паміж гэтымі базамі дадзеных (у не вызначаным парадку):

  • Складанасць запытаў: ці патрабуюць вашыя запыты поўную магутнасць трубаправода агрэгацыі MongoDB, ці вы можаце рэалізаваць іх з SQL DocumentDB і нейкім Javascript на баку сервера?
  • Транзакцыі: ці патрабуецца ваша логіка бізнесу для транзакцый з мноствам дакументаў на агульную калекцыю, ці дастаткова адной атамнай дакументацыі MongoDB для вашых патрабаванняў?

Зыходзячы з вашых адказаў і агульнага кірунку, які яны даюць, вы можаце ўдакладніць свой аналіз і разгледзець астатнія згаданыя мной функцыі (поўны тэкст пошуку, глабальнае распаўсюджванне і г.д.)

Калі ласка, каментуйце!

Я паспрабаваў правесці гэтае параўнанне самым сумленным і непрадузята, але ў некаторых аспектах я мог памыліцца. Так што не саромейцеся звяртацца, калі вы адчуваеце, што нейкія функцыі адсутнічаюць альбо былі завышаныя альбо недаацэненыя! Я мяркую, што гэты пост будзе развівацца з цягам часу і дапаўняцца, каб стаць добрым арыенцірам на параўнанне DocumentDB і MongoDB.

Дзякуй за чытанне!