Różnice między wybraną wersją a wersją aktualną.
Both sides previous revision Poprzednia wersja Nowa wersja | Poprzednia wersja | ||
sk2:good_practices [2020/11/10 16:40] jkonczak [Typowe podejścia do odbierania wiadomości] |
sk2:good_practices [2022/11/21 21:52] (aktualna) jkonczak |
||
---|---|---|---|
Linia 18: | Linia 18: | ||
* pamięta w jakim stanie się znajduje | * pamięta w jakim stanie się znajduje | ||
* po przygotowaniu całych wiadomości zwraca je lub wywołuje funkcję do obsługi wiadomości | * po przygotowaniu całych wiadomości zwraca je lub wywołuje funkcję do obsługi wiadomości | ||
- | * <html><small></html>//przykład #1:// funkcja dodaje kolejną porcję do bufora, następnie dopóki w buforze znajdzie znak końca wiadomości usuwa gotową wiadomość z bufora \\ //przykład #2:// funkcja buduje na bieżąco strukturę danych reprezentującą przychodzący json<html></small></html> | + | * <html><small></html>//przykład #1:// funkcja dodaje kolejną porcję do bufora, następnie dopóki w buforze znajdzie znak końca wiadomości usuwa gotową wiadomość z bufora \\ //przykład #2:// funkcja buduje na bieżąco strukturę danych reprezentującą przychodzący json \\ //przykład #3:// funkcja odbiera nazwy, rozmiar i zawartość kolejnych plików i zapisuje je na bieżąco na dysk<html></small></html> |
* dane są odbierane w takich procjach jak przychodzą i są przekazywane powyższej funkcji | * dane są odbierane w takich procjach jak przychodzą i są przekazywane powyższej funkcji | ||
Linia 50: | Linia 50: | ||
- wyślij nieblokująco wszystko co się da (pamiętaj o zwalnianiu pamięci) | - wyślij nieblokująco wszystko co się da (pamiętaj o zwalnianiu pamięci) | ||
- jeśli wysłano wszystko – przestań czekać na zdarzenie zapisu | - jeśli wysłano wszystko – przestań czekać na zdarzenie zapisu | ||
- | * jeśli progam potrzebuje pisać z wielu wątków, potrzeba jest synchronizacja (zamek) na obgługę zapisów | + | * jeśli program potrzebuje pisać z wielu wątków, potrzeba jest synchronizacja (zamek) na obsługę zapisów |
Metoda 2: | Metoda 2: | ||
* dla każdego połączenia trzymany jest wątek do wysyłania, lista wiadomości, zamek i zmienna warunkowa | * dla każdego połączenia trzymany jest wątek do wysyłania, lista wiadomości, zamek i zmienna warunkowa | ||
Linia 82: | Linia 82: | ||
==== Podejście niskopoziomowe / wysokopoziomowe ==== | ==== Podejście niskopoziomowe / wysokopoziomowe ==== | ||
- | Przy programach nie wymagających wysokiej wydajności zwykle szuka się rozwiązań wymagających jak najmniej czasu od programisty - czyli szuka się bibliotek które robią większosć rzeczy za programistę. | + | Przy programach nie wymagających wysokiej wydajności zwykle szuka się rozwiązań wymagających jak najmniej czasu od programisty - czyli szuka się bibliotek które robią większość rzeczy za programistę. |
- | Dla osiągniecia wysokiej wydajności zaleca się korzystanie z wydajnych, zwykle niskopoziomowych mechanizmów - albo bezpośrednio, albo za pomocą bibliotek nastawionych na wydajność (a nie wygodę użytkownika). Takie biblioteki są dostępne na różnym poziome abstrackji, porównaj np. [[https://www.boost.org/doc/libs/release/libs/asio/|boost asio]] i [[https://en.wikipedia.org/wiki/Libevent|libevent]]). | + | Dla osiągnięcia wysokiej wydajności zaleca się korzystanie z wydajnych, zwykle niskopoziomowych mechanizmów - albo bezpośrednio, albo za pomocą bibliotek nastawionych na wydajność (a nie wygodę użytkownika). Takie biblioteki są dostępne na różnym poziome abstrakcji, porównaj np. [[https://www.boost.org/doc/libs/release/libs/asio/|boost asio]] i [[https://en.wikipedia.org/wiki/Libevent|libevent]]). |
Wysokowydajne mechanizmy niskopoziomowe to: | Wysokowydajne mechanizmy niskopoziomowe to: | ||
* Linux: epoll (omawiany na zajęciach) | * Linux: epoll (omawiany na zajęciach) | ||
Linia 96: | Linia 96: | ||
==== Middleware ==== | ==== Middleware ==== | ||
- | Dostępnych też jest wiele //middleware// (warstw pośredniczących) które pozwalają programiście używać sieci bez pisania kodu obsługjącego sieć, np: | + | Dostępnych też jest wiele //middleware// (warstw pośredniczących) które pozwalają programiście używać sieci bez pisania kodu obsługującego sieć, np: |
* [[https://en.wikipedia.org/wiki/Remote_procedure_call|RPC]] / [[https://en.wikipedia.org/wiki/Distributed_object_communication|RMI]] | * [[https://en.wikipedia.org/wiki/Remote_procedure_call|RPC]] / [[https://en.wikipedia.org/wiki/Distributed_object_communication|RMI]] | ||
* [[https://pl.wikipedia.org/wiki/Message_Passing_Interface|MPI]] | * [[https://pl.wikipedia.org/wiki/Message_Passing_Interface|MPI]] | ||
Linia 106: | Linia 106: | ||
Często w komunikacji sieciowej korzysta się z dodatkowych warstw abstrakcji między TCP a wiadomościami aplikacyjnymi do osiągnięcia: | Często w komunikacji sieciowej korzysta się z dodatkowych warstw abstrakcji między TCP a wiadomościami aplikacyjnymi do osiągnięcia: | ||
* bezpieczeństwa (integralności, poufności, autentyczności) wykorzystując [[https://en.wikipedia.org/wiki/Transport_Layer_Security|SSL lub TLS]] | * bezpieczeństwa (integralności, poufności, autentyczności) wykorzystując [[https://en.wikipedia.org/wiki/Transport_Layer_Security|SSL lub TLS]] | ||
- | * kompresję danych (o ile dane dają się kompresować) wykorzystując np. [[https://en.wikipedia.org/wiki/Zlib|deflate, zlib]], [[https://en.wikipedia.org/wiki/LZ4_(compression_algorithm)|lz4]] | + | * kompresji danych (o ile dane dają się kompresować) wykorzystując np. [[https://en.wikipedia.org/wiki/Zlib|deflate, zlib]], [[https://en.wikipedia.org/wiki/LZ4_(compression_algorithm)|lz4]], [[https://en.wikipedia.org/wiki/Zstd|zstd]] |
==== Testowanie ==== | ==== Testowanie ==== |