Najważniejsze informacje o oprogramowaniu do automatycznego pozyskiwania danych
Istniejące narzędzia do pozyskiwania danych są albo zbyt drogie, albo wymagają specjalistycznych umiejętności. Nasz klient potrzebował rozwiązania, które pozwoliłoby jego klientom uruchamiać projekty pozyskiwania danych bez budowania złożonych systemów wewnętrznych ani zatrudniania specjalistów technicznych.
Celem było zautomatyzowanie procesu, obniżenie kosztów i udostępnienie danych użytkownikom nietechnicznym. Opracowaliśmy wszechstronne narzędzie do pozyskiwania danych, które obsługuje gromadzenie informacji na dużą skalę przy minimalnej konfiguracji.
Wyzwania podczas tworzenia aplikacji do pozyskiwania danych
Nierównomierne obciążenie
Poprzednie rozwiązania scrapingowe nie wykorzystywały zasobów AWS w optymalny sposób. Z powodu niewłaściwej organizacji maszyny wirtualne były obciążone nierównomiernie. Część instancji EC2 pozostawała niewykorzystana, podczas gdy inne były przeciążone. Taki brak równowagi zwiększał koszty, szczególnie przy pracy na dużą skalę.
Dynamiczna treść
Witryny zmieniają formaty, dynamicznie ładują treści i łączą dane ustrukturyzowane z nieustrukturyzowanymi. Jest to problem, chyba że system potrafi dostosowywać się na bieżąco. Opracowaliśmy program do pozyskiwania danych, który przetwarza dynamiczne treści i rozpoznaje wzorce.
Duże obciążenie
Kolejnym problemem było duże obciążenie bazy podczas zapisywania wyników. Gdy zbyt wiele maszyn próbowało jednocześnie zapisywać dane, dochodziło do konfliktów przy aktualizacji tych samych elementów. Zastosowaliśmy Optimistic Locking do kontroli wersji, aby równoległe zapisy nie nadpisywały się wzajemnie.
Architektura tej aplikacji do pozyskiwania danych
Ta aplikacja chmurowa do pozyskiwania danych wykorzystuje architekturę mikroserwisową. Dzięki temu każdy element systemu można aktualizować lub naprawiać bez zakłócania całej operacji. System obejmuje Mediator — aplikację serverless pośredniczącą między Console, czyli używanym przez Ciebie interfejsem internetowym, a usługami backendowymi: WBalancer do rozdzielania zadań, WRegistry do zarządzania workerami i CRepository do wdrażania kodu. Narzędzie do pozyskiwania danych jest zintegrowane z AWS.
Mediator łączy Console z usługami backendowymi. Gdy wysyłasz żądanie przez konsolę tego internetowego narzędzia do gromadzenia danych, Mediator przekazuje je do odpowiedniej usługi i zwraca odpowiedź. Ponieważ działa w modelu serverless, nie musisz zarządzać serwerami bazowymi.
WBalancer (Work Balancer) rozdziela i równoważy wszystkie zadania wykonywane w systemie. Sprawdza dostępne maszyny wirtualne, nazywane NWorkers, i przydziela im małe zadania, czyli chunki. Każda maszyna otrzymuje ilość pracy dopasowaną do bieżącej wydajności. Jeśli maszyna wcześniej zakończy zadania lub zacznie zwalniać, WBalancer przenosi pracę na inne maszyny.
WRegistry (Worker Registry) zarządza cyklem życia NWorkers w systemie. Automatyzuje uruchamianie, wyłączanie i kontrole stanu każdego NWorker, aby był zawsze gotowy do obsługi zadań. Stałe zarządzanie zapobiega przerwom w działaniu i ogranicza przestoje. WRegistry gwarantuje, że niezależnie od zapotrzebowania NWorkers pozostają aktywne i dostępne do wykonania pracy.
CRepository (Code Repository) to aplikacja serverless, w której budowane są specjalistyczne pakiety oprogramowania nazywane obrazami CRunner. Obrazy te wykonują określone zadania. CRepository pobiera standardowy szablon, czyli bazowy obraz CRunner, i dodaje wyspecjalizowane moduły dla konkretnego zadania. Łączy te elementy w kompletny, gotowy do użycia pakiet oprogramowania — obraz Docker. Po zbudowaniu pakietu CRepository wysyła go do NWorkers. Dzięki temu każdy pakiet przeznaczony do konkretnego zadania jest prawidłowo złożony i gotowy do działania.
NWorker to aplikacja C#, która zarządza mniejszymi workerami, nazywanymi CRunners, wewnątrz maszyny wirtualnej. Odpowiada za uruchamianie, zatrzymywanie i sprawdzanie stanu CRunners, czyli programów wykonujących zadania. Dba o prawidłową konfigurację i działanie każdego CRunner. NWorker może jednocześnie zarządzać wieloma CRunners w obrębie jednej maszyny wirtualnej, czyli instancji AWS EC2, dzięki czemu system przetwarza wiele zadań równolegle.
CRunner (Chunk Runner) to aplikacja C# wykonująca zadania. Każdy CRunner otrzymuje określoną pracę, czyli chunk. NWorker nadzoruje CRunner i dba o to, aby uruchomił się prawidłowo, działał bez problemów i zakończył zadanie. W dużych projektach pracę dzieli się na mniejsze chunki, a wiele CRunners wykonuje je jednocześnie. Pozwala to szybciej realizować duże zadania przez równoległe przetwarzanie wielu małych części.
Narzędzia i technologie, których użyliśmy do stworzenia oprogramowania do pozyskiwania danych
C#
Docker
RabbitMQ
AWS
Amplify
AppSync
SNS
Lambda
DynamoDB
Systems Manager
Rezultaty: zautomatyzowane narzędzie do pozyskiwania danych
Stworzyliśmy skalowalne narzędzie oparte na architekturze mikroserwisowej, służące do pozyskiwania danych. Zapewnia ono wszystko, czego potrzebujesz, aby zautomatyzować procesy gromadzenia danych. Oto jego najważniejsze funkcje:
- Biblioteka C#. Dzięki gotowym fragmentom kodu nawet początkujący programiści mogą tworzyć boty do ekstrakcji danych.
- Zarządzanie zasobami. System rozdziela obciążenie między maszyny, zapewniając maksymalną wydajność każdej maszyny wirtualnej.
- Wsadowe przetwarzanie stron internetowych. Narzędzie umożliwia pozyskiwanie wszystkich dostępnych danych z dowolnej liczby źródeł.
- Usługi. Zintegrowana sieć proxy umożliwia korzystanie z wielu adresów IP.
- Zarządzanie projektami. Szczegółowe statystyki i moduły rozliczeniowe pozwalają kontrolować cały proces.