Di chuyển từ Hàng đợi tác vụ của App Engine Đẩy nhiệm vụ sang Cloud Tasks (Mô-đun 8)

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

Bạn cần có

Khảo sát

Bạn sẽ sử dụng hướng dẫn này như thế nào?

Chỉ đọc qua Đọc và hoàn thành các bài tập

Bạn đánh giá thế nào về trải nghiệm của mình với Python?

Người mới bắt đầu Trung cấp Thành thạo

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?

Người mới bắt đầu Trung cấp Thành thạo

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.

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:

  1. Thiết lập/Công việc chuẩn bị
  2. Cập nhật cấu hình
  3. 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:

  1. Thiết lập dự án trên đám mây
  2. Tải ứng dụng mẫu cơ sở
  3. (Triển khai lại) và xác thực ứng dụng cơ sở
  4. 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 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:

  1. Xoá thư mục lib (nếu có) rồi chạy pip install -t lib -r requirements.txt để điền lại lib. Bạn có thể cần dùng pip2 nếu đã cài đặt cả Python 2 và 3 trên máy phát triển.
  2. Đảm bảo bạn đã cài đặtkhở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.
  3. (không bắt buộc) Đặt dự án trên Đám mây bằng gcloud config set project PROJECT_ID nếu bạn không muốn nhập PROJECT_ID cho mỗi lệnh gcloud mà bạn đưa ra.
  4. Triển khai ứng dụng mẫu bằng gcloud app deploy
  5. 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á.

4aa8a2cb5f527079.png

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 DatastoreCloud 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:

c7a740304e9d35b.png

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

1b6c0a2a73124f6b.jpeg

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-ndbgoogle-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à grpciosetuptools. 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ể đã một phần libraries. Nếu có, nhưng thiếu grpciosetuptools, 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:

  1. Cập nhật các hoạt động nhập và khởi tạo
  2. Cập nhật chức năng mô hình dữ liệu (Cloud NDB)
  3. Di chuyển sang Cloud Tasks (và Cloud NDB)
  4. 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

  1. 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.
  2. 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_clientts_client tương ứng.
  3. 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 đợi default (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.
  4. 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:

  1. Truy vấn các lượt truy cập gần đây nhất.
  2. Thay vì trả về ngay những lượt truy cập đó, hãy lưu dấu thời gian của Visit gầ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.
  3. 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.
  4. 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 /trim làm URL.
  5. Trình xử lý tác vụ cuối cùng sẽ được gọi thông qua một POST HTTP đế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:

  1. Bao bọc truy vấn Visit bên trong khối with của Python (lặp lại quy trình di chuyển Mô-đun 2 sang Cloud NDB)
  2. 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.
  3. 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, một số thay đổi nhỏ:

  1. 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.
  2. Lệnh gọi HTTP POST đến /trim bằ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.
  3. 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!

4aa8a2cb5f527079.png

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/images
  • console.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_ID và *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:

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

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ô-đun 7

code

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

code

(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

App Engine NDB và Cloud NDB (Datastore)

Nền tảng App Engine

Thông tin khác về Cloud

Video

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.