Jestem zainteresowany opracowaniem wielkoskalowej witryny zorientowanej na użytkownika, napisanej w Javie.
Jeśli chodzi o projektowanie, myślę o opracowaniu niezależnych, modułowych usług, które mogłyby pełnić rolę dostawców danych dla mojej głównej aplikacji internetowej.
Jeśli chodzi o pisanie tych usług modułowych (dostawców danych), mogę wykorzystać istniejący framework, taki jak Spring, i rozwinąć te usługi zgodnie z wzorcem projektowym RESTful, i udostępnić zasoby przez HTTP w formacie komunikatu takim jak JSON ... lub mogę wykorzystać istniejącą sieć frameworki takie jak Netty ( http://netty.io/ ) i format serializacji jak Protobufs ( https://developers.google.com/protocol-buffers/docs/overview ) i rozwijają serwer TCP, który wysyła tam iz powrotem serializowanego protobufa ładowność.
Kiedy wybrać jedną z nich? Czy przydałoby się korzystanie z formatu serializacji, takiego jak Protobufs, i przesyłanie strumienia bajtów przewodem? Czy używanie JSON wiązałoby się z dodatkowymi kosztami? Ile jest narzutu między używaniem TCP / IP a używaniem HTTP? Kiedy należy korzystać z usługi Spring over Netty i odwrotnie, aby zbudować taką usługę?
Odpowiedzi:
Zdecydowanie zalety / wady korzystania z JSON przez REST w porównaniu z bezpośrednim TCP / IP z protokołem binarnym i myślę, że już podejrzewasz, że protokół binarny będzie szybszy. Nie potrafię powiedzieć dokładnie, o ile szybciej (a to zależy od wielu czynników), ale zgaduję, że może 1-2 rzędy różnicy wielkości.
Na pierwszy rzut oka, jeśli coś jest 10-100 razy wolniejsze niż coś innego, możesz zareagować gwałtownie i zdecydować się na „szybką rzecz”. Jednak ta różnica prędkości występuje tylko w samym protokole. Jeśli istnieje dostęp do bazy danych / plików po stronie serwera, wybór warstwy transferu nie wpłynie na to. W niektórych przypadkach prędkość warstwy transferu może być znacznie mniejsza.
HTTP REST i JSON są dobre z wielu powodów:
Protobufy przez TCP / IP:
Gdyby to był mój wybór, wybrałbym HTTP REST i JSON. Jest powód, dla którego tylu innych firm i stron internetowych poszło tą drogą. Pamiętaj również, że w przyszłości zawsze możesz wesprzeć 2 punkty końcowe. Jeśli projekt jest poprawny, wybór punktu końcowego powinien być całkowicie oddzielony od logiki biznesowej po stronie serwera lub bazy danych. Więc jeśli później zrozumiesz, że potrzebujesz większej prędkości dla wszystkich / niektórych żądań, powinieneś być w stanie dodać protobufy przy minimalnym zamieszaniu. Jednak od samego początku REST / JSON sprawi, że zejdziesz z ziemi szybciej i poprowadzisz dalej.
Jeśli chodzi o Netty vs Spring. Nie korzystałem bezpośrednio z Netty, ale uważam, że jest to tylko lekki serwer WWW, gdzie Spring jest strukturą zapewniającą znacznie więcej niż tylko to. Ma warstwy dostępu do danych, planowanie zadań w tle i (myślę) model MVC, więc jest znacznie cięższy. Który wybrać? Jeśli zdecydowałeś się na HTTP, to następne pytanie prawdopodobnie brzmi, jak standardowa jest Twoja aplikacja? Jeśli masz zamiar napisać jakąś szaloną logikę niestandardową, która nie pasuje do standardowej formy, a wszystko czego potrzebujesz to tylko warstwa serwera HTTP, skorzystaj z Netty.
Podejrzewam jednak, że twoja aplikacja nie jest tak wyjątkowa i prawdopodobnie mogłaby skorzystać z wielu rzeczy, które Spring ma do zaoferowania. Oznacza to jednak, że powinieneś zbudować aplikację zgodnie ze strukturą Spring i postępować zgodnie z oczekiwaniami, co oznaczałoby, że dowiesz się więcej o Spring przed zanurzeniem się w swoim produkcie. Szkielety ogólnie są świetne, ponieważ znowu pozwalają szybciej oderwać się od ziemi, ale wadą jest to, że musisz dopasować się do ich formy zamiast robić własny projekt, a następnie oczekiwać, że szkielet po prostu zadziała.
(*) - w przeszłości zwracano uwagę, że moje posty nie odzwierciedlają opinii całego świata, więc przejdę do zapisu i dodam tylko, że mam ograniczone doświadczenie z Netty (wcześniej korzystałem z frameworka Play który jest oparty na Netty) lub Spring (czytałem tylko o tym). Więc weź to, co mówię, z odrobiną soli.
źródło
To właściwie nie jest pytanie. Zgodnie z pakietem protokołów internetowych tcp to protokół w warstwie transportowej, a http to protokół w warstwie aplikacji. Porównujesz ze sobą zupełnie różne rzeczy. (Zobacz więcej tutaj: http://en.wikipedia.org/wiki/Internet_protocol_suite )
W rzeczywistości większość http jest ponad tcp / ip. Aby odpowiedzieć na twoje pytanie, tak, powinieneś użyć tcp / ip. Następnie chcesz dodać protokół warstwy aplikacji (np. Http), a następnie format danych (np. Json, xml, html). Netty pozwala używać http, a protobuff jest równy json, xml, html.
Wszystko zależy od Twoich wymagań i jakiego rodzaju danych będziesz potrzebować do transportu. Czy potrzebujesz sesji w protokole, czy uścisk dłoni może poprawić konfigurację protokołu, ile danych wyślesz jednocześnie, czy potrzebujesz szyfrowania? Oto pytania, na które należy odpowiedzieć przy wyborze protokołu aplikacji.
Wybór formatu reprezentacji danych (json, xml, html, protobuff itp.) Zależy od przepustowości, czytelności, obsługi języka / narzędzi itp.
Nie można porównać http do tcp.
Pamiętaj, że prędkość to nie wszystko. Prędkość jest bezużyteczna, jeśli nie możesz wyrazić siebie w rozsądny sposób.
źródło