1. ภาพรวม
ชุด Codelab ของ Serverless Migration Station (บทแนะนำแบบลงมือปฏิบัติจริงที่ทำตามได้ด้วยตนเอง) และวิดีโอที่เกี่ยวข้องมีจุดมุ่งหมายเพื่อช่วยให้นักพัฒนาแอป Google Cloud แบบไร้เซิร์ฟเวอร์ปรับปรุงแอปพลิเคชันให้ทันสมัยโดยแนะนำการย้ายข้อมูลอย่างน้อย 1 รายการ ซึ่งส่วนใหญ่เป็นการย้ายข้อมูลออกจากบริการเดิม การทำเช่นนี้จะทำให้แอปของคุณพกพาได้มากขึ้น และช่วยให้คุณมีตัวเลือกและความยืดหยุ่นมากขึ้น ซึ่งจะช่วยให้คุณผสานรวมและเข้าถึงผลิตภัณฑ์ระบบคลาวด์ที่หลากหลายยิ่งขึ้น รวมถึงอัปเกรดเป็นภาษาเวอร์ชันใหม่ๆ ได้ง่ายขึ้น แม้ว่าในตอนแรกจะมุ่งเน้นไปที่ผู้ใช้ Cloud รุ่นแรกๆ ซึ่งส่วนใหญ่เป็นนักพัฒนาซอฟต์แวร์ App Engine (สภาพแวดล้อมมาตรฐาน) แต่ชุดข้อมูลนี้ก็ครอบคลุมแพลตฟอร์มแบบไร้เซิร์ฟเวอร์อื่นๆ เช่น Cloud Functions และ Cloud Run หรือที่อื่นๆ หากเกี่ยวข้อง
Codelab นี้จะสอนวิธีรวมและใช้งานแบบดึงของคิวงาน App Engine กับแอปตัวอย่างจาก Codelab โมดูลที่ 1 เราจะเพิ่มการใช้ Task pull ในบทแนะนำโมดูลที่ 18 นี้ จากนั้นจะย้ายข้อมูลการใช้งานดังกล่าวไปยัง Cloud Pub/Sub ในโมดูลที่ 19 ผู้ที่ใช้คิวงานสำหรับงานพุชจะย้ายข้อมูลไปยัง Cloud Tasks แทน และควรดูโมดูล 7-9 แทน
คุณจะได้เรียนรู้วิธีต่อไปนี้
- ใช้ API คิวงาน/บริการแบบรวมของ App Engine
- เพิ่มการใช้งานคิวแบบดึงไปยังแอป NDB ของ App Engine ที่ใช้ Flask ใน Python 2
สิ่งที่คุณต้องมี
- โปรเจ็กต์ Google Cloud Platform ที่มีบัญชีสำหรับการเรียกเก็บเงินของ GCP ที่ใช้งานอยู่
- ทักษะ Python ขั้นพื้นฐาน
- มีความรู้พื้นฐานเกี่ยวกับคำสั่ง Linux ทั่วไป
- ความรู้พื้นฐานเกี่ยวกับการพัฒนาและการทําให้แอป App Engine ใช้งานได้
- แอป App Engine ของโมดูล 1 ที่ใช้งานได้ (ทำตามโค้ดแล็บ [แนะนำ] หรือคัดลอกแอปจากที่เก็บ)
แบบสำรวจ
คุณจะใช้บทแนะนำนี้อย่างไร
คุณจะให้คะแนนประสบการณ์การใช้งาน Python เท่าใด
คุณจะให้คะแนนประสบการณ์การใช้บริการ Google Cloud เท่าใด
2. ฉากหลัง
หากต้องการย้ายข้อมูลจากงานแบบดึงของคิวงาน App Engine ให้เพิ่มการใช้งานลงในแอป Flask และ App Engine NDB ที่มีอยู่ซึ่งเป็นผลมาจาก Codelab โมดูลที่ 1 แอปตัวอย่างจะแสดงการเข้าชมล่าสุดต่อผู้ใช้ปลายทาง ซึ่งก็ไม่เป็นไร แต่น่าสนใจยิ่งกว่าหากจะติดตามผู้เข้าชมเพื่อดูว่าใครเข้าชมมากที่สุด
แม้ว่าเราจะใช้งานแบบพุชสำหรับจำนวนผู้เข้าชมเหล่านี้ได้ แต่เราต้องการแบ่งความรับผิดชอบระหว่างแอปตัวอย่างซึ่งมีหน้าที่ลงทะเบียนการเข้าชมและตอบกลับผู้ใช้ทันที กับ "Worker" ที่กำหนดซึ่งมีหน้าที่นับจำนวนผู้เข้าชมภายนอกเวิร์กโฟลว์คำขอ-คำตอบปกติ
เราจะเพิ่มการใช้คิวแบบดึงลงในแอปพลิเคชันหลักและรองรับฟังก์ชันการทำงานของ Worker เพื่อนำการออกแบบนี้ไปใช้ Worker สามารถทํางานเป็นกระบวนการแยกต่างหาก (เช่น อินสแตนซ์แบ็กเอนด์หรือโค้ดที่ทํางานบน VM ที่พร้อมใช้งานเสมอ), งาน Cron หรือคําขอ HTTP แบบบรรทัดคําสั่งพื้นฐานโดยใช้ curl หรือ wget หลังจากผสานรวมแล้ว คุณจะย้ายข้อมูลแอปไปยัง Cloud Pub/Sub ใน Codelab ถัดไป (โมดูลที่ 19) ได้
บทแนะนำนี้มีขั้นตอนต่อไปนี้
- การตั้งค่า/การเตรียมการ
- อัปเดตการกำหนดค่า
- แก้ไขโค้ดแอปพลิเคชัน
3. การตั้งค่า/การเตรียมการ
ส่วนนี้จะอธิบายวิธี
- ตั้งค่าโปรเจ็กต์ Cloud
- รับแอปตัวอย่างพื้นฐาน
- (อีกครั้ง) นำไปใช้งานและตรวจสอบแอปพื้นฐาน
ขั้นตอนเหล่านี้จะช่วยให้คุณเริ่มต้นด้วยโค้ดที่ใช้งานได้
1. ตั้งค่าโปรเจ็กต์
หากทำ Codelab โมดูลที่ 1 เสร็จแล้ว ให้ใช้โปรเจ็กต์ (และโค้ด) เดียวกันนั้นซ้ำ หรือจะสร้างโปรเจ็กต์ใหม่หรือนำโปรเจ็กต์อื่นที่มีอยู่มาใช้ซ้ำก็ได้ ตรวจสอบว่าโปรเจ็กต์มีบัญชีสำหรับการเรียกเก็บเงินที่ใช้งานอยู่และแอป App Engine ที่เปิดใช้แล้ว ค้นหารหัสโปรเจ็กต์เนื่องจากคุณจะต้องใช้รหัสนี้หลายครั้งในโค้ดแล็บนี้ และใช้รหัสนี้ทุกครั้งที่พบตัวแปร PROJECT_ID
2. รับแอปตัวอย่างพื้นฐาน
ข้อกำหนดเบื้องต้นอย่างหนึ่งของ Codelab นี้คือการมีแอป App Engine ของโมดูล 1 ที่ใช้งานได้ โปรดทำ Codelab ของโมดูล 1 (แนะนำ) หรือคัดลอกแอปของโมดูล 1 จากที่เก็บ ไม่ว่าคุณจะใช้โค้ดของคุณเองหรือโค้ดของเรา โค้ดโมดูล 1 คือจุดที่เราจะ "เริ่มต้น" Codelab นี้จะแนะนำคุณทีละขั้นตอน โดยจะจบด้วยโค้ดที่คล้ายกับโค้ดในโฟลเดอร์ "FINISH" ของที่เก็บโมดูล 18
- เริ่มต้น: โฟลเดอร์โมดูล 1 (Python 2)
- เสร็จสิ้น: โฟลเดอร์โมดูล 18 (Python 2)
- ที่เก็บทั้งหมด (เพื่อโคลนหรือดาวน์โหลดไฟล์ ZIP)
ไม่ว่าคุณจะใช้แอป Module 1 ใด โฟลเดอร์ควรมีลักษณะคล้ายกับเอาต์พุตด้านล่าง ซึ่งอาจมีโฟลเดอร์ lib ด้วย
$ ls README.md appengine_config.py requirements.txt app.yaml main.py templates
3. (อีกครั้ง) ทำให้แอปพื้นฐานใช้งานได้
ทำตามขั้นตอนต่อไปนี้เพื่อติดตั้งใช้งานแอปโมดูลที่ 1
- ลบโฟลเดอร์
libหากมี แล้วเรียกใช้pip install -t lib -r requirements.txtเพื่อสร้างlibใหม่ คุณอาจต้องใช้คำสั่งpip2แทนหากติดตั้งทั้ง Python 2 และ 3 - ตรวจสอบว่าคุณได้ติดตั้งและเริ่มต้นเครื่องมือบรรทัดคำสั่ง
gcloudและตรวจสอบการใช้งานแล้ว - ตั้งค่าโปรเจ็กต์ที่อยู่ในระบบคลาวด์ด้วย
gcloud config set projectPROJECT_IDหากไม่ต้องการป้อนPROJECT_IDทุกครั้งที่ออกคำสั่งgcloud - ทำให้แอปตัวอย่างใช้งานได้ด้วย
gcloud app deploy - ยืนยันว่าแอปโมดูล 1 ทำงานได้ตามที่คาดไว้และแสดงการเข้าชมล่าสุด (ดังภาพด้านล่าง)

4. อัปเดตการกำหนดค่า
ไม่จำเป็นต้องเปลี่ยนแปลงไฟล์การกำหนดค่า App Engine มาตรฐาน (app.yaml, requirements.txt, appengine_config.py) แต่ให้เพิ่มไฟล์การกำหนดค่าใหม่ queue.yaml ที่มีเนื้อหาต่อไปนี้ในไดเรกทอรีระดับบนสุดเดียวกัน
queue:
- name: pullq
mode: pull
ไฟล์ queue.yaml จะระบุคิวงานทั้งหมดที่มีอยู่สำหรับแอปของคุณ (ยกเว้นคิว default [push] ที่ 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 ของผู้เข้าชมเพื่อให้ 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 ของ Python) ชื่อ 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

อัปเดตเทมเพลตเว็บด้วยข้อมูล Display ใหม่
เทมเพลตเว็บ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 นี้ด้วยการติดตั้งใช้งานแอป ยืนยันว่าแอปทำงานได้ตามที่ต้องการและในเอาต์พุตที่แสดง เรียกใช้ Worker แยกต่างหากเพื่อประมวลผลจำนวนผู้เข้าชม หลังจากตรวจสอบแอปแล้ว ให้ทำขั้นตอนการล้างข้อมูลและพิจารณาขั้นตอนถัดไป
ทำให้แอปพลิเคชันใช้งานได้และยืนยัน
ตรวจสอบว่าคุณได้ตั้งค่าคิวการดึงข้อมูลแล้วตามที่เราได้ทำไว้ที่ด้านบนของ Codelab นี้ด้วย gcloud app deploy queue.yaml หากดำเนินการดังกล่าวเสร็จแล้วและแอปตัวอย่างพร้อมใช้งาน ให้ติดตั้งใช้งานแอปด้วย gcloud app deploy เอาต์พุตควรเหมือนกับแอปโมดูลที่ 1 ยกเว้นว่าตอนนี้จะมีตาราง "ผู้เข้าชมยอดนิยม" อยู่ด้านบน

แม้ว่าส่วนหน้าของเว็บที่อัปเดตแล้วจะแสดงผู้เข้าชมยอดนิยมและการเข้าชมล่าสุด แต่โปรดทราบว่าจำนวนผู้เข้าชมไม่รวมการเข้าชมนี้ แอปจะแสดงจำนวนผู้เข้าชมก่อนหน้าขณะที่ทิ้งงานใหม่ซึ่งเพิ่มจำนวนผู้เข้าชมนี้ในคิวการดึง ซึ่งเป็นงานที่รอการประมวลผล
คุณสามารถเรียกใช้ฟังก์ชันได้โดยการเรียกใช้ /log ในหลากหลายวิธี ดังนี้
- บริการแบ็กเอนด์ของ App Engine
- งาน
cron - เว็บเบราว์เซอร์
- คำขอ HTTP ในบรรทัดคำสั่ง (
curl,wgetฯลฯ)
เช่น หากคุณใช้ 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 ที่เกี่ยวข้องด้วย ดังนั้นโปรดดูข้อมูลเพิ่มเติมในหน้าการกำหนดราคา หากการย้ายข้อมูลนี้เกี่ยวข้องกับบริการอื่นๆ ของระบบคลาวด์ ระบบจะเรียกเก็บเงินสำหรับบริการเหล่านั้นแยกต่างหาก ไม่ว่าจะในกรณีใดก็ตาม หากมี ให้ดูส่วน "เฉพาะสำหรับ 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/imagesconsole.cloud.google.com/storage/browser/staging.PROJECT_ID.appspot.com- ลิงก์พื้นที่เก็บข้อมูลด้านบนจะขึ้นอยู่กับ
PROJECT_IDและ *LOC*ation ของคุณ เช่น "us" หากแอปโฮสต์อยู่ในสหรัฐอเมริกา
ในทางกลับกัน หากคุณจะไม่ดำเนินการต่อกับแอปพลิเคชันนี้หรือ Codelab การย้ายข้อมูลอื่นๆ ที่เกี่ยวข้อง และต้องการลบทุกอย่างออกทั้งหมด ให้ปิดโปรเจ็กต์
เฉพาะสำหรับ Codelab นี้
บริการที่ระบุไว้ด้านล่างเป็นบริการเฉพาะสำหรับโค้ดแล็บนี้ ดูข้อมูลเพิ่มเติมได้ในเอกสารประกอบของแต่ละผลิตภัณฑ์
- บริการคิวงานของ App Engine จะไม่มีการเรียกเก็บเงินเพิ่มเติมตามหน้าราคาสำหรับบริการแบบรวมแพ็กเกจเดิม เช่น คิวงาน
- บริการ App Engine Datastore ให้บริการโดย Cloud Datastore (Cloud Firestore ในโหมด Datastore) ซึ่งมีระดับฟรีด้วย ดูข้อมูลเพิ่มเติมได้ที่หน้าการกำหนดราคา
ขั้นตอนถัดไป
ในการ "ย้ายข้อมูล" นี้ คุณได้เพิ่มการใช้งานคิวแบบพุชของคิวงานลงในแอปตัวอย่างของโมดูลที่ 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 Migration Station (Codelab, วิดีโอ, ซอร์สโค้ด [หากมี]) ได้ที่ที่เก็บแบบโอเพนซอร์ส
7. การย้ายข้อมูลไปยัง Python 3
ในช่วงฤดูใบไม้ร่วงปี 2021 ทีม App Engine ได้ขยายการรองรับบริการแบบรวมหลายรายการไปยังรันไทม์รุ่นที่ 2 (ที่มีรันไทม์รุ่นที่ 1) ด้วยเหตุนี้ คุณจึงไม่จำเป็นต้องย้ายข้อมูลจากบริการที่รวมกลุ่ม เช่น คิวงานของ App Engine ไปยังบริการแบบสแตนด์อโลนของ Cloud หรือบริการของบุคคลที่สาม เช่น Cloud Pub/Sub เมื่อพอร์ตแอปไปยัง Python 3 กล่าวคือ คุณยังคงใช้คิวงานในแอป Python 3 App Engine ได้ตราบใดที่คุณปรับโค้ดให้เข้าถึงบริการที่รวมไว้จากรันไทม์รุ่นถัดไป
ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีย้ายข้อมูลการใช้งานบริการที่รวมไว้ไปยัง Python 3 ได้ใน Codelab โมดูลที่ 17 และวิดีโอที่เกี่ยวข้อง แม้ว่าหัวข้อดังกล่าวจะอยู่นอกขอบเขตของโมดูลที่ 18 แต่เราได้ลิงก์เวอร์ชัน Python 3 ของแอปโมดูลที่ 1 ซึ่งพอร์ตไปยัง Python 3 และยังคงใช้ NDB ของ App Engine ไว้ด้านล่าง (ในอนาคต เราจะเปิดตัวแอปโมดูล 18 เวอร์ชัน Python 3 ด้วย)
8. แหล่งข้อมูลเพิ่มเติม
ด้านล่างนี้คือแหล่งข้อมูลเพิ่มเติมสำหรับนักพัฒนาแอปที่ต้องการสำรวจโมดูลการย้ายข้อมูลนี้หรือโมดูลที่เกี่ยวข้อง รวมถึงผลิตภัณฑ์ที่เกี่ยวข้องเพิ่มเติม ซึ่งรวมถึงส่วนที่ให้ความคิดเห็นเกี่ยวกับเนื้อหานี้ ลิงก์ไปยังโค้ด และเอกสารต่างๆ ที่คุณอาจเห็นว่ามีประโยชน์
ปัญหา/ความคิดเห็นเกี่ยวกับ Codelab
หากพบปัญหาเกี่ยวกับ Codelab นี้ โปรดค้นหาปัญหาของคุณก่อนที่จะยื่นเรื่อง ลิงก์สำหรับค้นหาและสร้างปัญหาใหม่
แหล่งข้อมูลเกี่ยวกับการย้ายข้อมูล
คุณจะเห็นลิงก์ไปยังโฟลเดอร์ที่เก็บสำหรับโมดูลที่ 1 (START) และโมดูลที่ 18 (FINISH) ในตารางด้านล่าง นอกจากนี้ คุณยังเข้าถึงได้จากที่เก็บสำหรับการย้ายข้อมูล Codelab ของ App Engine ทั้งหมด โดยโคลนหรือดาวน์โหลดไฟล์ ZIP
Codelab | Python 2 | Python 3 |
โค้ด (ไม่ได้กล่าวถึงในบทแนะนำนี้) | ||
โมดูล 18 (Codelab นี้) | ไม่มี |
ข้อมูลอ้างอิงออนไลน์
แหล่งข้อมูลที่เกี่ยวข้องกับบทแนะนำนี้มีดังนี้
คิวงานของ App Engine
- ภาพรวมคิวของงาน App Engine
- ภาพรวมของพูลคิวของคิวงาน App Engine
- แอปตัวอย่างแบบเต็มของคิวการดึงข้อมูลของคิวงาน App Engine
- การสร้างคิวการดึงข้อมูลของ Task Queue
- วิดีโอการเปิดตัวคิวแบบดึงของ Google I/O 2011 ( แอปตัวอย่าง Votelator)
queue.yamlการอ้างอิงqueue.yamlกับ Cloud Tasks- คำแนะนำในการย้ายข้อมูลคิวแบบดึงไปยัง Pub/Sub
- ตัวอย่างเอกสารประกอบของพุลคิว App Engine Task Queue ไปยัง Cloud Pub/Sub
แพลตฟอร์ม App Engine
เอกสารประกอบของ App Engine
รันไทม์ของ App Engine (สภาพแวดล้อมมาตรฐาน) สำหรับ Python 2
รันไทม์ Python 3 App Engine (สภาพแวดล้อมมาตรฐาน)
ความแตกต่างระหว่างรันไทม์ของ Python 2 และ 3 ใน App Engine (สภาพแวดล้อมมาตรฐาน)
คู่มือการย้ายข้อมูลจาก Python 2 ไปยัง 3 ใน App Engine (สภาพแวดล้อมมาตรฐาน)
ข้อมูลราคาและโควต้าของ App Engine
เปิดตัวแพลตฟอร์ม App Engine รุ่นที่ 2 (2018)
การสนับสนุนรันไทม์เวอร์ชันเดิมในระยะยาว
ตัวอย่างการย้ายข้อมูลเอกสาร
ข้อมูลอื่นๆ เกี่ยวกับระบบคลาวด์
- Python ใน Google Cloud Platform
- ไลบรารีของไคลเอ็นต์ Python สำหรับ Google Cloud
- ระดับ "ฟรีตลอด" ของ Google Cloud
- Google Cloud SDK (
gcloudเครื่องมือบรรทัดคำสั่ง) - เอกสารประกอบทั้งหมดของ Google Cloud
วิดีโอ
- Serverless Migration Station
- Expeditions แบบ Serverless
- ติดตาม Google Cloud Tech
- ติดตาม Google Developers
ใบอนุญาต
ผลงานนี้ได้รับอนุญาตภายใต้สัญญาอนุญาตครีเอทีฟคอมมอนส์สำหรับยอมรับสิทธิของผู้สร้าง (Creative Commons Attribution License) 2.0 แบบทั่วไป