Dlaczego tak wielu programistów absolutnie nienawidzi warstw rozpowszechnienia obiektów?

9

Rozpowszechnienie jest prostą techniką dostarczania właściwości ACID do modelu obiektowego w pamięci opartego na serializacji binarnej i rejestrowaniu z wyprzedzeniem. Działa to tak:

  • Zacznij od migawki. Serializuj model obiektowy i zapisz go do pliku.
  • Utwórz plik dziennika. Dla każdego wywołania w modelu obiektowym serializuj wywołanie i jego argumenty.
  • Gdy dziennik staje się zbyt duży, wyłączasz się lub w innym przypadku jest to wygodne, wykonaj punkt kontrolny: napisz nową migawkę i skróć dziennik.
  • Aby przywrócić lub przywrócić działanie po awarii lub awarii zasilania, załaduj ostatnią migawkę i ponownie uruchom wszystkie połączenia zarejestrowane w dzienniku.

Środki ostrożności potrzebne do wykonania tej pracy to:

  • Nie pozwól, aby zmienne odwołania do obiektów uciekły lub nie weszły do ​​warstwy rozpowszechnienia. Potrzebujesz jakiegoś schematu proxy lub OID, tak jakbyś robił RPC. (Jest to tak powszechny błąd początkującego, że nazywano go „ problemem chrztu ”).
  • Cała logika osiągalna z połączenia musi być całkowicie deterministyczna i nie może wykonywać logicznych operacji logicznych we / wy lub systemu operacyjnego. Zapisywanie w dzienniku diagnostycznym jest prawdopodobnie prawidłowe, ale generowanie czasu systemowego lub uruchamianie asynchronicznego delegata na ogół nie. Dzieje się tak, aby dziennik był odtwarzany identycznie, nawet jeśli został przywrócony na innym komputerze lub w innym czasie. (Większość kodów rozpowszechnienia zapewnia alternatywne wywołanie czasowe w celu uzyskania znacznika czasu transakcji).
  • Współbieżność pisarzy wprowadza niejednoznaczność w interpretacji czasopism, dlatego jest zabroniona.

Czy to dlatego, że ...

  • ludzie poczuli do nich zły gust po tym, jak spróbowali użyć jednego z nich w projekcie, który nie był do tego dobrze przystosowany * ?
  • Ostre poparcie dla Klausa Wuestefelda zniechęciło ludzi ?
  • ludzie, którzy lubią imperatywny model programowania, nie lubią oddzielania operacji we / wy od obliczeń , zamiast tego wolą przeplatać obliczenia z operacjami we / wy i wątkami?
  • warstwy rozpowszechnienia są tak koncepcyjnie proste i tak ściśle związane z cechami środowiska, w którym żyją, że zwykle są one opracowywane na zamówienie dla projektu, co czyni je zbyt obcymi / niestandardowymi / ryzykownymi?
  • po prostu zbyt trudno jest zachować to, czego nie możesz robić ostrożnie?
  • wydaje się, że głowy początkujących po prostu eksplodują w obliczu czegoś, co nie jest tym samym rodzajem aplikacji opartej na bazie danych, którą nauczyli się pisać w szkole? ;)

* Do całego zestawu danych zmieści się w pamięci RAM , nie trzeba pisarz współbieżność i nie trzeba robić ad-hoc zapytań, raportowania i wywozu do hurtowni danych. Z przeprosinami dla SQLite, rozpowszechnienie jest ulepszeniem plików zapisu, a nie zamiennikiem Oracle.

Jeffrey Hantin
źródło
Aha. Zastanawiałem się, czy to ma nazwę. Zawsze miało to dla mnie sens, po prostu nigdy nie miałem na to nazwy.
greyfade
9
O czym mówisz?
TheLQ
Po raz pierwszy o tym słyszę. Co to jest?
Jonn
Dodano wyjaśnienie.
Jeffrey Hantin
1
Ohhh .. Znam ten pomysł, ale nigdy wcześniej tego nie robiłem. Wygląda mi całkiem fajnie. Jestem prawie pewien, że nie jest to coś, co wielu deweloperów „absolutnie nienawidzi”.
Jonn

Odpowiedzi:

6

Myślę, że część problemu polega na tym, że mają BARDZO konkretny przypadek użycia (twój nieodpowiedni powód). Zbudowałem i pracowałem na systemach, które wykorzystują to podejście, a kiedy masz problem, który w rzeczywistości jest tym problemem, może to być wspaniałe rozwiązanie.

Kolejną częścią jest to, że wygląda bardzo podobnie do niektórych bardziej bolesnych fragmentów niestandardowego przechowywania danych, które znajdowałeś ponad 10 lat temu i ma takie same pułapki (na przykład zaktualizowana partia btreive), które powodują „zbyt niestandardowy” punkt, ale także utrudnia znalezienie z półki części, które działają z nim grzecznie.

Ostatnia część polega na tym, że w wielu przypadkach może być cholernie trudno zapytać, a ludzie w ogóle są przyzwyczajeni do możliwości uzyskania odpowiedzi w tej chwili.

Rachunek
źródło
11

Myślę, że najpierw musisz wykazać, że tak wielu programistów absolutnie ich nienawidzi. Nie sądzę, że tak jest. Uważają, że Fowler, jakiś czas temu, sformalizowanego wzoru rodzaju tego tutaj .

Steven Evers
źródło
Tak, jestem trochę zdezorientowany. Wyglądają jak świetne narzędzie, jeśli używasz ich z właściwego powodu.
Matt Olenik,
Mówię to tylko dlatego, że złapałem absolutnie niesamowity żal od współpracowników.
Jeffrey Hantin
1
@Jeffrey Hantin: Brzmią leniwie i mają zamknięte umysły.
Steven Evers,
1
Aha, a prawdziwym kamieniem węgielnym wzoru jest c2.com/cgi/wiki?TransactionTape
Jeffrey Hantin
4

Odpowiedź na to pytanie jest taka, że ​​chociaż teoria jest prosta, praktyka nie jest.

Już samo testowanie takiej konfiguracji wymaga dziesiątek przypadków testowych, dodawania w procesie mutli lub wielowątkowego kodu, co przeskakuje do setek możliwych warunków, które należy przetestować, zarówno pod kątem trwałości, jak i odzyskiwania.

Każdy monitor transakcji, taki jak CICS, Tuxedo, Weblogic, Websphere, JBOSS lub .NET, zapewni wszystkie te udogodnienia w czysty i przetestowany sposób. Każda baza danych zapewni „wystarczającą” transakcyjność / trwałość dla większości aplikacji.

To głównie skrzynia tego koła została wynaleziona i dopracowana dawno temu.

James Anderson
źródło
to i tendencja wielu „architektów” do posiadania jednego uprzywilejowanego „smaku”, który starają się narzucić, bez względu na to, jak niewłaściwy może być ten projekt dla problemu, który wymaga rozwiązania.
jwenting
@jwenting Czy to mieści się w punkcie „zdecydowanego popierania”?
Jeffrey Hantin
2

Wymagania wstępne są nieco uciążliwe dla kodu, szczególnie w przypadku większości systemów, które nie wymagają zgodności z ACID podczas pracy w pamięci. Overhead również brzmi nieco nieprzyjemnie - jest w tym wiele śledzenia stanu.

Wyatt Barnett
źródło