/ / Jakie są praktyczne wady użytkowaniamocno wpisany format wymiany danych (np. oszczędzanie / capn proto) w kontekście mikrousług? - json, serializacja, oszczędzanie, mikrousługi, wymiana danych

Jakie są praktyczne wady korzystania z silnie wpisanego formatu wymiany danych (np. Protokoły oszczędzania / capn) w kontekście mikrousług? - json, serializacja, oszczędność, mikroserwisy, wymiana danych

Mam na myśli wprowadzenie silnie maszynopisanego(czytaj - ze zdefiniowanym schematem) format wymiany danych do komunikacji między naszymi usługami wewnętrznymi. Na przykład, myślę, że coś takiego jak Thrift lub Cap 'n Proto.

Są to co najmniej dwie oczywiste zalety (dla mnie) korzystania z tego w porównaniu z czymś takim jak JSON

  1. ZNAJESZ dokładny format danych, których może oczekiwać usługa (więc pozostawia mniej miejsca na dwuznaczności i błędy podczas komunikacji) oraz
  2. implementacja zasadniczo deserializuje nieprzetworzony komunikat i zapewnia metody dostępu do obiektów.

Jakie są praktyczne wady korzystania z tej trasy w porównaniu z czymś takim jak JSON?

W kontekście - nasz system składa się z usługnapisane w Pythonie i Javie - i prawdopodobnie w innych językach w przyszłości, i komunikuje się za pośrednictwem punktów końcowych HTTP między usługami a brokerami wiadomości, takimi jak rabbitmq.

Odpowiedzi:

0 dla odpowiedzi № 1

Podobnie jak w przypadku każdego silnie typowanego systemu, jedną z głównych zalet jest bez wątpienia, że ​​jeśli popełnisz błędy, zrobi to wcześnie zawodzi w trakcie procesu, zazwyczaj na etapie kompilacji, co jest dobrą rzeczą.

Drugą największą zaletą IMHO jest to, co już Typowiedział: ponieważ pola i typy są dobrze znane, kompilator, biblioteki i powiązany kod wiedzą, jakich danych się spodziewać, a zatem mogą być pisane / organizowane w bardziej wydajny sposób - lub w skrócie: wydajność.

W przeciwieństwie do tego system z luźnym typem (jak Avro), pozwalający na znacznie większy elastyczność bez konieczności ponownej kompilacji ma drugą stronę tego samego medalu: wadą podatności na błędy dotyczące zawartości wiadomości w czasie wykonywania.

Wynika to z definicji źle zdefiniowanego systemutylko składnia prawidłowego dokumentu (jak na przykład XML) i pozostawia semantykę na poziomie wiadomości tego, co jest w dokumencie, do wyższych warstw. Silnie typowany system ma wiedzę na temat semantyki na poziomie komunikatu, która jest już wbudowana w czasie kompilacji. Dlatego łatwo jest wykryć / zdecydować, czyokreślony dokument lub wiadomość jest nie tylko dobrze sformułowana, ale ważna w odniesieniu do treści wiadomości. Jeśli musisz zrobić to samo ze źle zdefiniowanym systemem, musisz podać dodatkowe informacje W czasie wykonywania (np. schemat XML) i sprawdź poprawność dokumentu.

Dolna linia

Jaki system preferujesz, jest mniej więcej kwestiąsmaku w większości przypadków. Podejmuję decyzję w oparciu o pytanie, jak zmienne są dane, z którymi muszę sobie poradzić. Jeśli ma sens użycie silnie typowanego systemu, pójdę tą drogą, ponieważ bardzo lubię otrzymywać informacje o błędach i pomyłkach wcześnie.

Jednak jeśli istnieje potrzeba bardzo elastycznegostruktur danych, bardziej sensowne może być pójście inną drogą. Chociaż z pewnością możliwe jest zaprojektowanie źle napisanego schematu na silnie typowanym systemie, jest to trochę sprzeczne i skończy się na czymś zbyt skomplikowanym, a jednocześnie zbyt ogólnym.


0 dla odpowiedzi nr 2

Wpisany

Wiadomości przychodzące oznaczone typem są bardzowyzwalające, o ile można powiedzieć, co to jest wiadomość przychodząca, nie czytając jej wszystkich. Jeśli tak, to nie przejmujesz się już kolejnością wiadomości. Dzieje się tak, ponieważ odbiorca wiadomości jest łatwy w obsłudze cokolwiek zostanie wysłane. Możesz mieć aplikację, która po prostu siedzi i bierze wszystko, co dostaje, i robi wszystko, co jest odpowiednie dla każdego.

Format

Język schematu, który pozwala zdefiniować wartośća ograniczenia wielkości są bardzo przydatne. Oznacza to, że nadawca wiadomości nie może przypadkowo wysłać nieprawidłowej. Ponadto odbiorca może automatycznie stwierdzić, czy wiadomość przychodząca spełnia schemat. Jest to prawdziwy bonus we wdrażaniu usługi sieciowej; ogromna większość sprawdzania poprawności wiadomości jest dla Ciebie wykonana!

Przez ograniczenie rozmiaru rozumiem, że możesz określićjak długo tablica jest w schemacie, a wygenerowany kod odmówi obsługi tablic dłużej lub krócej. Na podstawie ograniczeń wartości wyobraź sobie pole komunikatu o nazwie „namiar”; możesz ograniczyć to od 0 do 359.

Oba pozwalają ci zrobić jasne, jednoznaczneoświadczenie o tym, czym jest interfejs i wymuszanie go automatycznie. Ile błędów bezpieczeństwa pojawiło się ostatnio, gdy pewna walidacja danych interfejsu sieciowego została źle zaimplementowana ...

Opcje

Jednym ze standardów serializacji, który to wszystko robiASN.1. Narzędzia, których użyłem, pobierają schemat ASN.1 i tworzą kod do serializacji i deserializacji, automatycznie sprawdzając, czy ograniczenia wartości i wielkości zostały spełnione, a także informując, jaki jest typ wiadomości przychodzącej. Narzędzia dla ASN.1 mogą być dość starsze i wymagają aktualizacji. W przypadku aktualizacji byłby idealny do każdego celu, z dostępnymi formatami binarnymi i tekstowymi.

Istnieją również schematy JSON, które wydają się mieć ograniczenia typu, wartości i rozmiaru. To może być to, czego szukasz.

Jestem całkiem pewien, że Bufory protokołu Google nie bardzo dobrze znakują i nie ograniczają wartości ani rozmiaru. Widziałem komentarze w schemacie GPB w następujący sposób:

// nie może być większy niż 10.

Jeśli to właśnie jest zapisywane w schemacie, język schematu jest prawdopodobnie nieodpowiedni ...

Nie jestem pewien Thrift, nie jestem pewien, czy to ma wartościowe ograniczenia (ktoś mnie poprawi, jeśli się mylę, proszę!).

Niedogodności

Nie mogą myśleć o żadnym! Może to drażnić programistów; kod, który według nich był dobry, można łatwo ujawnić, że produkuje wiadomości śmieciowe, co bardzo ich denerwuje ...