Laboratorium 5¶
Wykorzystanie przetwarzania opartego o broker wiadomości¶
Podczas ostatniego laboratorium przećwiczyliśmy metody zrównoleglania oparte o wątki i procesy. Pozwalają one uruchamiać kod równolegle w obrębie jednego systemu.
Jedną z najpopularniejszych metod zrównoleglania pozwalającą na użycie wielu maszyn jest przetwarzanie oparte o broker wiadomości (ang. message passing). Pozwala ono na wykonywanie zadań w trybie asynchronicznym, dzięki czemu jest idealnym rozwiązaniem do implementacji architektury opartej o mikroserwisy.
Podstawowe pojęcia
wiadomość - tekstowa porcja informacji przekazywana pomiędzy elementami systemu, najczęściej w formacie JSON
kolejka - lista wiadomości
producent - skrypt który generuje wiadomości i publikuje je do kolejki
konsument - skrypt który przetwarza wiadomości, ściągając je z kolejki
broker wiadomości - system zarządzający kolejkami i przesyłem wiadomości. Najpopularniejsze to RabbitMQ lub Kafka, ale istnieje wiele możliwych rozwiązań
Zalety systemów kolejkowych
łatwość implementacji i mniejsza szansa na popełnienienie błędów niz w podejściu ze współdzieleniem pamięci
działanie w trybie asynchronicznym
możliwość wykorzystania wielu maszyn lub klastrów
możliwość złączenia skryptów w różnych językach
enkapsulacja i izolacja zadań i zasobów
mnogość konfiguracji routingu (np. implementacja wzorca EventBus)
Wady systemów kolejkowych
narzut czasowy i zasobowy na komunikację
Message Passing w Pythonie¶
Najpopularniejszy broker, RabbitMQ, używa do komunikacji protokołu AMQP (ang. Asynchronous Message Queuing Protocol), który jest implementowany przez mnogość bibliotek - np. pika
Polecaną biblioteką do obsługi komunikacji opartej o wiadomości jest Celery. Jest warstwą abstrakcji nad brokerami, umożliwiając w łatwy sposób definiowanie zadań, uruchamianie workerów i kontrolę nad przepływem wiadomości w systemie. Posiada także możliwość wpięcia różnych od RabbitMQ brokerów - np. Redisa, baz SQL, Memcache czy Cassandry. Każdy z nich posiada swoje wady i zalety, jednak ich dokładne zróżnicowanie jest poza zakresem niniejszego laboratorium.
Zadanie 5.1 (4 pkt)¶
Przygotuj środowisko do użycia biblioteki Celery z brokerem wiadomości RabbitMQ. Zbuduj odpowiednie obrazy Dockera i zainstaluj potrzebne paczki
Stwórz task Celery który będzie zwracał losowy numer z przedziału [0; 200]
Uruchom skrypt który wygeneruje asynchronicznie 100 losowych numerów używając w/w taska
Zadanie 5.2 (5 pkt)¶
Stwórz task Celery, który będzie:
a) przyjmował jako parametr numer n
b) pobierał losowy artykuł z polskiej Wikipedii - dostęp pod linkiem https://pl.wikipedia.org/wiki/Special:Random. Użyj odpowiednich bibliotek do scrapowania, by uzyskać samą treść artykułu - np. Requests i BeautifulSoup
c) zwracał n-te
słowo z pobranego artykułu
Zadanie 5.3 (3 pkt)¶
Stwórz task Celery, który będzie:
a) przyjmował jako parametr słowo
b) zapisywał je do pliku tekstowego w formie “poematu” (5 słów per linia)
Pamiętaj o zachowaniu odpowiedniego mechanizmu dostępu do współdzielonego pliku (lock)!
Zadanie 5.4 (1 pkt)¶
Zestaw stworzone wyżej taski w jeden potok przetwarzania i uruchom go. Przeskaluj worker obsługujący task scrapujący artykuły by używał 3 instancji
Zadanie 5.5 (1 pkt)¶
Użyj narzędzia Flower, by monitorować pracę systemu, ilość workerów i stan kolejek