Cześć!
Chciałem Wam zaprezentować narzędzie, nad którym pracuje od dość dawna - framework i orm w jednym, który pozwala pisać rozproszone aplikacje w C++.
Początkowa idea była dość zwięzła - obsłużyć jak najlepiej split brain dla środowisk klastrowych/cloud, z którymi pracowałem m.in. w IFJ PAN i Cyfronecie. Aplikacje działające w takich środowiskach miały pozostawać jak najdłużej "sprawne" po dowolnym podzieleniu klastra. W większości aplikacji zarządzających infrastrukturą, odcięcie dostępu do bazy albo pojedynczego serwisu powodowało dość duże problemy. Finalnie udało się to osiągnąć przez skopiowanie kilku pomysłów z blockchaina, X509 i architektury event driven wzorowanej na Androdzie.
Jak to działa? Pisząc aplikacje z dinemic, tak jak w przypadku wielu innych aplikacji tworzymy na początku model danych - klasy w C++ opisujące to, jak dane są trzymane w lokalnej bazie danych. W odróżnieniu od większości architektur, zamiast wystawiać serwer z API, które modyfikuje naszą baze danych, framework rozsyła multicastem aktualizacje stanu obiektów, którymi zarządza do innych aplikacji w sieci. Dzięki temu zmieniając pojedyncze pole w obiekcie, każdy w sieci wie co należy u zmienić w swojej lokalnej kopi bazy. Tak więc ORM z dinemic pośredniczy we wszystkich operacjach odczytu/zapisu do bazy i powiadami innych co i gdzie się zmienia. Żeby wszystko pozostało bezpieczne, każdy obiekt tworzy swoją parę kluczy, za pomocą których podpisywane są zmiany. Dzięki temu można też kontrolować kto do czego ma dostęp, poprzez odpowiednie szyfrowanie pól obiektów. Całość update'ów poszczególnych obiektów jest poukładana w łańcuchy, trochę na podobieństwo blockchaina. Dzięki temu po ewentualnym split brainie można odtworzyć wszystkie zmiany.
Oprócz ORM'a framework pozwala zdefiniować własne listenery, które są wywoływane gdy aplikacja (tzn my lub inna w sieci) przysyła update bazy danych. Może to dotyczyć aktualizowania danych w polach, całych obiektach lub na poziomie całego modelu danych. Dzięki nim można kontrolować co ktoś zmienia w naszej lokalnej bazie i, co chyba najważniejsze odpowiednio reagować na takie zmiany, np. dostosowując stan systemu lub zasobów do tego, co się zmienia w bazie.
Obecnie biblioteka jest dostępna na gitlabie jako open source, dla C++ oraz w formie wrappera, dla pythona. Całość można pobrać tu (binarki) i tu (źródła). Gdyby ktoś był zainteresowany, to dodaje jeszcze link do dokumentacji: https://dinemic.io/documentation/
W razie pytań chętnie odpowiem :)