1. Przegląd
Seria codelabów Serverless Migration Station (samodzielne, praktyczne samouczki) i powiązane z nimi filmy mają na celu pomóc deweloperom usług bezserwerowych Google Cloud w modernizacji aplikacji poprzez przeprowadzenie ich przez co najmniej jedną migrację, głównie z usług starszego typu. Dzięki temu Twoje aplikacje będą bardziej przenośne, a Ty zyskasz więcej opcji i elastyczności, co umożliwi Ci integrację z szerszą gamą usług w chmurze i łatwiejsze przechodzenie na nowsze wersje języka. Chociaż początkowo skupialiśmy się na pierwszych użytkownikach usług w chmurze, głównie na deweloperach App Engine (środowisko standardowe), ta seria jest wystarczająco szeroka, aby obejmować inne platformy bezserwerowe, takie jak Cloud Functions i Cloud Run, lub inne, jeśli ma to zastosowanie.
Z tego ćwiczenia w Codelabs dowiesz się, jak używać zadań push w kolejce zadań App Engine w przykładowej aplikacji z ćwiczenia w Codelabs z modułu 1. Post na blogu i film z modułu 7 uzupełniają ten samouczek, ponieważ zawierają krótkie omówienie treści w nim przedstawionych.
W tym module dodamy użycie zadań push, a następnie przeniesiemy je do Cloud Tasks w module 8, a później do Pythona 3 i Cloud Datastore w module 9. Użytkownicy korzystający z kolejek zadań do zadań typu pull przejdą na Cloud Pub/Sub i powinni zapoznać się z modułami 18–19.
Dowiesz się, jak:
- Korzystanie z interfejsu API kolejki zadań App Engine lub usługi pakietowej
- Dodawanie użycia zadań typu push do podstawowej aplikacji w Pythonie 2 Flask App Engine NDB
Czego potrzebujesz
- projekt Google Cloud z aktywnym kontem rozliczeniowym GCP;
- podstawowe umiejętności w zakresie Pythona,
- Praktyczna znajomość typowych poleceń systemu Linux
- Podstawowa wiedza na temat tworzenia i wdrażania aplikacji App Engine.
- Działająca aplikacja App Engine z modułu 1 (wykonaj ćwiczenia [zalecane] lub skopiuj aplikację z repozytorium).
Ankieta
Jak zamierzasz korzystać z tego samouczka?
Jak oceniasz swoje doświadczenie z Pythonem?
Jak oceniasz korzystanie z usług Google Cloud?
2. Tło
Kolejka zadań App Engine obsługuje zadania push i pull. Aby zwiększyć przenośność aplikacji, zespół Google Cloud zaleca migrację z starszych usług pakietowych, takich jak kolejka zadań, na inne samodzielne usługi w chmurze lub równoważne usługi innych firm.
- Użytkownicy zadań push w kolejce zadań powinni przejść na Cloud Tasks.
- Użytkownicy zadań pull w kolejce zadań powinni przejść na Cloud Pub/Sub.
Migracja zadań typu pull jest omówiona w modułach 18–19, a migracja zadań typu push w modułach 7–9. Aby przeprowadzić migrację z zadań push w kolejce zadań App Engine, dodaj ich użycie do istniejącej aplikacji Flask i App Engine NDB, która powstała w wyniku wykonania ćwiczenia 1. W tej aplikacji nowe wyświetlenie strony rejestruje nową wizytę i wyświetla użytkownikowi najnowsze wizyty. Starsze wizyty nigdy nie są ponownie wyświetlane i zajmują miejsce w magazynie danych, dlatego utworzymy zadanie push, które będzie automatycznie usuwać najstarsze wizyty. W module 8 przeniesiemy tę aplikację z kolejki zadań do Cloud Tasks.
Ten samouczek obejmuje te kroki:
- Konfiguracja/przygotowanie
- Aktualizacja konfiguracji
- Modyfikowanie kodu aplikacji
3. Konfiguracja/przygotowanie
Z tej sekcji dowiesz się, jak:
- Konfigurowanie projektu w chmurze
- Pobieranie przykładowej aplikacji podstawowej
- (Ponowne) wdrażanie i weryfikowanie aplikacji podstawowej
Dzięki tym czynnościom masz pewność, że zaczynasz od działającego kodu.
1. Konfigurowanie projektu
Jeśli masz za sobą ćwiczenie z programowania w module 1, zalecamy ponowne użycie tego samego projektu (i kodu). Możesz też utworzyć zupełnie nowy projekt lub ponownie wykorzystać inny istniejący projekt. Sprawdź, czy projekt ma aktywne konto rozliczeniowe i czy usługa App Engine jest włączona.
2. Pobieranie przykładowej aplikacji podstawowej
Jednym z wymagań wstępnych tego modułu jest działająca aplikacja App Engine z modułu 1: wykonaj moduł 1 (zalecane) lub skopiuj aplikację z modułu 1 z repozytorium. Niezależnie od tego, czy używasz własnego kodu, czy naszego, kod modułu 1 to miejsce, w którym „ZACZNIEMY”. W tym Codelabs znajdziesz instrukcje krok po kroku. Na końcu znajdziesz kod podobny do tego w folderze „FINISH” w repozytorium modułu 7.
- START: Folder modułu 1 (Python 2)
- ZAKOŃCZ: Folder modułu 7 (Python 2)
- Całe repozytorium (do sklonowania lub pobrania pliku ZIP)
Niezależnie od tego, której aplikacji z modułu 1 używasz, folder powinien wyglądać jak poniżej. Może też zawierać folder lib:
$ ls README.md main.py templates app.yaml requirements.txt
3. (Ponowne) wdrażanie aplikacji bazowej
Aby (ponownie) wdrożyć aplikację z modułu 1, wykonaj te czynności:
- Usuń folder
lib, jeśli istnieje, i uruchom polecenie:pip install -t lib -r requirements.txt, aby ponownie wypełnić folderlib. Jeśli masz zainstalowane obie wersje Pythona (2 i 3), może być konieczne użycie poleceniapip2. - Sprawdź, czy narzędzie wiersza poleceń
gcloudzostało zainstalowane i zainicjowane oraz czy znasz sposób jego użycia. - Ustaw projekt w chmurze za pomocą polecenia
gcloud config set projectPROJECT_ID, jeśli nie chcesz wpisywaćPROJECT_IDprzy każdym wydaniu poleceniagcloud. - Wdrażanie przykładowej aplikacji za pomocą
gcloud app deploy - Sprawdź, czy aplikacja Moduł 1 działa zgodnie z oczekiwaniami i wyświetla najnowsze wizyty (jak na ilustracji poniżej).

4. Aktualizacja konfiguracji
Nie trzeba wprowadzać żadnych zmian w standardowych plikach konfiguracyjnych App Engine (app.yaml, requirements.txt, appengine_config.py).
5. Modyfikowanie plików aplikacji
Główny plik aplikacji to main.py, a wszystkie aktualizacje w tej sekcji dotyczą tego pliku. Wprowadziliśmy też niewielką aktualizację szablonu internetowego templates/index.html. Oto zmiany, które należy wprowadzić w tej sekcji:
- Aktualizowanie importów
- Dodawanie zadania push
- Dodawanie modułu obsługi zadań
- Aktualizowanie szablonu internetowego
1. Aktualizowanie importów
Importowanie google.appengine.api.taskqueue powoduje włączenie funkcji kolejki zadań. Wymagane są też niektóre pakiety standardowej biblioteki Pythona:
- Dodajemy zadanie usuwania najstarszych wizyt, więc aplikacja będzie musiała obsługiwać sygnatury czasowe, co oznacza użycie znaków
timeidatetime. - Aby rejestrować przydatne informacje dotyczące wykonywania zadań, potrzebujemy
logging.
Po dodaniu wszystkich tych instrukcji importu kod będzie wyglądać tak jak poniżej:
PRZED:
from flask import Flask, render_template, request
from google.appengine.ext import ndb
PO:
from datetime import datetime
import logging
import time
from flask import Flask, render_template, request
from google.appengine.api import taskqueue
from google.appengine.ext import ndb
2. Dodawanie zadania push (zbieranie danych do zadania, umieszczanie nowego zadania w kolejce)
W dokumentacji kolejki push jest napisane: „Aby przetworzyć zadanie, musisz dodać je do kolejki push. App Engine udostępnia domyślną kolejkę push o nazwie default, która jest skonfigurowana i gotowa do użycia z ustawieniami domyślnymi. Jeśli chcesz, możesz po prostu dodać wszystkie zadania do domyślnej kolejki bez konieczności tworzenia i konfigurowania innych kolejek”. W tym laboratorium używamy kolejki default, aby skrócić czas oczekiwania. Więcej informacji o definiowaniu własnych kolejek push o takich samych lub różnych cechach znajdziesz w dokumentacji tworzenia kolejek push.
Głównym celem tego laboratorium jest dodanie zadania (do default kolejki push), które będzie usuwać z Datastore stare wizyty, które nie są już wyświetlane. Aplikacja podstawowa rejestruje każdą wizytę (GET żądanie do /), tworząc nowy Visit element, a następnie pobiera i wyświetla najnowsze wizyty. Żadne z najstarszych odwiedzin nie będą już wyświetlane ani używane, więc zadanie push usuwa wszystkie odwiedziny starsze niż najstarsze wyświetlane. Aby to osiągnąć, musisz nieco zmienić działanie aplikacji:
- Podczas wysyłania zapytań o najnowsze wizyty zamiast od razu zwracać te wizyty zmodyfikuj aplikację tak, aby zapisywała sygnaturę czasową ostatniej
Visit, najstarszej wyświetlanej wizyty – wszystkie wizyty starsze niż ta można bezpiecznie usunąć. - Utwórz zadanie push z tym sygnaturą czasową jako ładunkiem i skieruj je do modułu obsługi zadań dostępnego przez HTTP
POSTdo/trim. Użyj standardowych narzędzi Pythona, aby przekonwertować sygnaturę czasową Datastore i wysłać ją (jako liczbę zmiennoprzecinkową) do zadania, a także zalogować ją (jako ciąg znaków) i zwrócić ten ciąg znaków jako wartość wartowniczą do wyświetlenia użytkownikowi.
Wszystko to odbywa się w fetch_visits(). Tak wygląda to przed i po wprowadzeniu tych zmian:
PRZED:
def fetch_visits(limit):
return (v.to_dict() for v in Visit.query().order(
-Visit.timestamp).fetch(limit))
PO:
def fetch_visits(limit):
'get most recent visits and add task to delete older visits'
data = Visit.query().order(-Visit.timestamp).fetch(limit)
oldest = time.mktime(data[-1].timestamp.timetuple())
oldest_str = time.ctime(oldest)
logging.info('Delete entities older than %s' % oldest_str)
taskqueue.add(url='/trim', params={'oldest': oldest})
return (v.to_dict() for v in data), oldest_str
3. Dodaj moduł obsługi zadania (kod wywoływany podczas wykonywania zadania)
Usuwanie starych wizyt można było łatwo zrealizować w fetch_visits(), ale pamiętaj, że ta funkcja nie ma wiele wspólnego z użytkownikiem końcowym. Jest to funkcja pomocnicza, która dobrze nadaje się do przetwarzania asynchronicznego poza standardowymi żądaniami aplikacji. Użytkownik końcowy skorzysta na szybszych zapytaniach, ponieważ w magazynie danych będzie mniej informacji. Utwórz nową funkcję trim(), wywoływaną za pomocą żądania kolejki zadań POST do /trim, która wykonuje te czynności:
- Wyodrębnia ładunek sygnatury czasowej „najstarszej wizyty”.
- Wysyła zapytanie do Datastore, aby znaleźć wszystkie encje starsze niż ta sygnatura czasowa.
- Wybiera szybsze zapytanie „tylko klucze”, ponieważ nie są potrzebne żadne rzeczywiste dane użytkownika.
- Rejestruje liczbę elementów do usunięcia (w tym zero).
- Wywołania
ndb.delete_multi()w celu usunięcia wszystkich elementów (pomijane, jeśli nie ma takich elementów). - Zwraca pusty ciąg znaków (wraz z domniemanym kodem zwrotu HTTP 200).
Wszystkie te informacje znajdziesz w sekcji trim() poniżej. Dodaj go do main.py tuż po fetch_visits():
@app.route('/trim', methods=['POST'])
def trim():
'(push) task queue handler to delete oldest visits'
oldest = request.form.get('oldest', type=float)
keys = Visit.query(
Visit.timestamp < datetime.fromtimestamp(oldest)
).fetch(keys_only=True)
nkeys = len(keys)
if nkeys:
logging.info('Deleting %d entities: %s' % (
nkeys, ', '.join(str(k.id()) for k in keys)))
ndb.delete_multi(keys)
else:
logging.info('No entities older than: %s' % time.ctime(oldest))
return '' # need to return SOME string w/200
4. Aktualizowanie szablonu internetowego
Zaktualizuj szablon internetowy templates/index.html za pomocą tego warunku Jinja2, aby wyświetlać najstarszą sygnaturę czasową, jeśli ta zmienna istnieje:
{% if oldest is defined %}
<b>Deleting visits older than:</b> {{ oldest }}</p>
{% endif %}
Dodaj ten fragment kodu po wyświetlonej liście wizyt, ale przed zamknięciem treści, aby szablon wyglądał tak:
<!doctype html>
<html>
<head>
<title>VisitMe Example</title>
<body>
<h1>VisitMe example</h1>
<h3>Last 10 visits</h3>
<ul>
{% for visit in visits %}
<li>{{ visit.timestamp.ctime() }} from {{ visit.visitor }}</li>
{% endfor %}
</ul>
{% if oldest is defined %}
<b>Deleting visits older than:</b> {{ oldest }}</p>
{% endif %}
</body>
</html>
6. Podsumowanie i czyszczenie
W tej sekcji podsumowujemy te warsztaty, wdrażając aplikację i sprawdzając, czy działa zgodnie z oczekiwaniami i czy dane wyjściowe są prawidłowe. Po zweryfikowaniu aplikacji wykonaj czyszczenie i rozważ kolejne kroki.
Wdrażanie i weryfikowanie aplikacji
Wdróż aplikację za pomocą gcloud app deploy. Dane wyjściowe powinny być identyczne z aplikacją z modułu 1, z wyjątkiem nowego wiersza u dołu, w którym wyświetlają się informacje o wizytach, które zostaną usunięte:

Gratulujemy ukończenia ćwiczenia. Kod powinien teraz być zgodny z tym w folderze repozytorium modułu 7. Możesz teraz przejść na Cloud Tasks w module 8.
Czyszczenie danych
Ogólne
Jeśli na razie nie chcesz już korzystać z usługi, zalecamy wyłączenie aplikacji App Engine, aby uniknąć naliczania opłat. Jeśli jednak chcesz przeprowadzić więcej testów lub eksperymentów, platforma App Engine ma bezpłatny limit, więc dopóki nie przekroczysz tego poziomu wykorzystania, nie powinny być naliczane żadne opłaty. Dotyczy to obliczeń, ale mogą też wystąpić opłaty za odpowiednie usługi App Engine, więc więcej informacji znajdziesz na stronie z cennikiem. Jeśli migracja obejmuje inne usługi w chmurze, są one rozliczane oddzielnie. W każdym przypadku, jeśli to konieczne, zapoznaj się z sekcją „Specyficzne dla tego laboratorium” poniżej.
Wdrożenie na bezserwerowej platformie obliczeniowej Google Cloud, takiej jak App Engine, wiąże się z niewielkimi kosztami kompilacji i przechowywania. Cloud Build ma własny bezpłatny limit, podobnie jak Cloud Storage. Przechowywanie tego obrazu wykorzystuje część tego limitu. Możesz jednak mieszkać w regionie, w którym nie ma takiego bezpłatnego pakietu, więc kontroluj wykorzystanie miejsca na dane, aby zminimalizować potencjalne koszty. Sprawdź te „foldery” Cloud Storage:
console.cloud.google.com/storage/browser/LOC.artifacts.PROJECT_ID.appspot.com/containers/imagesconsole.cloud.google.com/storage/browser/staging.PROJECT_ID.appspot.com- Linki do pamięci masowej powyżej zależą od
PROJECT_IDi *LOC*acji, np. „us”, jeśli Twoja aplikacja jest hostowana w Stanach Zjednoczonych.
Jeśli nie zamierzasz kontynuować pracy z tą aplikacją ani innymi powiązanymi z nią samouczkami dotyczącymi migracji i chcesz wszystko całkowicie usunąć, wyłącz projekt.
Dotyczy tych ćwiczeń z programowania
Usługi wymienione poniżej są dostępne tylko w tym laboratorium. Więcej informacji znajdziesz w dokumentacji poszczególnych usług:
- Usługa kolejki zadań App Engine nie generuje dodatkowych opłat zgodnie z cennikiem starszych pakietów usług, takich jak kolejka zadań.
- Usługa App Engine Datastore jest udostępniana przez Cloud Datastore (Cloud Firestore w trybie Datastore), która również ma bezpłatny poziom. Więcej informacji znajdziesz na stronie z cennikiem.
Dalsze kroki
W ramach tej „migracji” dodaliśmy do przykładowej aplikacji z modułu 1 użycie kolejki push Task Queue, co umożliwiło śledzenie odwiedzających. W ten sposób powstała przykładowa aplikacja z modułu 7. Z kolejnej migracji dowiesz się, jak w razie potrzeby przejść z zadań push App Engine na Cloud Tasks. Jesienią 2021 r. użytkownicy nie musieli już migrować do Cloud Tasks podczas uaktualniania do Pythona 3. Więcej informacji na ten temat znajdziesz w następnej sekcji.
Jeśli chcesz przejść na Cloud Tasks, następny jest samouczek z modułu 8. Oprócz tego warto rozważyć dodatkowe migracje, takie jak Cloud Datastore, Cloud Memorystore, Cloud Storage czy Cloud Pub/Sub (kolejki pobierania). Istnieją też migracje między usługami do Cloud Run i Cloud Functions. Cała zawartość Serverless Migration Station (ćwiczenia z programowania, filmy, kod źródłowy [jeśli jest dostępny]) jest dostępna w repozytorium open source.
7. Migracja do Pythona 3
Jesienią 2021 r. zespół App Engine rozszerzył obsługę wielu usług pakietowych na środowiska wykonawcze 2 generacji (pierwotnie dostępne tylko w środowiskach wykonawczych 1 generacji), co oznacza, że podczas przenoszenia aplikacji do Pythona 3 nie musisz już migrować z usług pakietowych, takich jak kolejka zadań App Engine, do samodzielnych usług Cloud lub odpowiedników innych firm, takich jak Cloud Tasks. Innymi słowy, możesz nadal używać kolejki zadań w aplikacjach App Engine w Pythonie 3, o ile dostosujesz kod, aby uzyskać dostęp do usług pakietowych ze środowisk wykonawczych nowej generacji.
Więcej informacji o przenoszeniu korzystania z usług pakietowych do Pythona 3 znajdziesz w ćwiczeniu programistycznym w module 17 i odpowiednim filmie. Ten temat wykracza poza zakres modułu 7, ale poniżej znajdziesz wersje aplikacji z modułów 1 i 7 w języku Python 3, które nadal korzystają z NDB App Engine i kolejki zadań.
8. Dodatkowe materiały
Poniżej znajdziesz dodatkowe materiały dla programistów, którzy chcą dowiedzieć się więcej o tym lub powiązanym module migracji, a także o powiązanych produktach. Znajdziesz tu m.in. miejsca, w których możesz przesłać opinię o tych treściach, linki do kodu i różne dokumenty, które mogą Ci się przydać.
Problemy z ćwiczeniami z programowania i opinie na ich temat
Jeśli zauważysz jakieś problemy z tym kursem, najpierw poszukaj rozwiązania, a dopiero potem zgłoś problem. Linki do wyszukiwania i tworzenia nowych problemów:
Materiały dotyczące migracji
Linki do folderów repozytorium dla modułu 2 (START) i modułu 7 (FINISH) znajdziesz w tabeli poniżej.
Ćwiczenia z programowania | Python 2 | Python 3 |
kod (nie jest omawiany w tym samouczku) | ||
Moduł 7 (te ćwiczenia z programowania) | kod (nie jest omawiany w tym samouczku) |
Zasoby online
Poniżej znajdziesz zasoby online, które mogą być przydatne w tym samouczku:
Kolejka zadań App Engine
- Omówienie kolejki zadań App Engine
- Omówienie kolejek push w kolejce zadań App Engine
- Tworzenie kolejek push w Task Queue
queue.yamlźródło informacjiqueue.yamla Cloud Tasks- Przewodnik po migracji kolejek push do Cloud Tasks
- Przykładowa dokumentacja przenoszenia kolejek push z kolejek zadań App Engine do Cloud Tasks
Platforma App Engine
- Dokumentacja App Engine
- Środowisko wykonawcze App Engine (środowisko standardowe) w Pythonie 2
- Korzystanie z wbudowanych bibliotek App Engine w App Engine w Pythonie 2
- Środowisko wykonawcze Pythona 3 w App Engine (środowisko standardowe)
- Różnice między środowiskami wykonawczymi App Engine (środowisko standardowe) w Pythonie 2 i 3
- Przewodnik po migracji z App Engine (środowisko standardowe) z Pythona 2 na Pythona 3
- Informacje o cenach i limitach App Engine
- Uruchomienie platformy App Engine drugiej generacji (2018)
- Porównanie platform pierwszej i drugiej generacji
- Wsparcie długoterminowe dla starszych środowisk wykonawczych
- Przykłady migracji dokumentacji
- Przykłady migracji stworzone przez społeczność
Inne informacje o chmurze
- Python w Google Cloud Platform
- Biblioteki klienta Google Cloud Python
- Poziom „Zawsze bezpłatny” w Google Cloud
- Google Cloud SDK (narzędzie wiersza poleceń
gcloud) - Cała dokumentacja Google Cloud
Filmy
- Serverless Migration Station
- Ekspedycje bezserwerowe
- Subskrybuj Google Cloud Tech
- Subskrybuj Google Developers
Licencja
To zadanie jest licencjonowane na podstawie ogólnej licencji Creative Commons Attribution 2.0.