วิธีใช้คิวงานของ App Engine (พุลงาน) ในแอป Flask (โมดูล 18)

1. ภาพรวม

ชุดโปรแกรม Codelab สำหรับการย้ายข้อมูลแบบ Serverless (บทแนะนำแบบลงมือทำด้วยตนเอง) และวิดีโอที่เกี่ยวข้องมีจุดประสงค์เพื่อช่วยให้นักพัฒนาแอป Google Cloud Serverless ปรับการดำเนินการให้ทันสมัยได้ด้วยคำแนะนำการย้ายข้อมูลอย่างน้อย 1 รายการ โดยให้ย้ายออกจากบริการเดิมเป็นหลัก การดำเนินการดังกล่าวทำให้แอปพกพาไปได้ทุกที่ รวมถึงมอบตัวเลือกและความยืดหยุ่นที่มากขึ้น ทำให้สามารถผสานรวมและเข้าถึงผลิตภัณฑ์ Cloud ที่หลากหลายยิ่งขึ้น และอัปเกรดเป็นรุ่นภาษาใหม่ๆ ได้ง่ายยิ่งขึ้น แม้ว่าในช่วงแรกจะมุ่งเน้นที่ผู้ใช้ Cloud รุ่นแรกสุด ซึ่งเป็นนักพัฒนา App Engine (สภาพแวดล้อมมาตรฐาน) เป็นหลัก แต่ชุดโซลูชันนี้ก็กว้างพอที่จะรวมแพลตฟอร์มแบบ Serverless อื่นๆ เช่น Cloud Functions และ Cloud Run หรือแพลตฟอร์มอื่นๆ ที่เกี่ยวข้อง

Codelab นี้จะสอนวิธีรวมและใช้งานดึงคิวงานของ App Engine ไปยังแอปตัวอย่างจาก Codelab ของโมดูล 1 เราเพิ่มการใช้งานงานพุลในบทแนะนำของโมดูล 18 นี้ จากนั้นจึงย้ายข้อมูลการใช้งานดังกล่าวไปยัง Cloud Pub/Sub ไปข้างหน้าในโมดูล 19 ผู้ที่ใช้คิวงานสำหรับงานพุชจะย้ายข้อมูลไปยัง Cloud Tasks แทน และควรอ้างอิงโมดูล 7-9 แทน

คุณจะได้เรียนรู้วิธีต่อไปนี้

  • ใช้ API/บริการแพ็กเกจของ App Engine Task Queue
  • เพิ่มการใช้พุลคิวลงในแอป Python 2 Flask App Engine NDB พื้นฐาน

สิ่งที่ต้องมี

แบบสำรวจ

คุณจะใช้บทแนะนำนี้อย่างไร

อ่านเท่านั้น อ่านและทำแบบฝึกหัด

คุณจะให้คะแนนประสบการณ์การใช้งาน Python อย่างไร

มือใหม่ ระดับกลาง ผู้ชำนาญ

คุณจะให้คะแนนความพึงพอใจในการใช้บริการ Google Cloud อย่างไร

มือใหม่ ระดับกลาง ผู้ชำนาญ

2. ข้อมูลเบื้องต้น

หากต้องการย้ายข้อมูลจากงานพุลคิวงานของ App Engine ให้เพิ่มการใช้งานในแอป Flask และ App Engine NDB ที่มีอยู่ซึ่งเกิดจาก Codelab ของโมดูล 1 แอปตัวอย่างจะแสดงการเข้าชมล่าสุดของผู้ใช้ปลายทาง ก็ไม่เป็นไร แต่ก็ยังน่าสนใจอีก ที่จะติดตามผู้เข้าชมเพื่อดูว่าใครเข้ามามากที่สุดด้วย

แม้ว่าเราจะใช้งานแบบพุชเพื่อนับจำนวนผู้เข้าชมได้ แต่เราก็ต้องการแบ่งความรับผิดชอบระหว่างแอปตัวอย่างที่มีหน้าที่ลงทะเบียนการเข้าชมและตอบกลับผู้ใช้ทันที กับ "ผู้ปฏิบัติงาน" ที่ได้รับมอบหมาย มีหน้าที่รวบรวมจำนวนผู้เข้าชมที่อยู่นอกกระบวนการตอบกลับคำขอปกติ

เพื่อนำการออกแบบนี้ไปใช้ เราจะเพิ่มการใช้พุลคิวลงในแอปพลิเคชันหลัก รวมถึงสนับสนุนฟังก์ชันสำหรับผู้ปฏิบัติงาน ผู้ปฏิบัติงานสามารถเรียกใช้เป็นกระบวนการแยกต่างหาก (เช่น อินสแตนซ์แบ็กเอนด์หรือโค้ดที่ทํางานบน VM ที่อัปเดตอยู่เสมอ) งาน cron หรือคำขอ HTTP บรรทัดคำสั่งพื้นฐานโดยใช้ curl หรือ wget หลังจากการผสานรวมนี้แล้ว คุณจะย้ายข้อมูลแอปไปยัง Cloud Pub/Sub ได้ใน Codelab ถัดไป (โมดูล 19)

บทแนะนำนี้มีขั้นตอนต่อไปนี้

  1. การตั้งค่า/งานล่วงหน้า
  2. อัปเดตการกำหนดค่า
  3. แก้ไขโค้ดของแอปพลิเคชัน

3. การตั้งค่า/งานล่วงหน้า

ส่วนนี้จะอธิบายวิธี:

  1. ตั้งค่าโปรเจ็กต์ที่อยู่ในระบบคลาวด์
  2. รับแอปตัวอย่างพื้นฐาน
  3. (อีกครั้ง) ติดตั้งใช้งานและตรวจสอบแอปพื้นฐาน

ขั้นตอนเหล่านี้จะช่วยให้มั่นใจว่าคุณกำลังเริ่มต้นด้วยโค้ดที่ใช้งานได้

1. สร้างโปรเจ็กต์

หากคุณทำ Codelab โมดูล 1 เสร็จแล้ว ให้ใช้โปรเจ็กต์ (และโค้ด) เดียวกันนั้นซ้ำ หรือสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์อื่นที่มีอยู่ซ้ำ ตรวจสอบว่าโปรเจ็กต์มีบัญชีสำหรับการเรียกเก็บเงินที่ใช้งานอยู่และแอป App Engine ที่เปิดใช้แล้ว ค้นหารหัสโปรเจ็กต์เนื่องจากคุณจะต้องใช้รหัสดังกล่าวหลายครั้งใน Codelab นี้และใช้ทุกครั้งที่พบตัวแปร PROJECT_ID

2. รับแอปตัวอย่างพื้นฐาน

ข้อกำหนดเบื้องต้นอย่างหนึ่งของ Codelab นี้คือแอป App Engine โมดูล 1 ที่ใช้งานได้ ทำ Codelab ของโมดูล 1 ให้เสร็จสิ้น (แนะนำ) หรือคัดลอกแอปโมดูล 1 จากที่เก็บ ไม่ว่าคุณจะใช้โค้ดของคุณเองหรือของเรา โค้ดโมดูล 1 คือส่วนที่เราจะ "เริ่ม" Codelab นี้จะแนะนำแต่ละขั้นตอน สรุปด้วยโค้ดที่คล้ายคลึงกับสิ่งที่อยู่ในโฟลเดอร์ที่เก็บโมดูล 18 "FINISH"

ไม่ว่าคุณจะใช้แอป Module 1 ใด โฟลเดอร์ควรมีลักษณะตามเอาต์พุตด้านล่าง ซึ่งอาจมีโฟลเดอร์ lib ด้วยก็ได้

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

3. (อีกครั้ง) ทำให้แอปพื้นฐานใช้งานได้

ดำเนินการตามขั้นตอนต่อไปนี้เพื่อทำให้แอปโมดูล 1 ใช้งานได้

  1. ลบโฟลเดอร์ lib หากมี แล้วเรียกใช้: pip install -t lib -r requirements.txt เพื่อเติมข้อมูล lib ใหม่ คุณอาจต้องใช้คำสั่ง pip2 แทนหากติดตั้งทั้ง Python 2 และ 3 ไว้
  2. ตรวจสอบว่าคุณได้ติดตั้งและเริ่มต้นเครื่องมือบรรทัดคำสั่ง gcloud และตรวจสอบการใช้งานแล้ว
  3. ตั้งค่าโปรเจ็กต์ที่อยู่ในระบบคลาวด์ด้วย gcloud config set project PROJECT_ID หากไม่ต้องการป้อน PROJECT_ID ด้วยคำสั่ง gcloud แต่ละคำสั่ง
  4. ทำให้แอปตัวอย่างใช้งานได้ด้วย gcloud app deploy
  5. ยืนยันว่าแอปโมดูล 1 ทำงานตามที่คาดไว้และแสดงการเข้าชมล่าสุด (ตามภาพด้านล่าง)

a7a9d2b80d706a2b.png

4. อัปเดตการกำหนดค่า

ไม่จำเป็นต้องเปลี่ยนแปลงไฟล์การกำหนดค่า App Engine มาตรฐาน (app.yaml, requirements.txt, appengine_config.py) แต่ให้เพิ่มไฟล์การกำหนดค่า queue.yaml ใหม่ที่มีเนื้อหาต่อไปนี้แทน และใส่ไว้ในไดเรกทอรีระดับบนสุดเดียวกัน

queue:
- name: pullq
  mode: pull

ไฟล์ queue.yaml ระบุคิวงานทั้งหมดที่มีสำหรับแอปของคุณ (ยกเว้นคิว [push] default ซึ่ง App Engine สร้างขึ้นโดยอัตโนมัติ) ในกรณีนี้มีเพียงพุลคิวชื่อ pullq เพียงรายการเดียว App Engine กำหนดให้ต้องระบุคำสั่ง mode เป็น 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.
$

5. แก้ไขโค้ดของแอปพลิเคชัน

ส่วนนี้ประกอบด้วยการอัปเดตไฟล์ต่อไปนี้

  • main.py — เพิ่มการใช้พุลคิวลงในแอปพลิเคชันหลัก
  • templates/index.html — อัปเดตเทมเพลตเว็บเพื่อแสดงข้อมูลใหม่

การนำเข้าและค่าคงที่

ขั้นตอนแรกคือการเพิ่มการนำเข้าใหม่ 1 รายการและค่าคงที่หลายรายการเพื่อรองรับการดึงคิว ดังนี้

  • เพิ่มการนำเข้าของไลบรารีคิวงาน google.appengine.api.taskqueue
  • เพิ่มค่าคงที่ 3 รายการเพื่อรองรับการเช่าจำนวนงานพุลสูงสุด (TASKS) เป็นเวลา 1 ชั่วโมง (HOUR) จากพุลคิว (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__)

เพิ่มงานพุล (รวบรวมข้อมูลสำหรับงานและสร้างงานในพุลคิว)

โมเดลข้อมูล Visit จะยังคงเดิม เช่นเดียวกับการค้นหาการเข้าชมที่จะแสดงใน fetch_visits() การเปลี่ยนแปลงที่จำเป็นในส่วนนี้ของโค้ดมีอยู่ใน store_visit() นอกจากการลงทะเบียนการเข้าชมแล้ว ให้เพิ่มงานลงในพุลคิวด้วยที่อยู่ IP ของผู้เข้าชม เพื่อให้ผู้ปฏิบัติงานสามารถเพิ่มตัวนับผู้เข้าชมได้

ก่อนหน้า:

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 เพื่อติดตามจำนวนการเข้าชม จากนั้นเพิ่มฟังก์ชันใหม่ (หรืออาจเป็น Python 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 ใช้พจนานุกรม/แฮชเพื่อติดตามจำนวนผู้เข้าชมล่าสุด โดยแบ่งเบางานต่างๆ ให้มากที่สุดใน 1 ชั่วโมง สำหรับแต่ละงาน ระบบจะนับรวมการเข้าชมทั้งหมดของผู้เข้าชมรายเดียวกัน เมื่อมีรายการนับถอยหลังแล้ว แอปจะอัปเดตเอนทิตี VisitorCount ที่เกี่ยวข้องทั้งหมดซึ่งมีอยู่แล้วใน Datastore หรือสร้างเอนทิตีใหม่หากจำเป็น ขั้นตอนสุดท้ายจะแสดงข้อความธรรมดาที่ระบุจำนวนผู้เข้าชมที่ลงทะเบียนจากจำนวนงานที่ประมวลผลแล้ว เพิ่มฟังก์ชันนี้ใน main.py ใต้ fetch_counts():

@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

6. สรุป/ล้างข้อมูล

ส่วนนี้จะสรุป Codelab นี้โดยการทำให้แอปใช้งานได้ ซึ่งจะช่วยยืนยันว่าแอปทำงานได้ตามที่ต้องการและอยู่ในเอาต์พุตที่แสดงขึ้น เรียกใช้ผู้ปฏิบัติงานแยกกันเพื่อประมวลผลจำนวนผู้เข้าชม หลังจากตรวจสอบแอปแล้ว ให้ทำตามขั้นตอนการทำความสะอาดและพิจารณาขั้นตอนถัดไป

ติดตั้งใช้งานและยืนยันแอปพลิเคชัน

ตรวจสอบว่าคุณได้ตั้งค่าพุลคิวแล้วเช่นเดียวกับที่เราทำใกล้กับด้านบนของ Codelab นี้กับ gcloud app deploy queue.yaml หากการดำเนินการดังกล่าวเสร็จสมบูรณ์และแอปตัวอย่างพร้อมใช้งานแล้ว ให้ทำให้แอปใช้งานได้ด้วย gcloud app deploy ผลลัพธ์ควรจะเหมือนกับแอปโมดูล 1 เพียงแต่ว่าตอนนี้จะมี "ผู้เข้าชมยอดนิยม" อยู่ ตารางด้านบน

b667551dcbab1a09.png

แม้ว่าฟรอนท์เอนด์ของเว็บที่อัปเดตจะแสดงผู้เข้าชมยอดนิยมและการเข้าชมล่าสุด แต่โปรดทราบว่าจำนวนผู้เข้าชมจะไม่รวมการเข้าชมนี้ไว้ด้วย แอปจะแสดงจำนวนผู้เข้าชมก่อนหน้าในขณะที่ทิ้งงานใหม่ที่เพิ่มจำนวนของผู้เข้าชมรายนี้ในคิวการดึงข้อมูล ซึ่งเป็นงานที่รอประมวลผลอยู่

คุณสามารถทำงานนี้โดยเรียกใช้ /log ได้หลายวิธีดังนี้

ตัวอย่างเช่น หากคุณใช้ curl เพื่อส่งคำขอ GET ไปยัง /log เอาต์พุตจะมีลักษณะดังนี้ เนื่องจากคุณระบุ PROJECT_ID ไว้แล้ว

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

จำนวนที่อัปเดตจะแสดงเมื่อเข้าชมเว็บไซต์ครั้งต่อไป เท่านี้ก็เรียบร้อย

ขอแสดงความยินดีที่ Codelab นี้เสร็จสมบูรณ์สำหรับการเพิ่มการใช้บริการพุลคิวงานของ App Engine ในแอปตัวอย่างเรียบร้อยแล้ว และตอนนี้ก็พร้อมที่จะย้ายข้อมูลไปยัง Cloud Pub/Sub, Cloud NDB และ Python 3 ในโมดูล 19 แล้ว

ล้างข้อมูล

ทั่วไป

หากดำเนินการเสร็จแล้ว เราขอแนะนำให้คุณปิดใช้แอป App Engine เพื่อหลีกเลี่ยงการเรียกเก็บเงิน อย่างไรก็ตาม หากคุณต้องการทดสอบหรือทดลองเพิ่มเติม แพลตฟอร์ม App Engine จะมีโควต้าฟรี และตราบใดที่คุณใช้งานไม่เกินระดับการใช้งานดังกล่าว เราก็จะไม่เรียกเก็บเงิน ค่าดังกล่าวมีไว้สําหรับการประมวลผล แต่ก็อาจมีการเรียกเก็บเงินค่าบริการ App Engine ที่เกี่ยวข้องด้วย ดังนั้นโปรดดูข้อมูลเพิ่มเติมในหน้าราคา หากการย้ายข้อมูลนี้เกี่ยวข้องกับบริการระบบคลาวด์อื่นๆ ระบบจะเรียกเก็บเงินแยกต่างหาก ในทั้ง 2 กรณี หากมี โปรดดูส่วน "เฉพาะสำหรับ Codelab นี้" ด้านล่าง

เพื่อการเปิดเผยข้อมูลทั้งหมด การทำให้ใช้งานได้กับแพลตฟอร์มการประมวลผลแบบ Serverless ของ 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" หากแอปของคุณโฮสต์ในสหรัฐอเมริกา

ในทางกลับกัน หากคุณไม่ต้องการดำเนินการกับแอปพลิเคชันนี้หรือ Codelab การย้ายข้อมูลอื่นๆ ที่เกี่ยวข้องต่อไป และต้องการลบทุกอย่างออกทั้งหมด ให้ปิดโปรเจ็กต์

เฉพาะสำหรับ Codelab นี้

บริการในรายการด้านล่างเป็นบริการเฉพาะสำหรับ Codelab นี้ โปรดดูข้อมูลเพิ่มเติมในเอกสารประกอบของผลิตภัณฑ์แต่ละรายการ

ขั้นตอนถัดไป

ใน "การย้ายข้อมูล" นี้ คุณเพิ่มการใช้พุชคิวของคิวงานลงในแอปตัวอย่างโมดูล 1 โดยเพิ่มการสนับสนุนสำหรับการติดตามผู้เข้าชม ซึ่งจะทำให้แอปตัวอย่างของโมดูล 18 ใช้งานได้ ในการย้ายข้อมูลครั้งถัดไป คุณจะอัปเกรดงานการพุลของ App Engine ไปยัง Cloud Pub/Sub ตั้งแต่ช่วงปลายปี 2021 เป็นต้นไป ผู้ใช้ไม่จำเป็นต้องย้ายข้อมูลไปยัง Cloud Pub/Sub อีกต่อไปเมื่ออัปเกรดเป็น Python 3 อ่านเพิ่มเติมเกี่ยวกับเรื่องนี้ในส่วนถัดไป

สำหรับการย้ายข้อมูลไปยัง Cloud Pub/Sub โปรดดู Codelab ของโมดูล 19 นอกเหนือจากนั้นยังมีการย้ายข้อมูลอื่นๆ ที่ต้องพิจารณาด้วย เช่น Cloud Datastore, Cloud Memorystore, Cloud Storage หรือ Cloud Tasks (พุชคิว) นอกจากนี้ยังมีการย้ายข้อมูลข้ามผลิตภัณฑ์ไปยัง Cloud Run และ Cloud Functions ด้วย เนื้อหาของสถานีย้ายข้อมูลแบบ Serverless (โค้ดแล็บ วิดีโอ ซอร์สโค้ด [หากมี]) ทั้งหมดสามารถเข้าถึงได้ที่ที่เก็บโอเพนซอร์ส

7. การย้ายข้อมูลไปยัง Python 3

ในฤดูใบไม้ร่วงปี 2021 ทีม App Engine ได้ขยายการรองรับบริการที่รวมอยู่ในแพ็กเกจไปยังรันไทม์รุ่นที่ 2 (ที่มีรันไทม์รุ่นที่ 1) ด้วยเหตุนี้ คุณจึงไม่จำเป็นต้องย้ายข้อมูลจากบริการที่รวมอยู่ในแพ็กเกจ เช่น คิวงานของ App Engine ไปยังระบบคลาวด์แบบสแตนด์อโลนหรือบริการของบุคคลที่สาม เช่น Cloud Pub/Sub อีกต่อไป เมื่อพอร์ตแอปไปยัง Python 3 กล่าวคือ คุณจะใช้คิวงานในแอป Python 3 App Engine ต่อไปได้ตราบใดที่คุณปรับเปลี่ยนโค้ดเพื่อเข้าถึงบริการในแพ็กเกจจากรันไทม์รุ่นถัดไป

ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีย้ายข้อมูลการใช้บริการในแพ็กเกจไปยัง Python 3 ได้ใน Codelab ของโมดูล 17 และวิดีโอที่เกี่ยวข้อง แม้ว่าหัวข้อดังกล่าวจะอยู่นอกขอบเขตของโมดูล 18 แต่ลิงก์ด้านล่างนี้เป็นแอปโมดูล 1 เวอร์ชัน Python 3 ที่ย้ายไปยัง Python 3 และยังคงใช้ App Engine NDB (ในบางครั้งจะมีแอปโมดูล 18 เวอร์ชัน Python 3 ให้ใช้งานด้วย)

8. แหล่งข้อมูลเพิ่มเติม

รายการด้านล่างนี้เป็นแหล่งข้อมูลเพิ่มเติมสำหรับนักพัฒนาซอฟต์แวร์ที่ศึกษาเพิ่มเติมเกี่ยวกับโมดูลการย้ายข้อมูลนี้หรือที่เกี่ยวข้อง รวมถึงผลิตภัณฑ์ที่เกี่ยวข้อง ซึ่งรวมถึงพื้นที่สำหรับแสดงความคิดเห็นเกี่ยวกับเนื้อหานี้ ลิงก์ไปยังโค้ด และเอกสารประกอบต่างๆ ที่อาจเป็นประโยชน์กับคุณ

ปัญหา/ความคิดเห็นของ Codelab

หากมีปัญหาใดๆ เกี่ยวกับ Codelab นี้ โปรดค้นหาปัญหาของคุณก่อนยื่น ลิงก์สำหรับค้นหาและสร้างปัญหาใหม่

ทรัพยากรการย้ายข้อมูล

ดูลิงก์ไปยังโฟลเดอร์ที่เก็บสำหรับโมดูล 1 (START) และโมดูล 18 (FINISH) ได้ในตารางด้านล่าง นอกจากนี้ ยังเข้าถึงได้จากที่เก็บสำหรับการย้ายข้อมูล Codelab ทั้งหมดของ App Engine โคลนหรือดาวน์โหลดไฟล์ ZIP

Codelab

Python 2

Python 3

โมดูล 1

รหัส

รหัส (ไม่มีในบทแนะนำนี้)

โมดูล 18 (Codelab นี้)

รหัส

ไม่มี

ข้อมูลอ้างอิงออนไลน์

ด้านล่างนี้คือแหล่งข้อมูลที่เกี่ยวข้องกับบทแนะนำนี้

คิวงานของ App Engine

แพลตฟอร์ม App Engine

เอกสารประกอบของ App Engine

รันไทม์ของ Python 2 App Engine (สภาพแวดล้อมมาตรฐาน)

รันไทม์ของ Python 3 App Engine (สภาพแวดล้อมมาตรฐาน)

ความแตกต่างระหว่าง Python 2 กับ รันไทม์ของ App Engine (สภาพแวดล้อมมาตรฐาน) 3 รายการ

คำแนะนำในการย้ายข้อมูล Python 2 ถึง 3 App Engine (สภาพแวดล้อมมาตรฐาน)

ข้อมูลราคาและโควต้าของ App Engine

เปิดตัวแพลตฟอร์ม App Engine รุ่นที่ 2 (2018)

การรองรับรันไทม์เดิมในระยะยาว

ตัวอย่างการย้ายข้อมูลเอกสารประกอบ

ข้อมูลอื่นๆ เกี่ยวกับระบบคลาวด์

วิดีโอ

ใบอนุญาต

ผลงานนี้ได้รับอนุญาตภายใต้ใบอนุญาตทั่วไปครีเอทีฟคอมมอนส์แบบระบุแหล่งที่มา 2.0