1. Tổng quan
Loạt lớp học lập trình Serverless Migration Station (hướng dẫn thực hành theo tốc độ của riêng bạn) và các video liên quan nhằm giúp các nhà phát triển Google Cloud không máy chủ hiện đại hoá các ứng dụng của họ bằng cách hướng dẫn họ thực hiện một hoặc nhiều quy trình di chuyển, chủ yếu là chuyển từ các dịch vụ cũ. Làm như vậy sẽ giúp ứng dụng của bạn dễ dàng di chuyển hơn, đồng thời mang đến cho bạn nhiều lựa chọn và sự linh hoạt hơn, cho phép bạn tích hợp và truy cập vào nhiều sản phẩm trên đám mây hơn, cũng như dễ dàng nâng cấp lên các bản phát hành ngôn ngữ mới hơn. Mặc dù ban đầu tập trung vào những người dùng Cloud sớm nhất, chủ yếu là các nhà phát triển App Engine (môi trường tiêu chuẩn), nhưng loạt bài này đủ rộng để bao gồm các nền tảng không máy chủ khác như Cloud Functions và Cloud Run, hoặc ở những nơi khác nếu có thể.
Mục đích của lớp học lập trình này là hướng dẫn nhà phát triển App Engine Python 2 cách di chuyển từ Hàng đợi tác vụ App Engine (tác vụ đẩy) sang Cloud Tasks. Ngoài ra, còn có một quy trình di chuyển ngầm từ App Engine NDB sang Cloud NDB để truy cập vào Datastore (chủ yếu được đề cập trong Mô-đun 2).
Chúng tôi đã thêm việc sử dụng các tác vụ đẩy trong Mô-đun 7 và di chuyển việc sử dụng đó sang Cloud Tasks trong Mô-đun 8, sau đó tiếp tục với Python 3 và Cloud Datastore trong Mô-đun 9. Những người sử dụng Hàng đợi tác vụ cho các tác vụ kéo sẽ di chuyển sang Cloud Pub/Sub và nên tham khảo các Mô-đun 18-19.
Bạn sẽ tìm hiểu cách
- Thay thế việc sử dụng Hàng đợi tác vụ App Engine (tác vụ đẩy) bằng Cloud Tasks
- Thay thế việc sử dụng App Engine NDB bằng Cloud NDB (xem thêm Mô-đun 2)
Bạn cần có
- Một dự án trên Google Cloud có tài khoản thanh toán GCP đang hoạt động
- Kỹ năng cơ bản về Python
- Có kiến thức cơ bản về các lệnh Linux thường dùng
- Kiến thức cơ bản về cách phát triển và triển khai các ứng dụng App Engine
- Một ứng dụng App Engine hoạt động được trong Mô-đun 7 (hoàn thành lớp học lập trình của mô-đun này [nên dùng] hoặc sao chép ứng dụng từ kho lưu trữ)
Khảo sát
Bạn sẽ sử dụng hướng dẫn này như thế nào?
Bạn đánh giá thế nào về trải nghiệm của mình với Python?
Bạn đánh giá thế nào về trải nghiệm khi sử dụng các dịch vụ của Google Cloud?
2. Thông tin khái quát
Hàng đợi tác vụ App Engine hỗ trợ cả tác vụ đẩy và kéo. Để cải thiện khả năng di chuyển ứng dụng, nhóm Google Cloud đề xuất bạn di chuyển từ các dịch vụ cũ đi kèm (chẳng hạn như Hàng đợi tác vụ) sang các dịch vụ tương đương độc lập trên Cloud hoặc của bên thứ ba.
- Người dùng Task Queue push task (tác vụ đẩy Hàng đợi tác vụ) nên di chuyển sang Cloud Tasks.
- Người dùng kéo tác vụ của Hàng đợi tác vụ nên di chuyển sang Cloud Pub/Sub.
Việc di chuyển tác vụ kéo được đề cập trong Các mô-đun di chuyển 18-19, trong khi Các mô-đun 7-9 tập trung vào việc di chuyển tác vụ đẩy. Để di chuyển từ các tác vụ đẩy của Hàng đợi tác vụ App Engine, chúng tôi đã thêm việc sử dụng hàng đợi này vào ứng dụng mẫu App Engine hiện có bằng Python 2. Ứng dụng này sẽ đăng ký lượt truy cập trang mới và hiển thị các lượt truy cập gần đây nhất. Lớp học lập trình Mô-đun 7 thêm một tác vụ đẩy để xoá các lượt truy cập cũ nhất. Các lượt truy cập này sẽ không bao giờ xuất hiện nữa, vậy tại sao chúng lại chiếm thêm bộ nhớ trong kho dữ liệu? Lớp học lập trình Mô-đun 8 này vẫn giữ nguyên chức năng nhưng di chuyển cơ chế xếp hàng cơ bản từ các tác vụ đẩy Hàng đợi tác vụ sang Cloud Tasks, cũng như lặp lại quá trình di chuyển Mô-đun 2 từ App Engine NDB sang Cloud NDB để truy cập vào Datastore.
Hướng dẫn này có các bước sau:
- Thiết lập/Công việc chuẩn bị
- Cập nhật cấu hình
- Sửa đổi mã xử lý ứng dụng
3. Thiết lập/Công việc chuẩn bị
Phần này giải thích cách:
- Thiết lập dự án trên đám mây
- Tải ứng dụng mẫu cơ sở
- (Triển khai lại) và xác thực ứng dụng cơ sở
- Bật các dịch vụ/API mới của Google Cloud
Các bước này đảm bảo bạn bắt đầu bằng mã hoạt động và ứng dụng mẫu của bạn đã sẵn sàng để di chuyển sang các dịch vụ trên đám mây.
1. Thiết lập dự án
Nếu bạn đã hoàn thành lớp học lập trình Mô-đun 7, hãy dùng lại chính dự án (và mã) đó. Ngoài ra, bạn có thể tạo một dự án hoàn toàn mới hoặc sử dụng lại một dự án hiện có khác. Đảm bảo dự án có một tài khoản thanh toán đang hoạt động và một ứng dụng App Engine đã bật. Tìm mã dự án vì bạn cần có mã này trong lớp học lập trình này, hãy sử dụng mã dự án bất cứ khi nào bạn gặp biến PROJECT_ID.
2. Tải ứng dụng mẫu cơ sở
Một trong những điều kiện tiên quyết là ứng dụng App Engine trong Mô-đun 7 phải hoạt động: hoàn thành lớp học lập trình Mô-đun 7 (nên dùng) hoặc sao chép ứng dụng Mô-đun 7 từ kho lưu trữ. Cho dù bạn sử dụng mã của mình hay của chúng tôi, mã của Mô-đun 7 sẽ là nơi chúng ta bắt đầu ("START"). Lớp học lập trình này sẽ hướng dẫn bạn quy trình di chuyển, kết thúc bằng mã tương tự như mã trong thư mục kho lưu trữ của Mô-đun 8 ("FINISH").
- BẮT ĐẦU: Kho lưu trữ mô-đun 7
- HOÀN TẤT: Kho lưu trữ mô-đun 8
- Toàn bộ kho lưu trữ (sao chép hoặc tải tệp ZIP xuống)
Bất kể bạn sử dụng ứng dụng nào trong Mô-đun 7, thư mục sẽ có dạng như bên dưới, có thể có cả thư mục lib:
$ ls README.md appengine_config.py requirements.txt app.yaml main.py templates
3. (Triển khai lại) và xác thực ứng dụng cơ sở
Thực hiện các bước sau để triển khai ứng dụng Mô-đun 7:
- Xoá thư mục
lib(nếu có) rồi chạypip install -t lib -r requirements.txtđể điền lạilib. Bạn có thể cần dùngpip2nếu đã cài đặt cả Python 2 và 3 trên máy phát triển. - Đảm bảo bạn đã cài đặt và khởi chạy công cụ dòng lệnh
gcloud, đồng thời đã xem xét cách sử dụng công cụ này. - (không bắt buộc) Đặt dự án trên Đám mây bằng
gcloud config set projectPROJECT_IDnếu bạn không muốn nhậpPROJECT_IDcho mỗi lệnhgcloudmà bạn đưa ra. - Triển khai ứng dụng mẫu bằng
gcloud app deploy - Xác nhận rằng ứng dụng chạy như mong đợi mà không gặp vấn đề. Nếu bạn đã hoàn thành lớp học lập trình Mô-đun 7, thì ứng dụng sẽ hiển thị những khách truy cập hàng đầu cùng với những lượt truy cập gần đây nhất (minh hoạ bên dưới). Ở dưới cùng là thông tin về những việc cần làm cũ sẽ bị xoá.

4. Bật các dịch vụ/API mới của Google Cloud
Ứng dụng cũ sử dụng các dịch vụ đi kèm của App Engine mà không yêu cầu thiết lập bổ sung, nhưng các dịch vụ Cloud độc lập thì có, và ứng dụng đã cập nhật sẽ sử dụng cả Cloud Tasks và Cloud Datastore (thông qua thư viện ứng dụng Cloud NDB). Một số sản phẩm trên Cloud có hạn mức "Luôn miễn phí", bao gồm App Engine, Cloud Datastore và Cloud Tasks. Miễn là bạn không vượt quá những giới hạn đó, bạn sẽ không phải trả phí khi hoàn thành hướng dẫn này. Bạn có thể bật Cloud API từ Cloud Console hoặc từ dòng lệnh, tuỳ theo lựa chọn ưu tiên của bạn.
Trên Cloud Console
Chuyển đến trang Thư viện của Trình quản lý API (cho đúng dự án) trong Cloud Console, rồi tìm API Cloud Datastore và Cloud Tasks bằng thanh tìm kiếm ở giữa trang:

Nhấp vào nút Bật cho từng API riêng biệt – bạn có thể được nhắc cung cấp thông tin thanh toán. Đây là một ví dụ minh hoạ trang Thư viện API Cloud Pub/Sub (không bật API Pub/Sub cho lớp học lập trình này, chỉ bật Cloud Tasks và Datastore):

Từ dòng lệnh
Mặc dù việc bật API từ bảng điều khiển có thể cung cấp thông tin trực quan, nhưng một số người lại thích dòng lệnh. Phát lệnh gcloud services enable cloudtasks.googleapis.com datastore.googleapis.com để bật cả hai API cùng một lúc:
$ gcloud services enable cloudtasks.googleapis.com datastore.googleapis.com Operation "operations/acat.p2-aaa-bbb-ccc-ddd-eee-ffffff" finished successfully.
Bạn có thể được nhắc nhập thông tin thanh toán. Nếu muốn bật các Cloud API khác và muốn biết "URI" của các API đó, bạn có thể tìm thấy chúng ở cuối trang Thư viện của mỗi API. Ví dụ: hãy quan sát pubsub.googleapis.com là "Tên dịch vụ" ở cuối trang Pub/Sub ngay phía trên.
Sau khi hoàn tất các bước này, dự án của bạn sẽ có thể truy cập vào các API. Giờ là lúc cập nhật ứng dụng để sử dụng các API đó.
4. Cập nhật cấu hình
Nội dung cập nhật trong cấu hình là do việc sử dụng các thư viện ứng dụng Cloud. Bất kể bạn sử dụng(những) thư viện nào, bạn đều phải thực hiện những thay đổi tương tự đối với các ứng dụng không sử dụng bất kỳ thư viện ứng dụng Cloud nào.
requirements.txt
Mô-đun 8 thay thế việc sử dụng App Engine NDB và Hàng đợi tác vụ trong Mô-đun 1 bằng Cloud NDB và Cloud Tasks. Nối cả google-cloud-ndb và google-cloud-tasks vào requirements.txt để kết hợp flask từ Mô-đun 7:
flask
google-cloud-ndb
google-cloud-tasks
Tệp requirements.txt này không có số phiên bản, tức là các phiên bản mới nhất sẽ được chọn. Nếu có bất kỳ điểm không tương thích nào, hãy chỉ định số phiên bản để khoá các phiên bản hoạt động cho ứng dụng.
app.yaml
Khi sử dụng thư viện ứng dụng Cloud, thời gian chạy App Engine Python 2 yêu cầu các gói cụ thể của bên thứ ba, cụ thể là grpcio và setuptools. Người dùng Python 2 phải liệt kê các thư viện tích hợp như thế này cùng với phiên bản hiện có hoặc "mới nhất" trong app.yaml. Nếu bạn chưa có phần libraries, hãy tạo một phần và thêm cả hai thư viện như sau:
libraries:
- name: grpcio
version: latest
- name: setuptools
version: latest
Khi di chuyển ứng dụng của bạn, ứng dụng đó có thể đã có một phần libraries. Nếu có, nhưng thiếu grpcio và setuptools, bạn chỉ cần thêm chúng vào phần libraries hiện có. app.yaml được cập nhật giờ đây sẽ có dạng như sau:
runtime: python27
threadsafe: yes
api_version: 1
handlers:
- url: /.*
script: main.app
libraries:
- name: grpcio
version: latest
- name: setuptools
version: latest
appengine_config.py
Lệnh gọi google.appengine.ext.vendor.add() trong appengine_config.py kết nối các thư viện bên thứ ba đã sao chép (đôi khi được gọi là "vendoring" hoặc "self-bundling") trong lib với ứng dụng của bạn. Ở trên trong app.yaml, chúng tôi đã thêm các thư viện bên thứ ba tích hợp sẵn và những thư viện đó cần setuptools.pkg_resources.working_set.add_entry() để liên kết ứng dụng của bạn với những gói tích hợp sẵn đó trong lib. Dưới đây là appengine_config.py ban đầu của Mô-đun 1 và sau khi bạn thực hiện các nội dung cập nhật của Mô-đun 8:
TRƯỚC:
from google.appengine.ext import vendor
# Set PATH to your libraries folder.
PATH = 'lib'
# Add libraries installed in the PATH folder.
vendor.add(PATH)
SAU:
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)
Bạn cũng có thể xem nội dung mô tả tương tự trong tài liệu di chuyển App Engine.
5. Sửa đổi mã xử lý ứng dụng
Phần này trình bày các nội dung cập nhật cho tệp ứng dụng chính, main.py, thay thế việc sử dụng hàng đợi đẩy của Hàng đợi tác vụ App Engine bằng Cloud Tasks. Không có thay đổi nào đối với mẫu web templates/index.html – cả hai ứng dụng sẽ hoạt động giống hệt nhau, hiển thị cùng một dữ liệu. Các điểm cần làm để sửa đổi ứng dụng chính được chia thành 4 mục sau:
- Cập nhật các hoạt động nhập và khởi tạo
- Cập nhật chức năng mô hình dữ liệu (Cloud NDB)
- Di chuyển sang Cloud Tasks (và Cloud NDB)
- Trình xử lý tác vụ cập nhật (đẩy)
1. Cập nhật các hoạt động nhập và khởi tạo
- Thay thế NDB (
google.appengine.ext.ndb) và Hàng đợi tác vụ (google.appengine.api.taskqueue) của App Engine bằng NDB (google.cloud.ndb) và Cloud Tasks (google.cloud.tasks) của Cloud tương ứng. - Thư viện ứng dụng đám mây yêu cầu khởi chạy và tạo "ứng dụng API", chỉ định các ứng dụng này cho
ds_clientvàts_clienttương ứng. - Tài liệu về Hàng đợi tác vụ nêu rõ: "App Engine cung cấp một hàng đợi đẩy mặc định có tên là
default, được định cấu hình và sẵn sàng sử dụng với các chế độ cài đặt mặc định". Cloud Tasks không cung cấp hàng đợidefault(vì đây là một sản phẩm Cloud độc lập không phụ thuộc vào App Engine), nên bạn cần có mã mới để tạo hàng đợi Cloud Tasks có tên làdefault. - Hàng đợi tác vụ của App Engine không yêu cầu bạn chỉ định một khu vực vì nó sử dụng khu vực mà ứng dụng của bạn chạy. Tuy nhiên, vì Cloud Tasks hiện là một sản phẩm độc lập, nên bắt buộc phải có một khu vực và khu vực đó phải khớp với khu vực mà ứng dụng của bạn chạy. Bạn cần có tên khu vực và mã dự án trên đám mây để tạo "tên đường dẫn đủ điều kiện" làm giá trị nhận dạng riêng biệt của hàng đợi.
Các nội dung cập nhật được mô tả trong dấu đầu dòng thứ ba và thứ tư ở trên chiếm phần lớn các hằng số và quá trình khởi tạo bổ sung cần thiết. Hãy xem phần "trước" và "sau" bên dưới rồi thực hiện những thay đổi này ở đầu main.py.
TRƯỚC:
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__)
SAU:
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. Cập nhật chức năng mô hình dữ liệu (Cloud NDB)
App Engine NDB và Cloud NDB hoạt động gần như giống hệt nhau. Không có thay đổi lớn nào đối với mô hình dữ liệu cũng như hàm store_visit(). Điểm khác biệt đáng chú ý duy nhất là việc tạo thực thể Visit trong store_visit() hiện được đóng gói bên trong một khối with Python. Cloud NDB yêu cầu mọi quyền truy cập vào Datastore đều được kiểm soát trong trình quản lý bối cảnh của nó, do đó có câu lệnh with. Các đoạn mã dưới đây minh hoạ điểm khác biệt nhỏ này khi di chuyển sang Cloud NDB. Triển khai thay đổi này.
TRƯỚC:
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()
SAU:
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. Di chuyển sang Cloud Tasks (và Cloud NDB)
Thay đổi quan trọng nhất trong quá trình di chuyển này là chuyển đổi cơ sở hạ tầng xếp hàng cơ bản. Điều này diễn ra trong hàm fetch_visits(), nơi một tác vụ (đẩy) để xoá các lượt truy cập cũ được tạo và đưa vào hàng đợi để thực thi. Tuy nhiên, chức năng ban đầu của Mô-đun 7 vẫn được giữ nguyên:
- Truy vấn các lượt truy cập gần đây nhất.
- Thay vì trả về ngay những lượt truy cập đó, hãy lưu dấu thời gian của
Visitgần đây nhất, cũ nhất được hiển thị. Bạn có thể xoá tất cả các lượt truy cập cũ hơn dấu thời gian này. - Trích xuất dấu thời gian dưới dạng số thực và chuỗi bằng các tiện ích Python tiêu chuẩn, đồng thời sử dụng cả hai trong nhiều trường hợp, chẳng hạn như hiển thị cho người dùng, thêm vào nhật ký, truyền đến trình xử lý, v.v.
- Tạo một tác vụ đẩy có dấu thời gian này làm tải trọng cùng với
/trimlàm URL. - Trình xử lý tác vụ cuối cùng sẽ được gọi thông qua một
POSTHTTP đến URL đó.
Quy trình này được minh hoạ bằng đoạn mã "trước":
TRƯỚC:
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
Mặc dù chức năng vẫn giữ nguyên, nhưng Cloud Tasks sẽ trở thành nền tảng thực thi. Các bản cập nhật để thực hiện thay đổi này bao gồm:
- Bao bọc truy vấn
Visitbên trong khốiwithcủa Python (lặp lại quy trình di chuyển Mô-đun 2 sang Cloud NDB) - Tạo siêu dữ liệu Cloud Tasks, bao gồm các thuộc tính dự kiến như tải trọng dấu thời gian và URL, nhưng cũng thêm loại MIME và mã hoá JSON cho tải trọng.
- Sử dụng ứng dụng Cloud Tasks API để tạo tác vụ có siêu dữ liệu và tên đường dẫn đầy đủ của hàng đợi.
Những thay đổi này đối với fetch_visits() được minh hoạ bên dưới:
SAU:
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. Trình xử lý tác vụ cập nhật (đẩy)
Hàm trình xử lý tác vụ (đẩy) không yêu cầu các bản cập nhật lớn; hàm này chỉ yêu cầu thực thi. Điều này áp dụng cho Hàng đợi tác vụ hoặc Cloud Tasks. "Mã là mã", họ nói vậy. Tuy nhiên, có một số thay đổi nhỏ:
- Tải trọng dấu thời gian được truyền nguyên văn đến Hàng đợi tác vụ, nhưng được mã hoá JSON cho Cloud Tasks và do đó, phải được phân tích cú pháp JSON khi đến.
- Lệnh gọi HTTP
POSTđến/trimbằng Hàng đợi tác vụ có MIMEtype ngầm làapplication/x-www-form-urlencoded, nhưng với Cloud Tasks, lệnh gọi này được chỉ định rõ ràng làapplication/json, vì vậy, có một cách hơi khác để trích xuất tải trọng. - Sử dụng trình quản lý bối cảnh ứng dụng Cloud NDB API (Di chuyển mô-đun 2 sang Cloud NDB).
Dưới đây là các đoạn mã trước và sau khi thực hiện những thay đổi này đối với trình xử lý tác vụ, trim():
TRƯỚC:
@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
SAU:
@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
Không có bản cập nhật nào cho trình xử lý ứng dụng chính root() cũng như mẫu web templates/index.html.
6. Tóm tắt/Dọn dẹp
Phần này kết thúc lớp học lập trình bằng cách triển khai ứng dụng, xác minh rằng ứng dụng hoạt động như dự kiến và trong mọi đầu ra được phản ánh. Sau khi xác thực ứng dụng, hãy dọn dẹp mọi thứ và cân nhắc các bước tiếp theo.
Triển khai và xác minh ứng dụng
Triển khai ứng dụng bằng gcloud app deploy. Đầu ra sẽ giống hệt như ứng dụng trong Mô-đun 7, nhưng bạn nhận ra rằng mình đã chuyển sang một sản phẩm hàng đợi đẩy hoàn toàn khác, giúp ứng dụng của bạn có tính di động cao hơn trước!

Dọn dẹp
Giải pháp chung
Nếu đã hoàn tất, bạn nên tắt ứng dụng App Engine để tránh bị tính phí. Tuy nhiên, nếu muốn kiểm thử hoặc thử nghiệm thêm, nền tảng App Engine có một hạn mức miễn phí. Vì vậy, miễn là không vượt quá cấp sử dụng đó, bạn sẽ không bị tính phí. Đó là mức phí cho hoạt động tính toán, nhưng cũng có thể có các khoản phí cho các dịch vụ App Engine có liên quan. Vì vậy, hãy xem trang định giá của dịch vụ này để biết thêm thông tin. Nếu quá trình di chuyển này liên quan đến các dịch vụ đám mây khác, thì các dịch vụ đó sẽ được tính phí riêng. Trong cả hai trường hợp, nếu có, hãy xem phần "Cụ thể cho lớp học lập trình này" bên dưới.
Để công bố đầy đủ, việc triển khai trên một nền tảng điện toán không máy chủ của Google Cloud như App Engine sẽ phát sinh một khoản chi phí nhỏ cho việc tạo và lưu trữ. Cloud Build có hạn mức miễn phí riêng, tương tự như Cloud Storage. Việc lưu trữ hình ảnh đó sẽ chiếm một phần hạn mức. Tuy nhiên, có thể bạn sinh sống ở một khu vực không có gói miễn phí như vậy, vì vậy, hãy lưu ý đến mức sử dụng bộ nhớ để giảm thiểu chi phí phát sinh. Bạn nên xem xét các "thư mục" cụ thể trên Cloud Storage, bao gồm:
console.cloud.google.com/storage/browser/LOC.artifacts.PROJECT_ID.appspot.com/containers/imagesconsole.cloud.google.com/storage/browser/staging.PROJECT_ID.appspot.com- Các đường liên kết đến bộ nhớ ở trên phụ thuộc vào
PROJECT_IDvà *LOC*của bạn, ví dụ: "us" nếu ứng dụng của bạn được lưu trữ ở Hoa Kỳ.
Mặt khác, nếu bạn không tiếp tục với ứng dụng này hoặc các lớp học lập trình di chuyển có liên quan khác và muốn xoá hoàn toàn mọi thứ, hãy tắt dự án của bạn.
Cụ thể đối với lớp học lập trình này
Các dịch vụ trong danh sách dưới đây là riêng biệt đối với lớp học lập trình này. Hãy tham khảo tài liệu của từng sản phẩm để biết thêm thông tin:
- Cloud Tasks có một cấp miễn phí; hãy xem trang thông tin về giá của dịch vụ này để biết thêm thông tin chi tiết.
- Dịch vụ App Engine Datastore do Cloud Datastore (Cloud Firestore ở chế độ Datastore) cung cấp, dịch vụ này cũng có một cấp miễn phí; hãy xem trang định giá của dịch vụ này để biết thêm thông tin.
Các bước tiếp theo
Như vậy là chúng ta đã hoàn tất việc di chuyển từ các tác vụ đẩy của Hàng đợi tác vụ App Engine sang Cloud Tasks. Nếu bạn muốn tiếp tục chuyển ứng dụng này sang Python 3 và di chuyển xa hơn nữa sang Cloud Datastore từ Cloud NDB, hãy cân nhắc Mô-đun 9.
Cloud NDB được thiết kế dành riêng cho nhà phát triển Python 2 App Engine, mang đến trải nghiệm người dùng gần như giống hệt nhau, nhưng Cloud Datastore có thư viện ứng dụng gốc riêng dành cho người dùng không phải App Engine hoặc người dùng App Engine mới (Python 3). Tuy nhiên, vì Cloud NDB có sẵn cho Python 2 và 3, nên bạn không cần phải di chuyển sang Cloud Datastore.
Cloud NDB và Cloud Datastore đều truy cập vào Datastore (mặc dù theo những cách khác nhau), vì vậy, lý do duy nhất để cân nhắc việc chuyển sang Cloud Datastore là nếu bạn đã có các ứng dụng khác (đặc biệt là các ứng dụng không phải App Engine) đang sử dụng Cloud Datastore và muốn chuẩn hoá trên một thư viện máy khách Datastore duy nhất. Quá trình di chuyển không bắt buộc này từ Cloud NDB sang Cloud Datastore cũng được đề cập riêng (không có Hàng đợi tác vụ hoặc Cloud Tasks) trong Mô-đun 3.
Ngoài các mô-đun 3, 8 và 9, bạn cũng nên cân nhắc những mô-đun di chuyển khác tập trung vào việc chuyển từ các dịch vụ đi kèm cũ của App Engine:
- Module 2: migrate from App Engine NDB to Cloud NDB
- Các mô-đun 12 – 13: di chuyển từ App Engine Memcache sang Cloud Memorystore
- Các mô-đun 15-16: di chuyển từ Blobstore của App Engine sang Cloud Storage
- Các mô-đun 18-19: Hàng đợi tác vụ App Engine (kéo tác vụ) đến Cloud Pub/Sub
App Engine không còn là nền tảng duy nhất không cần máy chủ trên Google Cloud nữa. Nếu bạn có một ứng dụng App Engine nhỏ hoặc một ứng dụng có chức năng hạn chế và muốn biến ứng dụng đó thành một vi dịch vụ độc lập, hoặc bạn muốn chia một ứng dụng nguyên khối thành nhiều thành phần có thể dùng lại, thì đây là những lý do chính đáng để cân nhắc việc chuyển sang Cloud Functions. Nếu việc tạo vùng chứa đã trở thành một phần trong quy trình phát triển ứng dụng của bạn, đặc biệt là nếu quy trình này bao gồm một quy trình CI/CD (tích hợp liên tục/phân phối liên tục hoặc triển khai liên tục), hãy cân nhắc việc di chuyển sang Cloud Run. Các trường hợp này được đề cập trong các mô-đun sau:
- Di chuyển từ App Engine sang Cloud Functions: xem Mô-đun 11
- Di chuyển từ App Engine sang Cloud Run: xem Mô-đun 4 để đóng gói ứng dụng của bạn bằng Docker hoặc Mô-đùn 5 để thực hiện việc này mà không cần vùng chứa, kiến thức về Docker hoặc
Dockerfile
Bạn không bắt buộc phải chuyển sang một nền tảng không máy chủ khác. Bạn nên cân nhắc những lựa chọn phù hợp nhất cho ứng dụng và trường hợp sử dụng của mình trước khi thực hiện bất kỳ thay đổi nào.
Bất kể bạn cân nhắc mô-đun di chuyển nào tiếp theo, bạn đều có thể truy cập vào tất cả nội dung của Serverless Migration Station (lớp học lập trình, video, mã nguồn [nếu có]) tại kho lưu trữ nguồn mở. README của kho lưu trữ này cũng cung cấp hướng dẫn về những hoạt động di chuyển cần cân nhắc và "thứ tự" liên quan của các Mô-đun di chuyển.
7. Tài nguyên khác
Dưới đây là các tài nguyên bổ sung dành cho những nhà phát triển muốn tìm hiểu thêm về Mô-đun di chuyển này hoặc các mô-đun di chuyển có liên quan, cũng như các sản phẩm có liên quan. Trong đó có những nơi để bạn gửi ý kiến phản hồi về nội dung này, đường liên kết đến mã và nhiều phần tài liệu mà bạn có thể thấy hữu ích.
Vấn đề/ý kiến phản hồi về Lớp học lập trình
Nếu bạn gặp vấn đề với lớp học lập trình này, vui lòng tìm kiếm vấn đề của bạn trước khi báo cáo. Đường liên kết để tìm kiếm và tạo vấn đề mới:
Tài nguyên di chuyển
Bạn có thể tìm thấy đường liên kết đến các thư mục kho lưu trữ cho Mô-đun 7 (BẮT ĐẦU) và Mô-đun 8 (KẾT THÚC) trong bảng bên dưới.
Lớp học lập trình | Python 2 | Python 3 |
mã (không có trong hướng dẫn này) | ||
Học phần 8 (lớp học lập trình này) | (không áp dụng) |
Tài nguyên trực tuyến
Dưới đây là các tài nguyên trực tuyến có thể liên quan đến hướng dẫn này:
Hàng đợi tác vụ App Engine và Cloud Tasks
- Tổng quan về Hàng đợi tác vụ của App Engine
- Tổng quan về hàng đợi đẩy của Hàng đợi tác vụ App Engine
- Di chuyển các tác vụ đẩy của Hàng đợi tác vụ App Engine sang Cloud Tasks
- Mẫu tài liệu về việc đẩy các việc cần làm trong Hàng đợi việc cần làm của App Engine sang Cloud Tasks
- Tài liệu về Cloud Tasks
- Các mẫu thư viện ứng dụng Cloud Tasks Python
- Thông tin về giá của Cloud Tasks
App Engine NDB và Cloud NDB (Datastore)
- Tài liệu về NDB của App Engine
- Kho lưu trữ NDB của App Engine
- Tài liệu về NDB của Google Cloud
- Kho lưu trữ NDB của Google Cloud
- Thông tin về giá của Cloud Datastore
Nền tảng App Engine
- Tài liệu về App Engine
- Thời gian chạy Python 2 App Engine (môi trường tiêu chuẩn)
- Sử dụng các thư viện tích hợp sẵn của App Engine trên App Engine Python 2
- Thời gian chạy Python 3 App Engine (môi trường tiêu chuẩn)
- Sự khác biệt giữa thời gian chạy Python 2 và 3 App Engine (môi trường tiêu chuẩn)
- Hướng dẫn di chuyển ứng dụng từ Python 2 sang Python 3 trên App Engine (môi trường tiêu chuẩn)
- Thông tin về giá và hạn mức của App Engine
- Ra mắt nền tảng App Engine thế hệ thứ hai (2018)
- So sánh nền tảng thế hệ thứ nhất và thứ hai
- Hỗ trợ dài hạn cho các thời gian chạy cũ
- Các mẫu di chuyển tài liệu
- Các mẫu di chuyển do cộng đồng đóng góp
Thông tin khác về Cloud
- Python trên Google Cloud Platform
- Thư viện ứng dụng Google Cloud Python
- Cấp "Luôn miễn phí" của Google Cloud
- SDK Google Cloud (công cụ dòng lệnh
gcloud) - Tất cả tài liệu của Google Cloud
Video
- Serverless Migration Station
- Expeditions không cần máy chủ
- Đăng ký theo dõi Google Cloud Tech
- Đăng ký theo dõi Google Developers
Giấy phép
Tác phẩm này được cấp phép theo giấy phép Ghi công theo Creative Commons 2.0 Chung.