Opublikowano wydanie projektu FerretDB 0.1 (dawny MangoDB), które pozwala zastąpić dokumentowo zorientowany DBMS MongoDB PostgreSQL bez wprowadzania zmian w kodzie aplikacji. FerretDB działa jako serwer proxy, konwertujący zapytania do MangoDB na zapytania SQL do PostgreSQL, co pozwala używać PostgreSQL jako faktycznego magazynu. Kod jest napisany w języku Go i rozpowszechniany na licencji Apache 2.0.
Potrzeba migracji może się pojawić w związku z przejściem MongoDB na nieotwartą licencję SSPL, która opiera się na licencji AGPLv3, ale nie jest otwarta, ponieważ zawiera dyskryminacyjne wymaganie dostarczania nie tylko kodu samej aplikacji, ale także źródeł wszystkich komponentów zaangażowanych w świadczenie usług w chmurze pod licencją SSPL.
FerretDB kieruje swoją ofertę do użytkowników, którzy nie wykorzystują w swoich aplikacjach rozszerzonych możliwości MongoDB, ale chcą korzystać z całkowicie otwartego stosu oprogramowania. Na obecnym etapie rozwoju FerretDB obsługuje tylko część funkcji MongoDB, najbardziej powszechnie stosowanych w typowych aplikacjach. W przyszłości planują osiągnąć pełną zgodność z driverami dla MongoDB i umożliwić korzystanie z FerretDB jako przezroczystej alternatywy dla MongoDB.
Przypomnijmy, że MongoDB zajmuje niszę między szybkim i skalowalnym systemami zarządzania danymi w formacie klucz/wartość a relacyjnymi DBMS, które są funkcjonalne i wygodne w formułowaniu zapytań. MongoDB obsługuje przechowywanie dokumentów w formacie podobnym do JSON, ma dość elastyczny język do formułowania zapytań, może tworzyć indeksy dla różnych przechowywanych atrybutów, skutecznie zapewnia przechowywanie dużych obiektów binarnych, wspiera rejestrowanie operacji na zmianach i dodawaniu danych do bazy danych, może działać zgodnie z paradygmatem Map/Reduce, wspiera replikację i budowanie konfiguracji odpornych na awarie.
W wydaniu FerretDB 0.1.0 całkowicie przepisano metodę pobierania danych z PostgreSQL. Wcześniej dla każdego przychodzącego zapytania MongoDB generowane było jedno zapytanie SQL do PostgreSQL, wykorzystujące funkcje do pracy z formatem JSON i filtrujące wyniki po stronie PostgreSQL. Z powodu różnic w semantyce funkcji json PostgreSQL i MongoDB obserwowano niespójności w zachowaniu podczas porównywania i sortowania różnych typów. Aby rozwiązać ten problem, z PostgreSQL teraz pobierane są nadmiarowe dane, a filtracja wyników odbywa się po stronie FerretDB, co pozwoliło na odtworzenie zachowania MongoDB w większości sytuacji.
Kosztem wzrostu zgodności stał się spadek wydajności, który w przyszłych wydaniach planuje się zrekompensować poprzez selektywną filtrację po stronie FerretDB tylko tych zapytań, w których obserwuje się niezgodność zachowania. Na przykład zapytanie „db.collection.find({_id: ‘some-id-value’})” może być w pełni obsłużone w PostgreSQL. Pierwszym zadaniem projektu na obecnym etapie rozwoju jest osiągnięcie zgodności z MongoDB, a wydajność na razie schodzi na drugi plan. W nowej wersji wymieniane są funkcjonalne zmiany, takie jak wsparcie dla wszystkich operatorów bitowych, operatora porównania „$eq”, a także operatorów „$elemMatch” i „$bitsAllClear”.
Źródło: opennet.ru
