نحوه استفاده از App Engine Memcache در برنامه های Flask (ماژول 12)

1. بررسی اجمالی

مجموعه کدهای ایستگاه انتقال بدون سرور (آموزش‌های عملی) و ویدیوهای مرتبط با هدف کمک به توسعه‌دهندگان بدون سرور Google Cloud برای مدرن کردن برنامه‌های خود با هدایت آنها از طریق یک یا چند انتقال، عمدتاً از سرویس‌های قدیمی دور می‌شوند. انجام این کار برنامه های شما را قابل حمل تر می کند و گزینه ها و انعطاف پذیری بیشتری در اختیار شما قرار می دهد و به شما امکان می دهد با طیف وسیع تری از محصولات Cloud ادغام شده و به آنها دسترسی داشته باشید و راحت تر به نسخه های زبان جدیدتر ارتقا دهید. در حالی که در ابتدا بر روی اولین کاربران Cloud، عمدتاً توسعه دهندگان App Engine (محیط استاندارد) تمرکز می شود، این مجموعه به اندازه کافی گسترده است که شامل سایر پلتفرم های بدون سرور مانند Cloud Functions و Cloud Run یا در صورت وجود جاهای دیگر است.

این کد لبه به شما می آموزد که چگونه App Engine Memcache را در برنامه نمونه از ماژول 1 Codelab قرار دهید و از آن استفاده کنید. استفاده از Memcache را در این آموزش ماژول 12 اضافه می کنیم و سپس در ماژول 13 به Cloud Memorystore منتقل می کنیم .

شما یاد خواهید گرفت که چگونه

  • از App Engine Memcache API/library استفاده کنید
  • حافظه پنهان را به یک برنامه پایه پایتون 2 Flask App Engine NDB اضافه کنید

آنچه شما نیاز دارید

نظرسنجی

چگونه از این آموزش استفاده خواهید کرد؟

فقط از طریق آن را بخوانید آن را بخوانید و تمرینات را کامل کنید

تجربه خود را با پایتون چگونه ارزیابی می کنید؟

تازه کار متوسط مسلط

تجربه خود را در استفاده از خدمات Google Cloud چگونه ارزیابی می کنید؟

تازه کار متوسط مسلط

2. پس زمینه

به منظور انتقال از App Engine Memcache، استفاده از آن را به برنامه موجود Flask و App Engine NDB که از ماژول کد ماژول 1 حاصل می‌شود، اضافه کنید. برنامه نمونه ده بازدید اخیر کاربر را نمایش می دهد. اگر همان کاربر مرورگر خود را تازه‌سازی کند، ایجاد پیوسته موجودیت‌های Visit جدید و واکشی جدیدترین بازدیدها از Datastore بهینه نیست، بنابراین ما می‌خواهیم آخرین بازدیدها را کش کنیم.

اگر همان بازدیدکننده به صفحه برخورد کند، آن بازدیدها از حافظه پنهان بازگردانده می‌شوند. اگر کاربر جدیدی از سایت بازدید کند یا یک ساعت گذشته باشد، حافظه پنهان پاک می‌شود و با جدیدترین ورودی‌ها جایگزین می‌شود (بدون ذکر بازدید جدید ثبت‌شده). با اجرای این ادغام App Engine Memcache، می‌توانیم آن را به Cloud Memorystore در آزمایشگاه کد بعدی (ماژول 13) منتقل کنیم.

این آموزش شامل مراحل زیر است:

  1. راه اندازی/پیش کار
  2. پیکربندی را به روز کنید
  3. کد برنامه را تغییر دهید

3. راه اندازی/پیش کار

قبل از اینکه به بخش اصلی آموزش برسیم، بیایید پروژه خود را راه‌اندازی کنیم، کد را دریافت کنیم، سپس برنامه پایه را اجرا کنیم تا بدانیم با کد کار شروع کرده‌ایم.

1. پروژه راه اندازی

اگر آزمایشگاه کد ماژول 1 را تکمیل کرده اید، توصیه می کنیم از همان پروژه (و کد) دوباره استفاده کنید. از طرف دیگر، می توانید یک پروژه کاملاً جدید ایجاد کنید یا از پروژه موجود دیگری استفاده مجدد کنید. مطمئن شوید که پروژه دارای حساب صورتحساب فعال است و App Engine فعال است.

2. برنامه نمونه پایه را دریافت کنید

یکی از پیش نیازهای این Codelab داشتن یک برنامه نمونه کار با ماژول 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. فایل های برنامه را تغییر دهید

از آنجا که ما فقط یک App Engine API را اضافه می کنیم، هیچ بسته خارجی در کار نیست، به این معنی که هیچ فایل پیکربندی ( 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

این همه تغییرات لازم برای افزودن استفاده از App Engine memcache به برنامه نمونه ماژول 1 را به پایان می‌رساند. بیایید این برنامه را بسازیم و اجرا کنیم تا ببینیم کار می کند!

6. خلاصه/پاکسازی

این بخش با استقرار برنامه، این کد را جمع‌بندی می‌کند و تأیید می‌کند که آن‌طور که در نظر گرفته شده و در هر خروجی منعکس‌شده کار می‌کند. پس از تأیید اعتبار برنامه، مراحل پاکسازی را انجام دهید و مراحل بعدی را در نظر بگیرید.

استقرار و تأیید برنامه

برنامه خود را مجدداً با gcloud app deploy اجرا کنید و کارکرد برنامه را تأیید کنید. کد شما اکنون باید با آنچه در FINISH، پوشه ماژول 12 است ، مطابقت داشته باشد. خروجی باید با برنامه ماژول 1 که قبلاً نصب کرده اید یکسان باشد:

a7a9d2b80d706a2b.png

تنها کاری که انجام دادیم این بود که تجربه کاربری را برای همان کاربر تسریع کنیم. وقتی آنها تازه می شوند، باید نتایج را مستقیماً از حافظه پنهان دریافت کنید، که نه بازدید جدیدی ایجاد می کند و نه Datastore واکشی می کند.

برای تکمیل کد ماژول 12 برای افزودن استفاده از سرویس memcache App Engine به برنامه نمونه ما تبریک می گوییم. اکنون این گزینه را دارید که در مرحله جایزه، این برنامه پایتون 2 را به پایتون 3 منتقل کنید.

پاک کن

ژنرال

اگر فعلاً کارتان تمام شده است، توصیه می‌کنیم برنامه App Engine خود را غیرفعال کنید تا از پرداخت صورت‌حساب جلوگیری کنید. با این حال، اگر می‌خواهید بیشتر آزمایش یا آزمایش کنید، پلتفرم App Engine یک سهمیه رایگان دارد، و تا زمانی که از آن سطح استفاده تجاوز نکنید، هزینه‌ای از شما دریافت نمی‌شود. این برای محاسبه است، اما ممکن است هزینه‌هایی برای خدمات App Engine مربوطه نیز وجود داشته باشد، بنابراین صفحه قیمت آن را برای اطلاعات بیشتر بررسی کنید. اگر این انتقال شامل سایر سرویس‌های Cloud باشد، آن‌ها جداگانه صورت‌حساب می‌شوند. در هر صورت، در صورت وجود، بخش «ویژه این کد آزمایشگاه» را در زیر ببینید.

برای افشای کامل، استقرار در یک پلت فرم محاسباتی بدون سرور Google Cloud مانند App Engine هزینه‌های ساخت و ذخیره‌سازی جزئی را متحمل می‌شود. Cloud Build سهمیه رایگان خودش را دارد و Cloud Storage هم دارد. ذخیره سازی آن تصویر مقداری از آن سهمیه را مصرف می کند. با این حال، ممکن است در منطقه‌ای زندگی کنید که چنین سطح رایگانی ندارد، بنابراین برای به حداقل رساندن هزینه‌های احتمالی از میزان استفاده از فضای ذخیره‌سازی خود آگاه باشید. پوشه‌های خاص 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 Datastore توسط Cloud Datastore (Cloud Firestore در حالت Datastore) ارائه می شود که دارای یک ردیف رایگان نیز می باشد. برای اطلاعات بیشتر به صفحه قیمت آن مراجعه کنید.

مراحل بعدی

انتقال منطقی بعدی که باید در نظر بگیرید در ماژول 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 Function وجود دارد. همه آنها را در مخزن مهاجرت پیدا خواهید کرد.

یکی دیگر از مراحل احتمالی انتقال به پایتون 3 است که در بخش بعدی به عنوان یک مرحله اختیاری پوشش داده شده است.

7. جایزه: مهاجرت به پایتون 3

نمای کلی

این بخش شامل محتوای جایزه اختیاری است که برنامه ماژول 12 را که در بالا با آن به پایتون 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 است. هنگامی که خدمات قدیمی App Engine در سال 2021 برای زمان‌های اجرا نسل دوم در دسترس قرار گرفت ، برخی از زمان‌های اجرا، از جمله Python 3، برای دسترسی به آن APIها مانند ndb ، taskqueue و memcache به بوت استرپ اضافی نیاز دارند. این خط در پیکربندی این هدف را دنبال می کند.

به روز رسانی requires.txt

راه‌اندازی دیگری از APIهای اصلی در requirements.txt لازم است: دسترسی به App Engine SDK جدید باید گنجانده شود.

قبل از:

در زیر آنچه در app.yaml در پایان ماژول 12 وجود دارد آمده است:

flask

بعد از:

به سادگی App Engine Python SDK را اضافه کنید و باید موارد زیر را داشته باشید:

flask
appengine-python-standard

appengine_config.py و lib را حذف کنید

نسل بعدی برنامه App Engine استفاده از بسته شخص ثالث را اصلاح می کند:

  • کتابخانه‌های داخلی آنهایی هستند که توسط Google بررسی شده و در سرورهای App Engine در دسترس قرار گرفته‌اند، احتمالاً به این دلیل که حاوی کد C/C++ هستند که توسعه‌دهندگان مجاز به استقرار در فضای ابری نیستند—این‌ها دیگر در زمان‌های اجرا نسل دوم در دسترس نیستند.
  • کپی کردن کتابخانه‌های داخلی (که گاهی اوقات «فروشنده» یا «خود بسته‌بندی» نامیده می‌شود) دیگر در زمان‌های اجرا نسل دوم مورد نیاز نیست. در عوض، آنها باید در requirements.txt فهرست شوند، جایی که سیستم ساخت به طور خودکار آنها را از طرف شما در زمان استقرار نصب می کند.

در نتیجه این تغییرات در مدیریت بسته شخص ثالث، نه فایل appengine_config.py و نه پوشه lib مورد نیاز نیست، بنابراین آنها را حذف کنید. در زمان‌های اجرا نسل دوم، App Engine به‌طور خودکار بسته‌های شخص ثالث فهرست‌شده در requirements.txt را نصب می‌کند. جمع بندی:

  1. بدون کتابخانه شخص ثالث خود همراه یا کپی شده. آنها را در requirements.txt فهرست کنید
  2. بدون pip install در پوشه lib ، به این معنی که دوره پوشه lib وجود ندارد
  3. هیچ فهرستی از کتابخانه های شخص ثالث داخلی (بنابراین بدون بخش libraries ) در app.yaml . آنها را در requirements.txt فهرست کنید
  4. هیچ کتابخانه شخص ثالثی برای ارجاع از برنامه شما به معنای عدم وجود فایل appengine_config.py است

فهرست کردن تمام کتابخانه های شخص ثالث مورد نظر در requirements.txt تنها مورد نیاز توسعه دهنده است.

برای استفاده از App Engine SDK، برنامه را به روز کنید

همانطور که در بالا ذکر شد، برنامه‌های Python 3 برای دسترسی به خدمات همراه App Engine نیاز به تغییراتی دارند:

  1. بسته نرم افزاری SDK Engine App (در requirements.txt )
  2. فعال کردن App Engine SDK (در app.yaml )
  3. قرار دادن شی WSGI (در main.py )

جفت اول در بالا تکمیل شد، بنابراین آخرین نیاز به روز رسانی main.py است.

قبل از:

در زیر Python 2 main.py در پایان ماژول 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

بعد از:

برای پورت پایتون 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

توسعه دهندگان باید این تغییرات را در برنامه های پایتون خود هنگام انتقال از 2.x به 3.x انجام دهند تا به سرویس های همراه دسترسی داشته باشند . اگر از Flask استفاده نمی کنید، نمونه های جنگو و Pyramid نیز در اسناد موجود است. اگر کد پایتون 2 شما یک برنامه وب نیست، در هنگام پورت کردن به پایتون 3 فقط بسته SDK را درج کنید. کد برنامه ما در ابتدا برای کار تحت پایتون 2 و 3 ساخته شده بود، بنابراین نیازی به تغییرات اضافی در سازگاری نیست.

استقرار برنامه

پس از تکمیل تغییرات بالا، می توانید برنامه نمونه به روز شده را مستقر کنید. (هنگام استقرار نسخه Python 3 برنامه شما بر روی نسخه اصلی Python 2 در همان پروژه GCP مشکلی وجود ندارد.) رفتار برنامه باید ثابت بماند. اگر می خواهید برنامه به روز شده خود را با ما مقایسه کنید، به پوشه Module 12b در مخزن مهاجرت مراجعه کنید. برای کسب اطلاعات بیشتر در مورد پشتیبانی از خدمات همراه App Engine در آخرین زمان‌های اجرا مانند Python 3، به اطلاعیه راه‌اندازی ویژگی و همچنین ماژول 17 Codelab مراجعه کنید.

بابت اتمام مرحله جایزه در ماژول 12 تبریک می گویم! همچنین به مستندات مربوط به آماده سازی فایل های پیکربندی برای زمان اجرا پایتون 3 مراجعه کنید. برای مراحل بعدی و پاکسازی، بخش خلاصه/پاکسازی بالا را مرور کنید.

8. منابع اضافی

فهرست زیر منابع اضافی برای توسعه دهندگانی است که این ماژول مهاجرت یا مربوط به آن و همچنین محصولات مرتبط را بررسی می کنند. این شامل مکان‌هایی برای ارائه بازخورد در مورد این محتوا، پیوندهایی به کد، و اسناد مختلفی است که ممکن است برایتان مفید باشد.

مسائل/بازخوردهای Codelab

اگر مشکلی در این کد لبه پیدا کردید، لطفاً قبل از تشکیل پرونده ابتدا مشکل خود را جستجو کنید. پیوندهایی برای جستجو و ایجاد مسائل جدید:

منابع مهاجرت

پیوندهای پوشه‌های مخزن برای ماژول 2 (START) و ماژول 12 (FINISH) را می‌توانید در جدول زیر پیدا کنید. همچنین می‌توانید از مخزن برای همه انتقال‌های نرم‌افزار App Engine که می‌توانید یک فایل ZIP را شبیه‌سازی یا دانلود کنید، دسترسی پیدا کنید.

Codelab

پایتون 2

پایتون 3

ماژول 1

کد

کد (در این آموزش نشان داده نشده است)

ماژول 12 (این آزمایشگاه کد)

کد

کد

مراجع آنلاین

در زیر منابع آنلاینی وجود دارد که ممکن است برای این آموزش مرتبط باشد:

موتور برنامه

Cloud Memorystore و Cloud Datastore

سایر اطلاعات Cloud

ویدئوها

مجوز

این اثر تحت مجوز Creative Commons Attribution 2.0 Generic مجوز دارد.