Как использовать Memcache App Engine в приложениях Flask (модуль 12)

1. Обзор

Серия курсов по кодированию Serverless Migration Station (практические руководства для самостоятельного обучения) и сопутствующие видеоролики призваны помочь бессерверным разработчикам Google Cloud модернизировать свои приложения, помогая им выполнить одну или несколько миграций, в первую очередь отходя от устаревших сервисов. Это сделает ваши приложения более портативными и предоставит вам больше возможностей и гибкости, позволяя интегрироваться с более широким спектром облачных продуктов и получать к ним доступ, а также упростить обновление до более новых языковых версий. Первоначально эта серия ориентирована на самых первых пользователей облака, в первую очередь на разработчиков App Engine (стандартной среды), но эта серия достаточно широка, чтобы включать в себя другие бессерверные платформы, такие как Cloud Functions и Cloud Run , или другие бессерверные платформы, если это применимо.

В этой лаборатории кода вы узнаете, как включить и использовать Memcache App Engine в примере приложения из лаборатории кода модуля 1 . Мы добавляем использование Memcache в этом руководстве Модуля 12, а затем переходим на Cloud Memorystore в Модуле 13.

Вы узнаете, как

  • Используйте API/библиотеку Memcache App Engine.
  • Добавление кэширования в базовое приложение Python 2 Flask App Engine NDB.

Что вам понадобится

Опрос

Как вы будете использовать этот урок?

Прочтите только до конца Прочитайте его и выполните упражнения.

Как бы вы оценили свой опыт работы с Python?

Новичок Средний Опытный

Как бы вы оценили свой опыт использования сервисов Google Cloud?

Новичок Средний Опытный

2. Предыстория

Чтобы перейти с App Engine Memcache, добавьте его использование в существующее приложение Flask и App Engine NDB, полученное в результате работы с кодом модуля 1 . Пример приложения отображает десять последних посещений пользователя. Если один и тот же пользователь обновляет свой браузер, нецелесообразно постоянно создавать новые сущности посещения и получать самые последние посещения из хранилища данных, поэтому мы собираемся кэшировать эти самые последние посещения.

Если тот же посетитель попадает на страницу, эти посещения возвращаются из кеша. Если сайт посещает новый пользователь или прошел час, кэш очищается и заменяется самыми последними записями (не говоря уже о зарегистрированном новом посещении). После реализации интеграции App Engine Memcache мы можем перенести ее в Cloud Memorystore в следующей лаборатории кода (Модуль 13).

Это руководство включает в себя следующие шаги:

  1. Настройка/Предварительная работа
  2. Обновить конфигурацию
  3. Изменить код приложения

3. Настройка/Предварительная работа

Прежде чем мы перейдем к основной части руководства, давайте настроим наш проект, получим код, а затем развернем базовое приложение, чтобы мы знали, что начали с рабочего кода.

1. Проект установки

Если вы завершили лабораторную работу по Модулю 1 , мы рекомендуем повторно использовать тот же проект (и код). Альтернативно вы можете создать новый проект или повторно использовать другой существующий проект. Убедитесь, что у проекта есть активный платежный аккаунт и включен App Engine.

2. Получите базовый образец приложения.

Одним из обязательных условий для этой лаборатории кода является наличие работающего примера приложения Модуля 1. Если у вас его нет, пройдите любое руководство (ссылки выше), прежде чем двигаться дальше. В противном случае, если вы уже знакомы с его содержимым, вы можете просто начать с кода Модуля 1 ниже.

Независимо от того, используете ли вы свой или наш, мы НАЧНЕМ с кода Модуля 1. Эта лаборатория кода проведет вас через каждый шаг, завершая кодом, похожим на тот, что находится в папке репозитория Модуля 11 (FINISH).

Каталог файлов НАЧАЛА Модуля 1 (ваших или наших) должен выглядеть следующим образом:

$ ls
README.md               main.py                 templates
app.yaml                requirements.txt

3. (Повторное) развертывание базового приложения.

Оставшиеся подготовительные шаги, которые необходимо выполнить сейчас:

  1. Повторно ознакомьтесь с инструментом командной строки gcloud
  2. Повторно разверните пример приложения с помощью gcloud app deploy
  3. Убедитесь, что приложение работает на App Engine без проблем.

После того как вы успешно выполнили эти шаги и увидели, что ваше веб-приложение работает (вывод аналогичен приведенному ниже), вы готовы добавить в свое приложение использование кэширования.

a7a9d2b80d706a2b.png

4. Обновить конфигурацию

В стандартные файлы конфигурации App Engine ( app.yaml , requirements.txt , appengine_config.py ) вносить изменения не требуется.

5. Измените файлы приложения.

Поскольку мы добавляем только API App Engine, внешние пакеты не задействуются, а это означает, что файлы конфигурации ( app.yaml , requirements.txt , appengine_config.py ) обновлять не нужно. Существует только один файл приложения — main.py , поэтому все изменения в этом разделе затрагивают только этот файл.

Импорт

Самый важный шаг — импортировать библиотеку Memcache google.appengine.api.memcache . Поскольку мы собираемся кэшировать последние посещения в течение часа, давайте также добавим константу для количества секунд в часе. Ниже показано, как ваш код выглядел раньше и это изменение:

ДО:

from flask import Flask, render_template, request
from google.appengine.ext import ndb

app = Flask(__name__)

ПОСЛЕ:

from flask import Flask, render_template, request
from google.appengine.api import memcache
from google.appengine.ext import ndb

app = Flask(__name__)
HOUR = 3600

Добавьте кэширование с поддержкой Memcache.

Самым значительным изменением является добавление использования кэширования в нашем приложении. Точнее, нам следует кэшировать самые последние посещения, проверять, доступны ли кэшированные посещения, и пытаться максимально использовать кэшированные результаты в соответствии с нашим планом. Вот шаги, которые приложение предпримет для достижения нашей цели:

  1. Установите текущий визит и назовите его visitor
  2. Попытка получить последние visits из кеша.
  3. Если кеш пуст или последний посетитель ( visits[0]['visitor'] ) отличается от текущего visitor : сохраните это самое новое посещение, извлеките самые последние посещения и кешируйте их в течение часа.
  4. Отображение visits пользователя через веб-шаблон

Вот что было до и после этих обновлений:

ДО:

@app.route('/')
def root():
    'main application (GET) handler'
    store_visit(request.remote_addr, request.user_agent)
    visits = fetch_visits(10)
    return render_template('index.html', visits=visits)

ПОСЛЕ:

@app.route('/')
def root():
    'main application (GET) handler'
    # check for (hour-)cached visits
    ip_addr, usr_agt = request.remote_addr, request.user_agent
    visitor = '{}: {}'.format(ip_addr, usr_agt)
    visits = memcache.get('visits')

    # register visit & run DB query if cache empty or new visitor
    if not visits or visits[0]['visitor'] != visitor:
        store_visit(ip_addr, usr_agt)
        visits = list(fetch_visits(10))
        memcache.set('visits', visits, HOUR)  # set() not add()

    return render_template('index.html', visits=visits)

Вот графическое представление внесенных изменений:

b1242503602f7bf0.png

На этом завершаются все необходимые изменения для добавления использования memcache App Engine в пример приложения Модуля 1. Давайте создадим и развернем это приложение, чтобы увидеть, как оно работает!

6. Подведение итогов/очистка

В этом разделе завершается эта лабораторная работа по развертыванию приложения и проверке его работы по назначению и во всех отраженных выходных данных. После проверки приложения выполните все действия по очистке и обдумайте следующие шаги.

Развертывание и проверка приложения

Повторно разверните приложение с помощью gcloud app deploy и убедитесь, что приложение работает. Теперь ваш код должен соответствовать тому, что находится в FINISH, папке модуля 12 . Вывод должен быть идентичен приложению Модуля 1, которое вы развернули ранее:

a7a9d2b80d706a2b.png

Все, что мы сделали, это ускорили взаимодействие с одним и тем же пользователем. Когда они обновляются, вы должны получать результаты непосредственно из кэша, который не создает ни нового посещения, ни выборки из хранилища данных.

Поздравляем с завершением работы над модулем 12 по добавлению использования службы memcache App Engine в наш пример приложения. Теперь у вас есть возможность перенести это приложение Python 2 на Python 3 на бонусном этапе.

Очистить

Общий

Если вы закончили, мы рекомендуем вам отключить приложение App Engine , чтобы избежать выставления счетов. Однако, если вы хотите протестировать или поэкспериментировать еще, на платформе App Engine предусмотрена бесплатная квота , поэтому, пока вы не превысите этот уровень использования, с вас не будет взиматься плата. Это касается вычислений, но за соответствующие службы App Engine также может взиматься плата, поэтому для получения дополнительной информации посетите страницу с ценами . Если эта миграция включает в себя другие облачные службы, они оплачиваются отдельно. В любом случае, если применимо, см. раздел «Специально для этой кодовой лаборатории» ниже.

Для полной информации: развертывание на бессерверной вычислительной платформе Google Cloud, такой как App Engine, требует незначительных затрат на сборку и хранение . Cloud Build имеет собственную бесплатную квоту, как и Cloud Storage . Хранение этого изображения использует часть этой квоты. Однако вы можете жить в регионе, где нет такого уровня бесплатного пользования, поэтому следите за использованием хранилища, чтобы минимизировать потенциальные затраты. Конкретные «папки» облачного хранилища, которые вам следует просмотреть, включают:

  • console.cloud.google.com/storage/browser/LOC.artifacts.PROJECT_ID.appspot.com/containers/images
  • console.cloud.google.com/storage/browser/staging.PROJECT_ID.appspot.com
  • Ссылки на хранилище, указанные выше, зависят от вашего PROJECT_ID и * LOC *ации, например « us », если ваше приложение размещено в США.

С другой стороны, если вы не собираетесь продолжать работу с этим приложением или другими связанными с ним программами миграции и хотите полностью удалить все, закройте свой проект .

Специально для этой кодовой лаборатории

Перечисленные ниже услуги являются уникальными для этой лаборатории кода. Дополнительную информацию см. в документации каждого продукта:

  • Служба App Engine Memcache представлена ​​в двух разных вариантах, каждый из которых имеет свою собственную структуру ценообразования , поэтому вам необходимо отслеживать использование в связи с выставлением счетов.
  • Служба хранилища данных App Engine предоставляется Cloud Datastore (Cloud Firestore в режиме хранилища данных), который также имеет уровень бесплатного пользования; дополнительную информацию см. на странице цен .

Следующие шаги

Следующая логическая миграция, которую следует рассмотреть, описана в модуле 13 , где разработчикам показано, как перейти со службы memcache App Engine на Cloud Memorystore . Все эти миграции не являются обязательными и доступны пользователям, которые хотят предпринять различные шаги для модернизации своих приложений. Сервис Cloud Memorystore представляет собой значительное обновление memcache App Engine по многим причинам:

  • Cloud Memorystore не является бессерверным. Это означает, что вам придется выделить сервер для кэша. Cloud Memorystore также не имеет уровня бесплатного пользования. Оба эти фактора могут оказать существенное влияние на стоимость.
  • Cloud Memorystore поддерживает пару различных базовых механизмов хранения (механизмов кэширования): Redis и Memcached .
  • Cloud Memorystore (для Redis) имеет гораздо более богатый и глубокий набор функций, чем App Engine Memcache.
  • Чтобы использовать Cloud Memorystore, вам необходимо настроить сервер Cloud Memorystore, добавить его в сеть Google Cloud VPC , а затем позволить вашему приложению App Engine использовать эту сеть для связи с вашим сервером Memorystore.

Если вы не чувствуете, что вам нужны все функции, доступные в Cloud Memorystore, или обеспокоены их влиянием на стоимость, вы можете остаться на App Engine Memcache.

Помимо модуля 13 существует множество других возможных миграций, таких как Cloud NDB и Cloud Datastore или Cloud Tasks. Также возможен переход между продуктами в Cloud Run и Cloud Functions. Вы найдете их все в репозитории миграции .

Другим возможным следующим шагом является портирование на Python 3, которое рассматривается в следующем разделе как необязательный шаг.

7. БОНУС: переход на Python 3.

Обзор

Этот раздел содержит дополнительный дополнительный контент, посвященный переносу приложения Модуля 12, с которым мы только что закончили выше, на Python 3. Мы начинаем с настройки, за которой следует приложение.

Упростите app.yaml

Одним из преимуществ среды выполнения Python 3 является то, что app.yaml можно значительно упростить.

ДО:

Ниже показано, что находится в app.yaml в конце Модуля 12:

runtime: python27
threadsafe: yes
api_version: 1

handlers:
- url: /.*
  script: main.app

Поскольку среда выполнения Python 3 требует, чтобы веб-платформы выполняли собственную маршрутизацию, все обработчики маршрутов в app.yaml необходимо изменить на auto . Если статические файлы не обслуживаются, пользователи могут просто удалить весь раздел handlers: Кроме того, как threadsafe , так и api_version устарели .

ПОСЛЕ:

С учетом только что описанных необходимых изменений это замена app.yaml для Python 3:

runtime: python39
app_engine_apis: true

Единственная строка, требующая объяснения, — это app_engine_apis: true . Когда в 2021 году устаревшие сервисы App Engine стали доступны для сред выполнения второго поколения , некоторые среды выполнения, включая Python 3, потребовали дополнительной начальной загрузки для доступа к таким API, как ndb , taskqueue и memcache . Эта строка в конфигурации служит этой цели.

Обновить файл требований.txt

В requirements.txt требуется еще одна загрузка исходных API: необходимо включить доступ к новому SDK App Engine.

ДО:

Ниже показано, что находится в app.yaml в конце Модуля 12:

flask

ПОСЛЕ:

Просто добавьте App Engine Python SDK, и у вас должно быть следующее:

flask
appengine-python-standard

Удалите appengine_config.py и lib.

Среды выполнения App Engine нового поколения обновляют использование сторонних пакетов:

  • Встроенные библиотеки — это те, которые проверены Google и доступны на серверах App Engine, вероятно, потому, что они содержат код C/C++, который разработчикам не разрешается развертывать в облаке — они больше не доступны во средах выполнения 2-го поколения.
  • Копирование невстроенных библиотек (иногда называемое «поставками» или «самобъединением») больше не требуется во средах выполнения 2-го поколения. Вместо этого они должны быть перечислены в requirements.txt , где система сборки автоматически установит их от вашего имени во время развертывания.

В результате этих изменений в управлении сторонними пакетами ни файл appengine_config.py , ни папка lib не нужны, поэтому удалите их. В средах выполнения 2-го поколения App Engine автоматически устанавливает сторонние пакеты, перечисленные в requirements.txt . Подведение итогов:

  1. Никаких самоустанавливающихся или скопированных сторонних библиотек; перечислите их в requirements.txt
  2. Нет pip install в папку lib , что означает отсутствие периода в папке lib
  3. В app.yaml нет списка встроенных сторонних библиотек (поэтому нет раздела libraries ); перечислите их в requirements.txt
  4. Отсутствие сторонних библиотек, на которые можно ссылаться в вашем приложении, означает отсутствие файла appengine_config.py

Перечисление всех желаемых сторонних библиотек в requirements.txt — единственное требование разработчика.

Обновите приложение, чтобы использовать App Engine SDK.

Как упоминалось выше, приложения Python 3 требуют некоторых изменений для доступа к службам App Engine:

  1. Пакет SDK App Engine (в requirements.txt )
  2. Активируйте App Engine SDK (в app.yaml ).
  3. Обернуть объект WSGI (в main.py )

Первая пара была завершена выше, поэтому последнее требование — обновить main.py

ДО:

Ниже приведен файл main.py Python 2 в конце модуля 12:

from flask import Flask, render_template, request
from google.appengine.api import memcache
from google.appengine.ext import ndb

app = Flask(__name__)
HOUR = 3600

ПОСЛЕ:

Для порта Python 3 импортируйте SDK и оберните им объект приложения Flask (оболочку SDK), в результате чего получится следующее:

from flask import Flask, render_template, request
from google.appengine.api import memcache, wrap_wsgi_app
from google.appengine.ext import ndb

app = Flask(__name__)
app.wsgi_app = wrap_wsgi_app(app.wsgi_app)
HOUR = 3600

Разработчикам необходимо внести эти изменения в свои приложения Python при переносе с версии 2.x на 3.x , чтобы получить доступ к встроенным службам . Если вы не используете Flask, в документации также есть примеры Django и Pyramid . Если ваш код Python 2 не является веб-приложением, при портировании на Python 3 будет достаточно просто включить пакет SDK. Код нашего приложения изначально был создан для работы под Python 2 и 3, поэтому никаких дополнительных изменений совместимости не требуется.

Развернуть приложение

После внесения вышеуказанных изменений вы можете развернуть обновленный пример приложения. (При развертывании версии вашего приложения на Python 3 вместо исходной версии Python 2 в том же проекте GCP проблем не возникает.) Поведение приложения должно остаться прежним. Если вам нужно сравнить ваше обновленное приложение с нашим, см. папку «Модуль 12b» в репозитории миграции. Чтобы узнать больше о поддержке встроенных сервисов App Engine в новейших средах выполнения, таких как Python 3, см. объявление о запуске функции , а также лабораторную работу по модулю 17 .

Поздравляем с завершением бонусного этапа Модуля 12! Также смотрите документацию по подготовке файлов конфигурации для среды выполнения Python 3 . Ознакомьтесь с разделом «Сводка/Очистка» выше, чтобы узнать о дальнейших шагах и очистке.

8. Дополнительные ресурсы

Ниже перечислены дополнительные ресурсы для разработчиков, изучающих этот или связанный с ним модуль миграции, а также связанные продукты. Сюда входят места для отзывов об этом контенте, ссылки на код и различная документация, которая может оказаться вам полезной.

Проблемы с Codelab/отзывы

Если вы обнаружите какие-либо проблемы с этой кодовой лабораторией, сначала найдите свою проблему, прежде чем подавать заявку. Ссылки для поиска и создания новых задач:

Миграционные ресурсы

Ссылки на папки репозитория для Модуля 2 (НАЧАЛО) и Модуля 12 (ФИНИШ) можно найти в таблице ниже. Доступ к ним также можно получить из репозитория для всех миграций лабораторий кода App Engine , которые можно клонировать или загрузить в виде ZIP-файла.

Кодлаб

Питон 2

Питон 3

Модуль 1

код

код (не представлен в этом руководстве)

Модуль 12 (это кодовая лаборатория)

код

код

Интернет-ссылки

Ниже приведены онлайн-ресурсы, которые могут иметь отношение к этому руководству:

Механизм приложений

Облачное хранилище памяти и облачное хранилище данных

Другая информация об облаке

Видео

Лицензия

Эта работа распространяется под лицензией Creative Commons Attribution 2.0 Generic License.