نحوه استفاده از App Engine Task Queue (کشش وظایف) در برنامه های Flask (ماژول 18)

۱. مرور کلی

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

این آزمایشگاه کد به شما آموزش می‌دهد که چگونه وظایف pull مربوط به App Engine Task Queue را به برنامه نمونه از آزمایشگاه کد ماژول ۱ اضافه و استفاده کنید. ما نحوه استفاده از وظایف pull را در این آموزش ماژول ۱۸ اضافه می‌کنیم، سپس آن استفاده را در ماژول ۱۹ به Cloud Pub/Sub منتقل می‌کنیم. کسانی که از Task Queues برای وظایف push استفاده می‌کنند، به Cloud Tasks مهاجرت می‌کنند و باید به ماژول‌های ۷ تا ۹ مراجعه کنند.

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

  • از API/سرویس همراه App Engine Task Queue استفاده کنید
  • اضافه کردن استفاده از صف کشش به یک برنامه پایه Python 2 Flask App Engine NDB

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

نظرسنجی

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

فقط تا انتها بخوانید آن را بخوانید و تمرین‌ها را انجام دهید

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

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

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

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

۲. پیشینه

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

اگرچه می‌توانیم از وظایف ارسالی برای این تعداد بازدیدکنندگان استفاده کنیم، اما می‌خواهیم مسئولیت را بین برنامه نمونه که وظیفه آن ثبت بازدیدها و پاسخ فوری به کاربران است، و یک "کارگر" تعیین‌شده که وظیفه آن جمع‌بندی تعداد بازدیدکنندگان خارج از گردش کار معمول درخواست-پاسخ است، تقسیم کنیم.

برای پیاده‌سازی این طراحی، ما در حال اضافه کردن استفاده از صف‌های pull به برنامه اصلی و همچنین پشتیبانی از عملکرد worker هستیم. worker می‌تواند به عنوان یک فرآیند جداگانه (مانند یک نمونه backend یا کدی که روی یک ماشین مجازی که همیشه روشن است اجرا می‌شود)، یک cron job یا یک درخواست HTTP خط فرمان اولیه با استفاده از curl یا wget اجرا شود. پس از این ادغام، می‌توانید برنامه را در codelab بعدی (ماژول 19) به Cloud Pub/Sub منتقل کنید.

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

  1. راه‌اندازی/پیش‌پردازش
  2. پیکربندی را به‌روزرسانی کنید
  3. اصلاح کد برنامه

۳. تنظیمات/پیش‌پردازش

این بخش توضیح می‌دهد که چگونه:

  1. پروژه ابری خود را راه‌اندازی کنید
  2. دریافت برنامه نمونه پایه
  3. (دوباره)استقرار و اعتبارسنجی برنامه پایه

این مراحل تضمین می‌کنند که شما با کدی کارامد شروع می‌کنید.

۱. پروژه راه‌اندازی

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

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

یکی از پیش‌نیازهای این آزمایشگاه کد، داشتن یک برنامه ماژول ۱ App Engine است که کار کند. آزمایشگاه کد ماژول ۱ (توصیه می‌شود) را تکمیل کنید یا برنامه ماژول ۱ را از مخزن کپی کنید. چه از کد خودتان استفاده کنید و چه از کد ما، کد ماژول ۱ جایی است که ما "شروع" می‌کنیم. این آزمایشگاه کد شما را در هر مرحله راهنمایی می‌کند و با کدی که شبیه کد موجود در پوشه "FINISH" مخزن ماژول ۱۸ است، به پایان می‌رساند.

صرف نظر از اینکه از کدام برنامه ماژول ۱ استفاده می‌کنید، پوشه باید مانند خروجی زیر باشد، احتمالاً با یک پوشه lib نیز:

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

۳. (دوباره) استقرار برنامه پایه

برای استقرار برنامه ماژول ۱، مراحل زیر را اجرا کنید:

  1. اگر پوشه lib وجود دارد، آن را حذف کنید و pip install -t lib -r requirements.txt را برای پر کردن مجدد lib اجرا کنید. اگر پایتون ۲ و ۳ را نصب کرده‌اید، ممکن است لازم باشد از دستور pip2 استفاده کنید.
  2. مطمئن شوید که ابزار خط فرمان gcloud را نصب و راه‌اندازی اولیه کرده‌اید و نحوه‌ی استفاده از آن را بررسی کرده‌اید.
  3. اگر نمی‌خواهید PROJECT_ID خود را با هر دستور gcloud وارد کنید، پروژه Cloud خود را با gcloud config set project PROJECT_ID تنظیم کنید.
  4. برنامه نمونه را با gcloud app deploy مستقر کنید
  5. تأیید کنید که برنامه ماژول ۱ طبق انتظار اجرا می‌شود و آخرین بازدیدها را نمایش می‌دهد (در زیر نشان داده شده است)

a7a9d2b80d706a2b.png

۴. به‌روزرسانی پیکربندی

هیچ تغییری در فایل‌های پیکربندی استاندارد App Engine ( app.yaml ، requirements.txt ، appengine_config.py ) لازم نیست. در عوض، یک فایل پیکربندی جدید به queue.yaml با محتوای زیر اضافه کنید و آن را در همان دایرکتوری سطح بالا قرار دهید:

queue:
- name: pullq
  mode: pull

فایل queue.yaml تمام صف‌های وظیفه موجود برای برنامه شما را مشخص می‌کند (به جز صف default [push] که به طور خودکار توسط App Engine ایجاد می‌شود). در این حالت، فقط یک صف وجود دارد، یک صف pull به نام pullq . App Engine نیاز دارد که دستورالعمل mode به صورت pull مشخص شود، در غیر این صورت به طور پیش‌فرض یک صف push ایجاد می‌کند. برای کسب اطلاعات بیشتر در مورد ایجاد صف‌های pull به مستندات مراجعه کنید. همچنین برای گزینه‌های دیگر به صفحه مرجع queue.yaml مراجعه کنید.

این فایل را جدا از برنامه خود مستقر کنید. شما همچنان gcloud app deploy استفاده خواهید کرد، اما queue.yaml نیز در خط فرمان ارائه خواهید داد:

$ gcloud app deploy queue.yaml
Configurations to update:

descriptor:      [/tmp/mod18-gaepull/queue.yaml]
type:            [task queues]
target project:  [my-project]

WARNING: Caution: You are updating queue configuration. This will override any changes performed using 'gcloud tasks'. More details at
https://cloud.google.com/tasks/docs/queue-yaml

Do you want to continue (Y/n)?

Updating config [queue]...⠹WARNING: We are using the App Engine app location (us-central1) as the default location. Please use the "--location" flag if you want to use a different location.
Updating config [queue]...done.

Task queues have been updated.

Visit the Cloud Platform Console Task Queues page to view your queues and cron jobs.
$

۵. کد برنامه را تغییر دهید

این بخش شامل به‌روزرسانی فایل‌های زیر است:

  • main.py - استفاده از صف‌های pull را به برنامه اصلی اضافه می‌کند.
  • templates/index.html — قالب وب را برای نمایش داده‌های جدید به‌روزرسانی می‌کند

واردات و ثابت‌ها

اولین قدم اضافه کردن یک import جدید و چندین ثابت برای پشتیبانی از صف‌های pull است:

  • یک فایل ایمپورت از کتابخانه Task Queue، google.appengine.api.taskqueue ، اضافه کنید.
  • سه ثابت اضافه کنید تا از اجاره حداکثر تعداد وظایف pull ( TASKS ) به مدت یک ساعت ( HOUR ) از صف pull ما ( QUEUE ) پشتیبانی کند.
  • یک ثابت برای نمایش جدیدترین بازدیدها و همچنین بازدیدکنندگان برتر ( LIMIT ) اضافه کنید.

در زیر کد اصلی و نحوه نمایش آن پس از اعمال این به‌روزرسانی‌ها آمده است:

قبل از:

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 taskqueue
from google.appengine.ext import ndb

HOUR = 3600
LIMIT = 10
TASKS = 1000
QNAME = 'pullq'
QUEUE = taskqueue.Queue(QNAME)
app = Flask(__name__)

اضافه کردن یک وظیفه pull (جمع‌آوری داده‌ها برای وظیفه و ایجاد وظیفه در صف pull)

مدل داده Visit و همچنین کوئری زدن برای نمایش بازدیدها در fetch_visits() بدون تغییر باقی می‌ماند. تنها تغییر مورد نیاز در این بخش از کد، در store_visit() است. علاوه بر ثبت بازدید، یک وظیفه به صف pull با آدرس IP بازدیدکننده اضافه کنید تا worker بتواند شمارنده بازدیدکننده را افزایش دهد.

قبل از:

class Visit(ndb.Model):
    'Visit entity registers visitor IP address & timestamp'
    visitor   = ndb.StringProperty()
    timestamp = ndb.DateTimeProperty(auto_now_add=True)

def store_visit(remote_addr, user_agent):
    'create new Visit entity in Datastore'
    Visit(visitor='{}: {}'.format(remote_addr, user_agent)).put()

def fetch_visits(limit):
    'get most recent visits'
    return Visit.query().order(-Visit.timestamp).fetch(limit)

بعد از:

class Visit(ndb.Model):
    'Visit entity registers visitor IP address & timestamp'
    visitor   = ndb.StringProperty()
    timestamp = ndb.DateTimeProperty(auto_now_add=True)

def store_visit(remote_addr, user_agent):
    'create new Visit in Datastore and queue request to bump visitor count'
    Visit(visitor='{}: {}'.format(remote_addr, user_agent)).put()
    QUEUE.add(taskqueue.Task(payload=remote_addr, method='PULL'))

def fetch_visits(limit):
    'get most recent visits'
    return Visit.query().order(-Visit.timestamp).fetch(limit)

ایجاد مدل داده و تابع پرس و جو برای ردیابی بازدیدکنندگان

یک مدل داده VisitorCount برای ردیابی بازدیدکنندگان اضافه کنید؛ این مدل باید فیلدهایی برای خود visitor و همچنین یک counter عدد صحیح برای ردیابی تعداد بازدیدها داشته باشد. سپس یک تابع جدید (به عنوان جایگزین، می‌تواند یک classmethod پایتون باشد) به نام fetch_counts() اضافه کنید تا بازدیدکنندگان برتر را به ترتیب از بیشترین به کمترین جستجو کرده و برگرداند. کلاس و تابع را درست زیر بدنه fetch_visits() اضافه کنید:

class VisitorCount(ndb.Model):
    visitor = ndb.StringProperty(repeated=False, required=True)
    counter = ndb.IntegerProperty()

def fetch_counts(limit):
    'get top visitors'
    return VisitCount.query().order(-VisitCount.counter).fetch(limit)

اضافه کردن کد کارگر

یک تابع جدید log_visitors() برای ثبت بازدیدکنندگان از طریق یک درخواست GET به /log اضافه کنید. این تابع از یک دیکشنری/هش برای ردیابی جدیدترین تعداد بازدیدکنندگان استفاده می‌کند و تا حد امکان وظایف زیادی را برای یک ساعت اجاره می‌کند. برای هر وظیفه، تمام بازدیدهای یک بازدیدکننده را شمارش می‌کند. با در دست داشتن این شمارش‌ها، برنامه سپس تمام موجودیت‌های VisitorCount مربوطه را که از قبل در Datastore وجود دارند، به‌روزرسانی می‌کند یا در صورت نیاز موجودیت‌های جدیدی ایجاد می‌کند. در مرحله آخر، یک پیام متنی ساده برمی‌گرداند که نشان می‌دهد از بین وظایف پردازش شده، چند بازدیدکننده ثبت شده‌اند. این تابع را درست زیر fetch_counts() به main.py اضافه کنید:

@app.route('/log')
def log_visitors():
    'worker processes recent visitor counts and updates them in Datastore'
    # tally recent visitor counts from queue then delete those tasks
    tallies = {}
    tasks = QUEUE.lease_tasks(HOUR, TASKS)
    for task in tasks:
        visitor = task.payload
        tallies[visitor] = tallies.get(visitor, 0) + 1
    if tasks:
        QUEUE.delete_tasks(tasks)

    # increment those counts in Datastore and return
    for visitor in tallies:
        counter = VisitorCount.query(VisitorCount.visitor == visitor).get()
        if not counter:
            counter = VisitorCount(visitor=visitor, counter=0)
            counter.put()
        counter.counter += tallies[visitor]
        counter.put()
    return 'DONE (with %d task[s] logging %d visitor[s])\r\n' % (
            len(tasks), len(tallies))

به‌روزرسانی کنترل‌کننده اصلی با داده‌های نمایشی جدید

برای نمایش بازدیدکنندگان برتر، تابع root() را به‌روزرسانی کنید تا تابع fetch_counts() فراخوانی کند. علاوه بر این، قالب به‌روزرسانی می‌شود تا تعداد بازدیدکنندگان برتر و جدیدترین بازدیدها را نشان دهد. تعداد بازدیدکنندگان را به همراه جدیدترین بازدیدها از فراخوانی تابع fetch_visits() بسته‌بندی کنید و آن را در یک context واحد قرار دهید تا به قالب وب منتقل شود. در زیر کد قبل و بعد از اعمال این تغییر آمده است:

قبل از:

@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'
    store_visit(request.remote_addr, request.user_agent)
    context = {
        'limit':  LIMIT,
        'visits': fetch_visits(LIMIT),
        'counts': fetch_counts(LIMIT),
    }
    return render_template('index.html', **context)

اینها همه تغییرات مورد نیاز main.py هستند، و در اینجا یک نمایش تصویری از این به‌روزرسانی‌ها برای اهداف توضیحی آورده شده است تا ایده کلی از تغییراتی که در main.py ایجاد می‌کنید، به شما ارائه دهد:

ad5fd3345efc13d0.png

قالب وب را با داده‌های نمایشی جدید به‌روزرسانی کنید

templates/index.html برای نمایش بازدیدکنندگان برتر علاوه بر بار داده معمول جدیدترین بازدیدکنندگان، نیاز به به‌روزرسانی دارد. بازدیدکنندگان برتر و تعداد آنها را در جدولی در بالای صفحه قرار دهید و مانند قبل به رندر کردن جدیدترین بازدیدها ادامه دهید. تنها تغییر دیگر، تعیین عدد نمایش داده شده از طریق متغیر limit به جای کدنویسی دقیق عدد است. در اینجا به‌روزرسانی‌هایی که باید در قالب وب خود انجام دهید، آورده شده است:

قبل از:

<!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>

بعد از:

<!doctype html>
<html>
<head>
<title>VisitMe Example</title>
<body>

<h1>VisitMe example</h1>

<h3>Top {{ limit }} visitors</h3>
<table border=1 cellspacing=0 cellpadding=2>
    <tr><th>Visitor</th><th>Visits</th></tr>
{% for count in counts %}
    <tr><td>{{ count.visitor|e }}</td><td align="center">{{ count.counter }}</td></tr>
{% endfor %}
</table>

<h3>Last {{ limit }} visits</h3>
<ul>
{% for visit in visits %}
    <li>{{ visit.timestamp.ctime() }} from {{ visit.visitor }}</li>
{% endfor %}
</ul>

این پایان تغییرات لازم است که استفاده از وظایف کشیدن صف وظایف App Engine را به برنامه نمونه ماژول 1 اضافه می‌کند. اکنون دایرکتوری شما نشان‌دهنده برنامه نمونه ماژول 18 است و باید شامل این فایل‌ها باشد:

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

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

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

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

مطمئن شوید که صف دریافت خود را از قبل تنظیم کرده‌اید، همانطور که در ابتدای این کد با gcloud app deploy queue.yaml انجام دادیم. اگر این کار تکمیل شده و برنامه نمونه شما آماده استفاده است، برنامه خود را با gcloud app deploy مستقر کنید. خروجی باید مشابه برنامه ماژول ۱ باشد، با این تفاوت که اکنون یک جدول "بازدیدکنندگان برتر" در بالا دارد:

b667551dcbab1a09.png

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

شما می‌توانید این وظیفه را با فراخوانی /log به روش‌های مختلفی اجرا کنید:

برای مثال، اگر از curl برای ارسال یک درخواست GET به /log استفاده کنید، با توجه به اینکه PROJECT_ID خود را ارائه داده‌اید، خروجی شما به این شکل خواهد بود:

$ curl https://PROJECT_ID.appspot.com/log
DONE (with 1 task[s] logging 1 visitor[s])

تعداد به‌روزرسانی‌شده سپس در بازدید بعدی از وب‌سایت اعمال خواهد شد. همین!

تبریک می‌گویم که این آزمایشگاه کدنویسی را برای افزودن موفقیت‌آمیز سرویس صف کشیدن وظیفه App Engine به برنامه نمونه به پایان رساندید. اکنون برنامه برای مهاجرت به Cloud Pub/Sub، Cloud NDB و پایتون ۳ در ماژول ۱۹ آماده است.

تمیز کردن

عمومی

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

برای روشن شدن کامل موضوع، استقرار در یک پلتفرم محاسباتی بدون سرور 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 *ation شما بستگی دارند، برای مثال، اگر برنامه شما در ایالات متحده میزبانی می‌شود، " us " خواهد بود.

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

مخصوص این آزمایشگاه کد

سرویس‌های ذکر شده در زیر مختص این codelab هستند. برای اطلاعات بیشتر به مستندات هر محصول مراجعه کنید:

مراحل بعدی

در این «مهاجرت»، شما با افزودن پشتیبانی برای ردیابی بازدیدکنندگان، استفاده از صف ارسال Task Queue را به برنامه نمونه ماژول ۱ اضافه کردید و در نتیجه برنامه نمونه ماژول ۱۸ را پیاده‌سازی کردید. در مهاجرت بعدی، وظایف دریافت App Engine را به Cloud Pub/Sub ارتقا خواهید داد. از اواخر سال ۲۰۲۱، کاربران دیگر نیازی به مهاجرت به Cloud Pub/Sub هنگام ارتقا به پایتون ۳ ندارند. در بخش بعدی درباره این موضوع بیشتر بخوانید.

برای مهاجرت به Cloud Pub/Sub، به ماژول ۱۹ codelab مراجعه کنید. فراتر از آن، مهاجرت‌های دیگری نیز باید در نظر گرفته شوند، مانند Cloud Datastore، Cloud Memorystore، Cloud Storage یا Cloud Tasks (صف‌های ارسال). همچنین مهاجرت‌های بین محصولی به Cloud Run و Cloud Functions نیز وجود دارد. به تمام محتوای Serverless Migration Station (آزمایشگاه‌های کد، ویدیوها، کد منبع [در صورت وجود]) می‌توان در مخزن متن‌باز آن دسترسی پیدا کرد.

۷. مهاجرت به پایتون ۳

در پاییز ۲۰۲۱، تیم App Engine پشتیبانی از بسیاری از سرویس‌های همراه را به Runtimeهای نسل دوم (که Runtime نسل اول دارند) گسترش داد . در نتیجه، دیگر نیازی نیست هنگام انتقال برنامه خود به پایتون ۳، از سرویس‌های همراه مانند App Engine Task Queue به سرویس‌های مستقل Cloud یا شخص ثالث مانند Cloud Pub/Sub مهاجرت کنید. به عبارت دیگر، می‌توانید به استفاده از Task Queue در برنامه‌های App Engine پایتون ۳ ادامه دهید، مادامی که کد را برای دسترسی به سرویس‌های همراه از Runtimeهای نسل بعدی، به‌روزرسانی کنید .

می‌توانید در مورد نحوه انتقال استفاده از سرویس‌های همراه به پایتون ۳ در codelab ماژول ۱۷ و ویدیوی مربوطه اطلاعات بیشتری کسب کنید. اگرچه این موضوع خارج از محدوده ماژول ۱۸ است، اما لینک‌های زیر نسخه‌های پایتون ۳ از برنامه ماژول ۱ هستند که به پایتون ۳ منتقل شده‌اند و هنوز از App Engine NDB استفاده می‌کنند. (در مقطعی، نسخه پایتون ۳ از برنامه ماژول ۱۸ نیز در دسترس قرار خواهد گرفت.)

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

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

مشکلات/بازخوردهای Codelab

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

منابع مهاجرت

لینک‌های پوشه‌های مخزن ماژول ۱ (START) و ماژول ۱۸ (FINISH) را می‌توانید در جدول زیر پیدا کنید. همچنین می‌توانید از مخزن تمام مهاجرت‌های Codelab مربوط به App Engine به آنها دسترسی داشته باشید؛ آن را کلون کنید یا یک فایل ZIP دانلود کنید.

کدلب

پایتون ۲

پایتون ۳

ماژول ۱

کد

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

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

کد

ناموجود

مراجع آنلاین

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

صف وظایف موتور برنامه

پلتفرم موتور برنامه

مستندات موتور برنامه

موتور برنامه پایتون ۲ (محیط استاندارد) در زمان اجرا

موتور برنامه پایتون ۳ (محیط استاندارد) در زمان اجرا

تفاوت‌های بین زمان‌های اجرای موتور برنامه پایتون ۲ و ۳ (محیط استاندارد)

راهنمای مهاجرت موتور برنامه پایتون ۲ به ۳ (محیط استاندارد)

اطلاعات قیمت‌گذاری و سهمیه‌بندی موتور برنامه

راه‌اندازی پلتفرم نسل دوم App Engine (۲۰۱۸)

پشتیبانی بلندمدت از ران‌تایم‌های قدیمی

نمونه‌های مهاجرت مستندات

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

ویدیوها

مجوز

این اثر تحت مجوز عمومی Creative Commons Attribution 2.0 منتشر شده است.