Îòêðûòèå èñõîäíîãî êîäà
Êîìïàíèÿ Microsoft îòêðûëà èñõîäíûé êîä ñâîåãî ïðîåêòà DocumentDB, ïðåäëàãàÿ åãî êàê NoSQL ñèñòåìó óïðàâëåíèÿ áàçàìè äàííûõ (ÑÓÁÄ) èëè ÈÒ-ïëàòôîðìó äëÿ ÈÒ-ñèñòåì õðàíåíèÿ, ïèøåò ñàéò ðàçðàáîò÷èêà. DocumentDB ìîæíî èñïîëüçîâàòü êàê ñàìîñòîÿòåëüíóþ áàçó äàííûõ (ÁÄ) èëè â ñâÿçêå ñ PostgreSQL.
Ïðåäñòàâèòåëè Microsoft îáúÿâèëè îá îòêðûòèè êîäà ïðîåêòà DocumentDB, êîòîðûé ìîæåò èñïîëüçîâàòüñÿ êàê îòäåëüíàÿ NoSQL ÑÓÁÄ, êàê ÈÒ-ïëàòôîðìà äëÿ ñîçäàíèÿ ñîáñòâåííûõ ÈÒ-ñèñòåì õðàíåíèÿ èëè êàê äîïîëíåíèå äëÿ õðàíåíèÿ äàííûõ â ôîðìàòå BSON â ÑÓÁÄ PostgreSQL.
Azure DocumentDB - ñëóæáà ÁÄ äîêóìåíòîâ NoSQL, ðàçðàáîòàíà ñïåöèàëüíî äëÿ ðåàëèçàöèè ïðÿìîé ïîääåðæêè JSON è JavaScript âíóòðè ÈÒ-ñèñòåìû ÁÄ. ÈÒ-ðåøåíèå ïîäõîäèò äëÿ ïðèëîæåíèé, ðàáîòàþùèõ â îáëàêå, êîãäà íåîáõîäèìî îáåñïå÷èòü ïðîãíîçèðóåìóþ ïðîïóñêíóþ ñïîñîáíîñòü, íèçêèé óðîâåíü çàäåðæåê è ãèáêèå âîçìîæíîñòè ðàáîòû ñ çàïðîñàìè.
Âåäü íà ïðàêòèêå DocumentDB ïðèìåíÿåòñÿ â êîìïàíèè Microsoft â êà÷åñòâå îñíîâû ïðîäóêòà «Azure Cosmos DB for MongoDB», ïðåäîñòàâëÿþùåãî èíòåðôåéñ, ñîâìåñòèìûé ñ äîêóìåíòî-îðèåíòèðîâàííîé ÑÓÁÄ MongoDB. Ïî èíôîðìàöèè Microsoft, êîä ïðîåêòà íàïèñàí íà ÿçûêå Ñ è ðàñïðîñòðàíÿåòñÿ ïîä ëèöåíçèåé Ìàññà÷óñåòñêîãî òåõíîëîãè÷åñêîãî èíñòèòóòà. Äâèæîê DocumentDB ðåàëèçîâàí â ôîðìå íàäñòðîéêè íàä ÑÓÁÄ PostgreSQL.
Êàê è â MongoDB äëÿ õðàíåíèÿ ñòðóêòóðèðîâàííûõ äîêóìåíòîâ â DocumentDB çàäåéñòâîâàí JSON-ïîäîáíûé ôîðìàò BSON (Binary JSON), ïîçâîëÿþùèé ñîçäàâàòü èåðàðõè÷åñêèå ñòðóêòóðû, â êîòîðûõ îäíè äîêóìåíòû è ìàññèâû ìîãóò âñòðàèâàòüñÿ â äðóãèå äîêóìåíòû è ìàññèâû. Êëþ÷åâûì îòëè÷èåì îò JSON ÿâëÿåòñÿ èñïîëüçîâàíèå ñåðèàëèçàöèè äàííûõ â áèíàðíîå ïðåäñòàâëåíèå. Ïðîåêò ïðåäîñòàâëÿåò êàê NoSQL-îïåðàöèè äëÿ ñîçäàíèÿ, ÷òåíèÿ, îáíîâëåíèÿ è óäàëåíèÿ äàííûõ â ôîðìàòå BSON, òàê è API äëÿ øòàòíîãî PostgreSQL (DocumentDB ìîæåò ðàññìàòðèâàòüñÿ êàê âàðèàíò PostgreSQL ñ ïîääåðæêîé BSON).  DocumentDB ìîãóò èñïîëüçîâàòüñÿ âîçìîæíîñòè ïîëíîòåêñòîâîãî ïîèñêà, îïåðàöèè íàä âåêòîðíûìè è ãåîïðîñòðàíñòâåííûìè òèïàìè äàííûõ.
Òåõíè÷åñêèå êîìïîíåíòû
Ïðîåêò DocumentDB ñîñòîèò èç äâóõ êîìïîíåíòîâ: pg_documentdb_core - ýòî ðàñøèðåíèå ê PostgreSQL ñ ðåàëèçàöèåé òèïà BSON è îïåðàöèé äëÿ ðàáîòû â PostgreSQL ñ äàííûìè BSON; pg_documentdb - ýòî îáùåäîñòóïíûé API DocumentDB ñ áàçîâûìè îïåðàöèÿìè äëÿ ðàáîòû ñ äîêóìåíòàìè â ôîðìàòå BSON, îáðàáîòêè çàïðîñîâ è óïðàâëåíèÿ èíäåêñàìè.
Ïåðâûé âûïóñê DocumentDB ïðåäîñòàâëÿåò ïîääåðæêó îïåðàöèé CRUD (ñîçäàíèå, ÷òåíèå, îáíîâëåíèå, óäàëåíèå), èíäåêñû äëÿ îòäåëüíûõ ïîëåé BSON, èíäåêñû äëÿ ïîëíîòåêñòîâîãî ïîèñêà (ñîâìåñòèìû ñ RUM), âåêòîðíûå è ãåîïðîñòðàíñòâåííûå çàïðîñû (ñîâìåñòèìûå ñ pg_vector è postgis), âîçìîæíîñòè äëÿ ôîðìèðîâàíèÿ çàïðîñîâ è àãðåãèðîâàíèÿ äàííûõ BSON.
Ïî äàííûì èññëåäîâàíèé Wired, èñïîëüçîâàíèå òàêèõ îïòèìèçèðîâàííûõ ôîðìàòîâ, êàê BSON, ìîæåò ïîâûñèòü ïðîèçâîäèòåëüíîñòü îïåðàöèé ñ äàííûìè íà 30-40%, ÷òî äåëàåò DocumentDB îñîáåííî èíòåðåñíûì âûáîðîì äëÿ ðàçðàáîòêè âûñîêîíàãðóæåííûõ ïðèëîæåíèé. Îòêðûòèå èñõîäíîãî êîäà DocumentDB – ýòî âàæíîå ñîáûòèå â îáëàñòè ðàçðàáîòêè ÁÄ. Ýòî ÈÒ-ðåøåíèå ïðåäîñòàâëÿåò ïðîãðàììèñòàì ìîùíûé ÈÒ-èíñòðóìåíò äëÿ ñîçäàíèÿ è óïðàâëåíèÿ ñèñòåìàìè õðàíåíèÿ äàííûõ.
Âëèÿíèå íà ðûíîê
Íà èñïîëüçîâàíèå DocumentDB óæå ïåðåøåë ïðîåêò FerretDB, ðàçâèâàþùèé ðåàëèçàöèþ ÑÓÁÄ MongoDB íà áàçå ÑÓÁÄ PostgreSQL. ÈÒ-ïðîåêò FerretDB ïîçâîëÿåò áåç âíåñåíèÿ èçìåíåíèé â êîä ïðèëîæåíèé çàìåíèòü ïðîïðèåòàðíóþ äîêóìåíòî-îðèåíòèðîâàííóþ ÑÓÁÄ MongoDB íà ïîëíîñòüþ îòêðûòûé ïðîãðàììíûé ñòåê, îñíîâàííûé íà PostgreSQL.
Îñíîâíîé öåëåâîé àóäèòîðèåé FerretDB ÿâëÿþòñÿ ïîëüçîâàòåëè, êîòîðûå íå ïðèìåíÿþò â ñâîèõ ïðèëîæåíèÿõ ðàñøèðåííûå âîçìîæíîñòè MongoDB, íî æåëàþò èñïîëüçîâàòü ïîëíîñòüþ îòêðûòûé ïðîãðàììíûé ñòåê.
Íåîáõîäèìîñòü çàìåíû MongoDB îáúÿñíÿåòñÿ ïåðåõîäîì äàííîé ÑÓÁÄ íà ëèöåíçèþ server side public license (SSPL), êîòîðàÿ îñíîâàíà íà ëèöåíçèè AGPLv3, íî íå ÿâëÿåòñÿ îòêðûòîé, òàê êàê ñîäåðæèò äèñêðèìèíèðóþùåå òðåáîâàíèå ïîñòàâêè ïîä ëèöåíçèåé SSPL íå òîëüêî êîäà ñàìîãî ïðèëîæåíèÿ, íî è èñõîäíûõ òåêñòîâ âñåõ êîìïîíåíòîâ, âîâëå÷åííûõ â ïðåäîñòàâëåíèå îáëà÷íîãî ÈÒ-ñåðâèñà.
Èçíà÷àëüíî ðàáîòà FerretDB ñâîäèëàñü ê òðàíñëÿöèè îáðàùåíèé ê MongoDB â SQL-çàïðîñû ê PostgreSQL. Íà÷èíàÿ ñ âåðñèè FerretDB 2.0, êîòîðàÿ íàõîäèòñÿ íà ñòàäèè êàíäèäàòà â ðåëèçû, äëÿ ðåàëèçàöèè ïîääåðæêè ôîðìàòà BSON çàäåéñòâîâàíî PosgreSQL-ðàñøèðåíèå DocumentDB.
Ñàì æå ïåðåõîä íà èñïîëüçîâàíèå DocumentDB ïîçâîëèë áîëåå ÷åì â 20 ðàç ïîâûñèòü ïðîèçâîäèòåëüíîñòü FerretDB äëÿ íåêîòîðûõ âèäîâ íàãðóçêè. Èç äðóãèõ íîâøåñòâ FerretDB 2.0 îòìå÷àåòñÿ óëó÷øåíèå ñîâìåñòèìîñòè ñ MongoDB, âîçìîæíîñòü ðåïëèêàöèè è ïîääåðæêà âåêòîðíîãî ïîèñêà. Êîä FerretDB íàïèñàí íà ÿçûêå Go è ðàñïðîñòðàíÿåòñÿ ïîä ëèöåíçèåé Apache 2.0.



