مهاجرت از App Engine Task Queue Push Tasks به Cloud Tasks (ماژول 8)

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

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

هدف از این کد لبه این است که به توسعه دهندگان Python 2 App Engine نشان دهد که چگونه از App Engine Task Queue (وظایف فشاری) به Cloud Tasks مهاجرت کنند. همچنین یک انتقال ضمنی از App Engine NDB به Cloud NDB برای دسترسی به Datastore وجود دارد (که عمدتاً در ماژول 2 پوشش داده شده است).

ما استفاده از وظایف فشار را در ماژول 7 اضافه کردیم، و این استفاده را به وظایف Cloud در اینجا در ماژول 8 منتقل کردیم، سپس به پایتون 3 و فضای ذخیره ابری در ماژول 9 ادامه دادیم. کسانی که از Task Queues برای کارهای کششی استفاده می کنند، به Cloud Pub/Sub مهاجرت می کنند. و در عوض باید به ماژول های 18-19 مراجعه کنید.

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

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

نظرسنجی

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

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

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

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

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

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

2. پس زمینه

App Engine Task Queue از وظایف فشاری و کششی پشتیبانی می کند. برای بهبود قابلیت حمل برنامه، تیم Google Cloud مهاجرت از سرویس‌های همراه قدیمی مانند Task Queue به دیگر سرویس‌های مستقل Cloud یا مشابه شخص ثالث را توصیه می‌کند.

انتقال وظیفه کششی در ماژول های مهاجرت 18-19 پوشش داده شده است در حالی که ماژول های 7-9 بر مهاجرت وظیفه فشاری تمرکز دارند. به منظور مهاجرت از وظایف فشاری App Engine Task Queue، ما استفاده از آن را به برنامه نمونه موجود Python 2 App Engine اضافه کردیم که بازدیدهای صفحه جدید را ثبت می کند و آخرین بازدیدها را نمایش می دهد. ماژول 7 کد لبه یک وظیفه فشاری برای حذف قدیمی‌ترین بازدیدها اضافه می‌کند - آنها دیگر هرگز نشان داده نمی‌شوند، پس چرا باید فضای ذخیره‌سازی بیشتری در Datastore اشغال کنند؟ این کد ماژول 8 همان عملکرد را حفظ می کند اما مکانیسم صف بندی زیربنایی را از وظایف فشاری Task Queue به وظایف Cloud منتقل می کند و همچنین انتقال ماژول 2 را از App Engine NDB به Cloud NDB برای دسترسی به Datastore تکرار می کند.

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

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

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

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

  1. پروژه Cloud خود را راه اندازی کنید
  2. دریافت نمونه برنامه پایه
  3. (دوباره) استقرار و تأیید اعتبار برنامه پایه
  4. خدمات/APIهای جدید Google Cloud را فعال کنید

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

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

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

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

یکی از پیش نیازها یک برنامه موتور اپلیکیشن ماژول 7 است: ماژول 7 را تکمیل کنید (توصیه می شود) یا برنامه ماژول 7 را از مخزن کپی کنید. چه از ما استفاده کنید چه از کد ما، کد ماژول 7 جایی است که ما شروع می کنیم ("START"). این نرم افزار کد شما را در مسیر مهاجرت راهنمایی می کند و با کدی که شبیه آنچه در پوشه مخزن ماژول 8 است ("FINISH") به پایان می رسد.

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

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

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

مراحل زیر را برای استقرار برنامه Module 7 انجام دهید:

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

4aa8a2cb5f527079.png

4. سرویس‌ها/APIهای جدید Google Cloud را فعال کنید

برنامه قدیمی از خدمات همراه App Engine استفاده می‌کرد که نیازی به راه‌اندازی اضافی ندارند، اما سرویس‌های Cloud مستقل این کار را می‌کنند، و برنامه به‌روزرسانی‌شده از Cloud Tasks و Cloud Datastore (از طریق کتابخانه سرویس گیرنده Cloud NDB) استفاده می‌کند. تعدادی از محصولات Cloud دارای سهمیه ردیف "همیشه رایگان" هستند، از جمله App Engine ، Cloud Datastore و Cloud Tasks . تا زمانی که تحت این محدودیت ها بمانید، نباید برای تکمیل این آموزش هزینه ای متحمل شوید. بسته به اولویت شما، APIهای Cloud را می توان از طریق کنسول Cloud یا از خط فرمان فعال کرد.

از کنسول Cloud

به صفحه کتابخانه مدیر API (برای پروژه صحیح) در Cloud Console بروید و APIهای Cloud Datastore و Cloud Tasks را با استفاده از نوار جستجو در وسط صفحه جستجو کنید:

c7a740304e9d35b.png

برای هر API جداگانه روی دکمه فعال کردن کلیک کنید—ممکن است اطلاعات صورتحساب از شما خواسته شود. این نمونه ای است که صفحه کتابخانه Cloud Pub/Sub API را نشان می دهد (API Pub/Sub را برای این Codelab فعال نکنید، فقط Cloud Tasks و Datastore):

1b6c0a2a73124f6b.jpeg

از خط فرمان

در حالی که از نظر بصری آموزنده API های کنسول را فعال می کند، برخی خط فرمان را ترجیح می دهند. gcloud services enable cloudtasks.googleapis.com datastore.googleapis.com :

$ gcloud services enable cloudtasks.googleapis.com datastore.googleapis.com
Operation "operations/acat.p2-aaa-bbb-ccc-ddd-eee-ffffff" finished successfully.

ممکن است اطلاعات صورتحساب از شما خواسته شود. اگر می‌خواهید سایر APIهای Cloud را فعال کنید و می‌خواهید بدانید «URI» آنها چیست، می‌توانید آنها را در پایین صفحه کتابخانه هر API پیدا کنید. به عنوان مثال، pubsub.googleapis.com به عنوان "نام سرویس" در پایین صفحه Pub/Sub درست در بالا مشاهده کنید.

پس از تکمیل مراحل، پروژه شما قادر به دسترسی به APIها خواهد بود. اکنون زمان آن است که برنامه را برای استفاده از آن API ها به روز کنید.

4. پیکربندی را به روز کنید

به‌روزرسانی‌های پیکربندی به صراحت به دلیل استفاده اضافی از کتابخانه‌های سرویس گیرنده Cloud است. صرف نظر از اینکه از کدام یک(های) استفاده می کنید، باید همان تغییرات را در برنامه هایی که از هیچ کتابخانه سرویس گیرنده Cloud استفاده نمی کنند اعمال شود.

الزامات. txt

ماژول 8 استفاده از App Engine NDB و Task Queue را از ماژول 1 با Cloud NDB و Cloud Tasks مبادله می کند. هر دو google-cloud-ndb و google-cloud-tasks به requirements.txt اضافه کنید تا به flask از ماژول 7 بپیوندید:

flask
google-cloud-ndb
google-cloud-tasks

این فایل requirements.txt هیچ شماره نسخه ای ندارد، یعنی آخرین نسخه ها انتخاب شده اند. در صورت بروز هرگونه ناسازگاری، یک شماره نسخه برای قفل کردن نسخه‌های فعال برنامه مشخص کنید.

app.yaml

هنگام استفاده از کتابخانه های سرویس گیرنده Cloud، زمان اجرا Python 2 App Engine به بسته های شخص ثالث خاصی، یعنی grpcio و setuptools نیاز دارد. کاربران پایتون 2 باید کتابخانه‌های داخلی مانند اینها را به همراه نسخه موجود یا «آخرین» در app.yaml فهرست کنند. اگر هنوز بخش libraries ندارید، یکی ایجاد کنید و هر دو کتابخانه را مانند این اضافه کنید:

libraries:
- name: grpcio
  version: latest
- name: setuptools
  version: latest

هنگام مهاجرت برنامه شما ، ممکن است از قبل یک بخش libraries داشته باشد . اگر اینطور است، و grpcio و setuptools وجود ندارند، فقط آنها را به بخش libraries موجود خود اضافه کنید. اکنون app.yaml به روز شده باید به شکل زیر باشد:

runtime: python27
threadsafe: yes
api_version: 1

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

libraries:
- name: grpcio
  version: latest
- name: setuptools
  version: latest

appengine_config.py

فراخوانی google.appengine.ext.vendor.add() در appengine_config.py کتابخانه های شخص ثالث کپی شده (که گاهی اوقات "فروشنده" یا "self-bundling" نامیده می شود) را در lib به برنامه شما متصل می کند. در بالا در app.yaml ، کتابخانه‌های شخص ثالث داخلی را اضافه کرده‌ایم، و آن‌ها به setuptools.pkg_resources.working_set.add_entry() نیاز دارند تا برنامه شما را به بسته‌های داخلی در lib متصل کنند. در زیر ماژول 1 اصلی appengine_config.py و بعد از اینکه ماژول 8 را به روز رسانی کردید آمده است:

قبل از:

from google.appengine.ext import vendor

# Set PATH to your libraries folder.
PATH = 'lib'
# Add libraries installed in the PATH folder.
vendor.add(PATH)

بعد از:

import pkg_resources
from google.appengine.ext import vendor

# Set PATH to your libraries folder.
PATH = 'lib'
# Add libraries installed in the PATH folder.
vendor.add(PATH)
# Add libraries to pkg_resources working set to find the distribution.
pkg_resources.working_set.add_entry(PATH)

شرح مشابهی را می‌توان در اسناد مهاجرت برنامه نیز یافت.

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

این بخش به‌روزرسانی‌های فایل برنامه اصلی، main.py ارائه می‌کند، که جایگزین استفاده از صف‌های فشاری Task Queue موتور برنامه با وظایف Cloud می‌شود. هیچ تغییری در قالب وب، templates/index.html وجود ندارد — هر دو برنامه باید یکسان عمل کنند و داده های یکسانی را نمایش دهند. تغییرات در برنامه اصلی به این چهار "کار" تقسیم می شوند:

  1. به روز رسانی واردات و مقداردهی اولیه
  2. به روز رسانی عملکرد مدل داده (Cloud NDB)
  3. مهاجرت به Cloud Tasks (و Cloud NDB)
  4. به روز رسانی (فشار) کنترل کننده کار

1. به روز رسانی واردات و مقداردهی اولیه

  1. App Engine NDB ( google.appengine.ext.ndb ) و Task Queue ( google.appengine.api.taskqueue ) را به ترتیب با Cloud NDB ( google.cloud.ndb ) و Cloud Tasks ( google.cloud.tasks ) جایگزین کنید.
  2. کتابخانه های سرویس گیرنده ابری نیاز به مقداردهی اولیه و ایجاد "کلینت های API" دارند. آنها را به ترتیب به ds_client و ts_client اختصاص دهید.
  3. در مستندات Task Queue آمده است: "App Engine یک صف فشار پیش‌فرض به نام default ارائه می‌کند که پیکربندی شده و آماده استفاده با تنظیمات پیش‌فرض است." Cloud Tasks یک صف default ارائه نمی‌کند (زیرا یک محصول Cloud مستقل و مستقل از App Engine است)، بنابراین کد جدیدی برای ایجاد یک صف Cloud Tasks با نام default لازم است.
  4. App Engine Task Queue نیازی به تعیین منطقه ندارد زیرا از منطقه ای استفاده می کند که برنامه شما در آن اجرا می شود. با این حال، چون Cloud Tasks اکنون یک محصول مستقل است، به یک منطقه نیاز دارد و آن منطقه باید با منطقه ای که برنامه شما در آن اجرا می شود مطابقت داشته باشد. نام منطقه و شناسه پروژه Cloud برای ایجاد یک "مسیر کاملاً واجد شرایط" به عنوان شناسه منحصر به فرد صف مورد نیاز است.

به روز رسانی هایی که در گلوله سوم و چهارم در بالا توضیح داده شد، بخش عمده ای از ثابت های اضافی و مقداردهی اولیه مورد نیاز را تشکیل می دهند. در "قبل" و "بعد" زیر ببینید و این تغییرات را در بالای main.py انجام دهید.

قبل از:

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

app = Flask(__name__)

بعد از:

from datetime import datetime
import json
import logging
import time
from flask import Flask, render_template, request
from google.cloud import ndb, tasks

app = Flask(__name__)
ds_client = ndb.Client()
ts_client = tasks.CloudTasksClient()

_, PROJECT_ID = google.auth.default()
REGION_ID = 'REGION_ID'    # replace w/your own
QUEUE_NAME = 'default'     # replace w/your own
QUEUE_PATH = ts_client.queue_path(PROJECT_ID, REGION_ID, QUEUE_NAME)

2. به‌روزرسانی عملکرد مدل داده (Cloud NDB)

App Engine NDB و Cloud NDB تقریباً یکسان کار می کنند. هیچ تغییر عمده ای در مدل داده و تابع store_visit() وجود ندارد. تنها تفاوت قابل توجه این است که ایجاد موجودیت Visit در store_visit() اکنون درون یک پایتون with بلوک کپسوله شده است. Cloud NDB مستلزم این است که تمام دسترسی های Datastore در مدیریت زمینه آن کنترل شود، از این رو عبارت with . قطعه کد زیر این تفاوت جزئی را هنگام مهاجرت به Cloud NDB نشان می دهد. این تغییر را اجرا کنید.

قبل از:

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()

بعد از:

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'
    with ds_client.context():
        Visit(visitor='{}: {}'.format(remote_addr, user_agent)).put()

3. مهاجرت به Cloud Tasks (و Cloud NDB)

مهم ترین تغییر در این مهاجرت، زیرساخت های صف بندی زیربنایی را تغییر می دهد. این در تابع fetch_visits() که در آن یک وظیفه (فشار) برای حذف بازدیدهای قدیمی ایجاد شده و برای اجرا در صف قرار می گیرد، انجام می شود. با این حال، عملکرد اصلی ماژول 7 دست نخورده باقی می ماند:

  1. برای آخرین بازدیدها پرس و جو کنید.
  2. به جای بازگرداندن فوری آن بازدیدها، مُهر زمانی آخرین Visit را که قدیمی‌ترین بازدید نمایش‌شده است، ذخیره کنید — حذف همه بازدیدهای قدیمی‌تر از این امن است.
  3. با استفاده از ابزارهای استاندارد پایتون، مهر زمانی را به عنوان یک شناور و یک رشته حذف کنید و از هر دو در ظرفیت های مختلف استفاده کنید، به عنوان مثال، نمایش به کاربر، افزودن به گزارش ها، ارسال به کنترل کننده و غیره.
  4. یک کار فشاری با این مهر زمانی به عنوان بار آن به همراه /trim به عنوان URL ایجاد کنید.
  5. Task handler در نهایت از طریق یک HTTP POST به آن URL فراخوانی می شود.

این گردش کار با قطعه کد "before" نشان داده شده است:

قبل از:

def fetch_visits(limit):
    'get most recent visits & 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 data, oldest_str

در حالی که عملکرد یکسان باقی می ماند، Cloud Tasks به پلت فرم اجرا تبدیل می شود. به روز رسانی های اعمال این تغییر عبارتند از:

  1. پرس و جو Visit را در داخل پایتون with بلوک قرار دهید (تکرار انتقال ماژول 2 به Cloud NDB)
  2. ابرداده وظایف Cloud را ایجاد کنید، از جمله ویژگی‌های مورد انتظار مانند بارگذاری مهر زمانی و URL، اما نوع MIME و رمزگذاری JSON بار را نیز اضافه کنید.
  3. از سرویس گیرنده Cloud Tasks API برای ایجاد کار با ابرداده و نام مسیر کامل صف استفاده کنید.

این تغییرات در fetch_visits() در زیر نشان داده شده است:

بعد از:

def fetch_visits(limit):
    'get most recent visits & add task to delete older visits'
    with ds_client.context():
        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)
    task = {
        'app_engine_http_request': {
            'relative_uri': '/trim',
            'body': json.dumps({'oldest': oldest}).encode(),
            'headers': {
                'Content-Type': 'application/json',
            },
        }
    }
    ts_client.create_task(parent=QUEUE_PATH, task=task)
    return data, oldest_str

4. به روز رسانی (فشار) کنترل کار

عملکرد کنترل وظیفه (فشار) به به روز رسانی های عمده نیاز ندارد. فقط نیاز به اجرا دارد. این برای Task Queue یا Cloud Tasks قابل اجرا است. بنابراین آنها می گویند: "کد رمز است". با این حال برخی تغییرات جزئی وجود دارد :

  1. محموله مهر زمانی به طور کلمه به Task Queue منتقل شد، اما برای وظایف Cloud با JSON کدگذاری شده بود و بنابراین باید پس از ورود با JSON تجزیه شود.
  2. فراخوانی HTTP POST به /trim با Task Queue دارای یک نوع MIME ضمنی از application/x-www-form-urlencoded بود، اما با Cloud Tasks، به صراحت به عنوان application/json تعیین می‌شود، بنابراین روش کمی متفاوت برای استخراج بار وجود دارد.
  3. از مدیر زمینه کلاینت Cloud NDB API (مهاجرت ماژول 2 به Cloud NDB) استفاده کنید.

در زیر قطعات کد قبل و بعد از انجام این تغییرات در task handler، trim() آمده است:

قبل از:

@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

بعد از:

@app.route('/trim', methods=['POST'])
def trim():
    '(push) task queue handler to delete oldest visits'
    oldest = float(request.get_json().get('oldest'))
    with ds_client.context():
        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

هیچ به روز رسانی برای root() handler اصلی برنامه و نه web templates/index.html وجود ندارد.

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

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

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

برنامه خود را با gcloud app deploy اجرا کنید. خروجی باید با برنامه ماژول 7 یکسان باشد، اما متوجه شوید که به محصولی کاملاً متفاوت در صف فشار تغییر کرده اید و برنامه شما را قابل حمل تر از قبل کرده است!

4aa8a2cb5f527079.png

پاک کن

ژنرال

اگر فعلاً کارتان تمام شده است، توصیه می‌کنیم برنامه 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 ".

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

مخصوص این کد لبه

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

  • Cloud Tasks دارای یک لایه رایگان است. برای جزئیات بیشتر به صفحه قیمت آن مراجعه کنید.
  • سرویس App Engine Datastore توسط Cloud Datastore (Cloud Firestore در حالت Datastore) ارائه می شود که دارای یک ردیف رایگان نیز می باشد. برای اطلاعات بیشتر به صفحه قیمت آن مراجعه کنید.

مراحل بعدی

با این کار انتقال ما از وظایف فشاری App Engine Task Queue به Cloud Tasks به پایان می رسد. اگر می‌خواهید به پورت این برنامه به پایتون 3 ادامه دهید و حتی بیشتر از Cloud NDB به Cloud Datastore مهاجرت کنید، ماژول 9 را در نظر بگیرید.

Cloud NDB به طور خاص برای توسعه دهندگان Python 2 App Engine وجود دارد و تجربه کاربری تقریباً یکسانی را ارائه می دهد، اما Cloud Datastore کتابخانه مشتری بومی خود را دارد که برای کاربران غیرApp Engine یا کاربران جدید App Engine (Python 3) ساخته شده است. با این حال، از آنجایی که Cloud NDB برای Python 2 و 3 در دسترس است، هیچ الزامی برای مهاجرت به Cloud Datastore وجود ندارد.

Cloud NDB و Cloud Datastore هر دو به Datastore دسترسی دارند (البته به روش‌های مختلف)، بنابراین تنها دلیلی که می‌خواهید به Cloud Datastore منتقل شوید این است که از قبل برنامه‌های دیگری، به‌ویژه برنامه‌های غیرApp Engine، با استفاده از Cloud Datastore و تمایل به استانداردسازی در یک واحد داشته باشید. کتابخانه مشتری Datastore. این انتقال اختیاری از Cloud NDB به Cloud Datastore نیز به تنهایی (بدون Task Queue یا Cloud Tasks) در ماژول 3 پوشش داده شده است.

فراتر از ماژول‌های 3، 8، و 9، ماژول‌های مهاجرت دیگری که بر دور شدن از سرویس‌های همراه قدیمی App Engine تمرکز دارند عبارتند از:

App Engine دیگر تنها پلتفرم بدون سرور در Google Cloud نیست. اگر یک برنامه App Engine کوچک یا برنامه‌ای دارید که عملکرد محدودی دارد و می‌خواهید آن را به یک میکروسرویس مستقل تبدیل کنید، یا می‌خواهید یک برنامه یکپارچه را به چندین مؤلفه قابل استفاده مجدد تقسیم کنید، اینها دلایل خوبی برای فکر رفتن به Cloud Functions هستند. اگر کانتینری‌سازی بخشی از گردش کار توسعه برنامه شما شده است، به‌ویژه اگر شامل یک خط لوله CI/CD (ادغام پیوسته/تحویل مداوم یا استقرار) باشد، مهاجرت به Cloud Run را در نظر بگیرید. این سناریوها توسط ماژول های زیر پوشش داده می شوند:

  • مهاجرت از App Engine به Cloud Functions: به ماژول 11 مراجعه کنید
  • مهاجرت از App Engine به Cloud Run: به ماژول 4 مراجعه کنید تا برنامه خود را با Docker محفظه کنید، یا ماژول 5 را بدون کانتینر، دانش Docker یا Dockerfile s انجام دهید.

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

صرف نظر از اینکه کدام ماژول مهاجرت را بعدی در نظر می گیرید، تمام محتوای ایستگاه مهاجرت بدون سرور (مجموعه کدها، ویدیوها، کد منبع [در صورت وجود]) را می توان در مخزن منبع باز آن دسترسی داشت. README مخزن همچنین راهنمایی هایی را ارائه می دهد که کدام مهاجرت ها باید در نظر گرفته شود و هر "ترتیب" مربوط به ماژول های مهاجرت.

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

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

مسائل/بازخورد Codelabs

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

منابع مهاجرت

پیوندهای پوشه‌های مخزن برای ماژول 7 (START) و ماژول 8 (FINISH) را می‌توانید در جدول زیر بیابید.

Codelab

پایتون 2

پایتون 3

ماژول 7

کد

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

ماژول 8 (این نرم افزار کد)

کد

(n/a)

منابع آنلاین

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

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

App Engine NDB و Cloud NDB (Datastore)

پلت فرم App Engine

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

ویدیوها

مجوز

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