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 về Trạm di chuyển không máy chủ (hướng dẫn thực hành theo tiến độ riêng) và video có liên quan nhằm giúp các nhà phát triển Google Cloud không máy chủ không 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 quá trình di chuyển, chủ yếu là ngừng sử dụng các dịch vụ cũ. Việc này giúp ứng dụng của bạn dễ di chuyển hơn, đồng thời mang đến cho bạn nhiều lựa chọn và độ 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 của Cloud hơn, đồng thời dễ dàng nâng cấp lên 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ó.

Mục đích của lớp học lập trình này là hướng dẫn các nhà phát triển App Engine Python 2 cách di chuyển từ Hàng đợi tác vụ của 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 đã bổ sung tính năng đẩy tác vụ trong Mô-đun 7 và di chuyển hoạt động sử dụng đó sang Cloud Tasks trong Mô-đun 8, sau đó tiếp tục chuyển sang Python 3 và Cloud Datastore trong Mô-đun 9. Những người sử dụng Hàng đợi tác vụ để kéo tác vụ sẽ di chuyển sang Cloud Pub/Sub và sẽ tham khảo 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 bài tập

Bạn đánh giá thế nào về trải nghiệm sử dụng Python?

Người mới tập Trung cấp Thành thạo

Bạn đánh giá thế nào về trải nghiệm sử dụng các dịch vụ của Google Cloud?

Người mới tập Trung cấp Thành thạo

2. Thông tin khái quát

Hàng đợi tác vụ của App Engine hỗ trợ cả tác vụ đẩy và kéo. Để cải thiện khả năng có thể di chuyển của ứng dụng, nhóm Google Cloud đề xuất di chuyển từ các dịch vụ đi kèm cũ (như Hàng đợi tác vụ) sang các dịch vụ độc lập khác của Google Cloud hoặc các dịch vụ tương đương của bên thứ ba.

Việc di chuyển tác vụ kéo được đề cập trong Mô-đun di chuyển 18-19 trong khi Mô-đun 7-9 tập trung vào di chuyển tác vụ đẩy. Để di chuyển từ các tác vụ đẩy trong Hàng đợi tác vụ của App Engine, chúng tôi đã thêm hoạt động sử dụng này vào ứng dụng mẫu Python 2 App Engine hiện có để đăng ký lượt truy cập trang mới và hiển thị những 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 lại. Vậy tại sao chúng lại chiếm thêm dung lượng lưu trữ trong Datastore? Lớp học lập trình Mô-đun 8 này giữ nguyên chức năng nhưng di chuyển cơ chế xếp hàng cơ bản từ Hàng đợi tác vụ để đẩy các tác vụ sang Cloud Tasks, đồng thời 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 bao gồm các bước sau:

  1. Thiết lập/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/Chuẩn bị

Phần này giải thích cách:

  1. Thiết lập dự án trên Cloud
  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 API/dịch vụ Google Cloud mới

Các bước này giúp đảm bảo bạn đang bắt đầu bằng đoạn mã đang 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ụ đá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 của Mô-đun 7, hãy sử dụng lại chính dự án (và đoạn mã) đó. Ngoài ra, hãy 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. Hãy đảm bảo dự án này có một tài khoản thanh toán đang hoạt động và có một ứng dụng App Engine đã bật. Tìm mã dự án của bạn khi cần có sẵn trong lớp học lập trình này, sử dụng mã này 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 Mô-đun 7 App Engine đang hoạt động: hoàn thành Lớp học lập trình Mô-đun 7 (nên có) 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 bạn hay mã của chúng tôi, mã Mô-đun 7 là nơi chúng ta sẽ bắt đầu ("BẮT ĐẦU"). Lớp học lập trình này sẽ hướng dẫn bạn thực hiện quá trình di chuyển, kết thúc bằng mã tương tự như những gì trong thư mục kho lưu trữ Mô-đun 8 ("Finish").

Bất kể bạn dùng ứng dụng Mô-đun 7 nào, thư mục đó sẽ có dạng như dưới đây, cũng 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 thi 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 phải sử dụng pip2 nếu đã cài đặt cả Python 2 và 3 trên máy phát triển.
  2. Hãy đảm bảo bạn đã cài đặtkhởi chạy công cụ dòng lệnh gcloud, đồng thời xem lại việc sử dụng công cụ này.
  3. (không bắt buộc) Thiết lập dự án trên Cloud bằng gcloud config set project PROJECT_ID nếu bạn không muốn nhập PROJECT_ID với mỗi lệnh gcloud 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 hoạt động như mong đợi mà không gặp vấn đề nào. Nếu bạn đã hoàn thành lớp học lập trình Mô-đun 7, ứng dụng sẽ hiển thị những khách truy cập hàng đầu cùng với các lượt truy cập gần đây nhất (minh hoạ bên dưới). Ở dưới cùng là thông báo về những việc cần làm cũ sẽ bị xoá.

4aa8a2cb5f527079.pngS

4. Bật các API/dịch vụ Google Cloud mới

Ứng dụng cũ sử dụng các dịch vụ đi kèm của App Engine không yêu cầu thiết lập bổ sung, nhưng các dịch vụ đám mây độc lập thì có. Ứng dụng mới 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 Cloud có trạng thái "Luôn miễn phí" hạn mức theo bậc, trong đó có App Engine, Cloud DatastoreCloud Tasks. Miễn là bạn không vượt quá các giới hạn đó, bạn sẽ không phải chịu phí khi hoàn tất hướng dẫn này. Tuỳ thuộc vào lựa chọn ưu tiên của bạn mà bạn có thể bật Cloud API từ Cloud Console hoặc bằng dòng lệnh.

Trên Cloud Console

Truy cập vào trang Thư viện của Trình quản lý API (để tìm đúng dự án) trong Cloud Console rồi tìm các 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à ví dụ về trang Thư viện API Cloud Pub/Sub (bạn không bật API Pub/Sub cho lớp học lập trình này mà chỉ bật Cloud Tasks và Datastore):

1b6c0a2a73124f6b.jpeg

Từ dòng lệnh

Mặc dù bảng điều khiển cung cấp nhiều thông tin về mặt hình ảnh, nhưng một số API lại thích dùng dòng lệnh hơn. Phát lệnh gcloud services enable cloudtasks.googleapis.com datastore.googleapis.com để bật cả hai API cùng 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 cung cấp thông tin thanh toán. Nếu bạn muốn bật các Cloud API khác và muốn biết các "URI" của các API đó bạn có thể tìm thấy ở cuối mỗi trang Thư viện của API. Ví dụ: quan sát pubsub.googleapis.com là "Tên dịch vụ" ở cuối trang Pub/Sub ngay phía trên.

Sau khi các bước này hoàn tất, dự án của bạn sẽ có thể truy cập vào các API này. Đã đến lúc cập nhật ứng dụng để sử dụng các API đó.

4. Cập nhật cấu hình

Các cập nhật về cấu hình được thể hiện rõ ràng là do việc sử dụng thêm Thư viện ứng dụng đám mây. Bất kể sử dụng(các) ứng dụng nào, bạn cũng phải thực hiện các thay đổi tương tự cho các ứng dụng không dùng bất kỳ thư viện ứng dụng Cloud nào.

requirements.txt

Mô-đun 8 trao đổi về cách sử dụng NDB và Hàng đợi tác vụ của App Engine từ Mô-đun 1 với Cloud NDB và Cloud Tasks. Thêm cả google-cloud-ndbgoogle-cloud-tasks vào requirements.txt để tham gia 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 nào, nghĩa là các phiên bản mới nhất đã được chọn. Nếu phát sinh bất kỳ sự 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 của ứng dụng.

app.yaml

Khi sử dụng thư viện ứng dụng Cloud, môi trường thời gian chạy Python 2 App Engine sẽ yêu cầu một số 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 sẵn như thế này cùng với phiên bản có sẵn 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 rồi 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ó, đồng thời 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 gọi là "cung cấp" hoặc "tự gộp") 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 tích hợp sẵn của bên thứ ba và những thư viện này cần setuptools.pkg_resources.working_set.add_entry() để liên kết ứng dụng của bạn với các gói tích hợp đó trong lib. Dưới đây là Phụ lục 1 appengine_config.py gốc và sau khi bạn cập nhật Phụ lục 8:

TRƯỚC KHI:

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

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 về việc di chuyển App Engine.

5. Sửa đổi mã xử lý ứng dụng

Phần này nêu bật 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 Hàng đợi tác vụ của 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 đều phải hoạt động giống nhau và cho thấy cùng một dữ liệu. Các sửa đổi đối với ứng dụng chính được chia thành 4 việc "cần làm" sau:

  1. Cập nhật lệnh nhập và khởi chạy
  2. Cập nhật chức năng của mô hình dữ liệu (Cloud NDB)
  3. Di chuyển sang Cloud Tasks (và Cloud NDB)
  4. Cập nhật trình xử lý tác vụ (đẩy)

1. Cập nhật lệnh nhập và khởi chạy

  1. Thay thế App Engine NDB (google.appengine.ext.ndb) và Hàng đợi tác vụ (google.appengine.api.taskqueue) bằng Cloud NDB (google.cloud.ndb) và Cloud Tasks (google.cloud.tasks).
  2. Thư viện ứng dụng trên đám mây yêu cầu khởi chạy và tạo "ứng dụng API;" hãy chỉ định chúng lần lượt cho ds_clientts_client.
  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, 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), vì vậy, 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 khu vực vì khu vực này 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 dịch vụ này cần 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 phải nhập tên khu vực và mã dự án trên Cloud để tạo "tên đường dẫn đủ điều kiện" làm giá trị nhận dạng duy nhấ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 tạo thành phần lớn các hằng số và hoạt động khởi tạo bổ sung cần thiết. Xem trong phần "trước" và "after" bên dưới và thực hiện các thay đổi này ở đầu main.py.

TRƯỚC KHI:

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

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 của mô hình dữ liệu (Cloud NDB)

App Engine NDB và Cloud NDB hoạt động gần giống nhau. Không có thay đổi lớn nào đối với mô hình dữ liệu và hàm store_visit(). Điểm khác biệt duy nhất đáng chú ý 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 kiểm soát tất cả quyền truy cập vào Datastore trong trình quản lý ngữ cảnh, do đó, 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 KHI:

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

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 sẽ chuyển cơ sở hạ tầng xếp hàng cơ bản. Việc này diễn ra trong hàm fetch_visits(), trong đó 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 trong Mô-đun 7 vẫn giữ nguyên:

  1. Truy vấn về các lượt truy cập gần đây nhất.
  2. Thay vì trả lại các lượt truy cập đó ngay lập tức, hãy lưu dấu thời gian của Visit cuối cùng, trang 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 thời gian này.
  3. Giới thiệu dấu thời gian dưới dạng số thực và chuỗi bằng cách sử dụng các tiện ích Python tiêu chuẩn và sử dụng cả hai với nhiều khả năng, ví dụ: hiển thị cho người dùng, thêm vào nhật ký, truyền vào trình xử lý, v.v.
  4. Tạo một tác vụ đẩy có dấu thời gian này là tải trọng cùng với /trim là URL.
  5. Cuối cùng, trình xử lý tác vụ sẽ được gọi qua HTTP POST tới URL đó.

Quy trình làm việc này được minh hoạ bằng quy tắc "trước" đoạn mã:

TRƯỚC KHI:

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, Cloud Tasks sẽ trở thành nền tảng thực thi. Những cập nhật để thực hiện thay đổi này bao gồm:

  1. Gói truy vấn Visit bên trong khối with Python (di chuyển Mô-đun 2 lặp lại 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, đồng thời thêm loại MIME và mã hoá JSON cho tải trọng đó.
  3. Dùng ứng dụng Cloud Tasks API để tạo tác vụ bằng 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 KHI:

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. Cập nhật trình xử lý tác vụ (đẩy)

Chức năng trình xử lý tác vụ (đẩy) không yêu cầu các bản cập nhật lớn; nó chỉ yêu cầu thực thi. Cách này áp dụng cho Hàng đợi tác vụ hoặc Tác vụ trên đám mây. "Mã chính là mã" vì vậy họ nói. 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 vào Hàng đợi tác vụ, nhưng được mã hoá JSON cho Cloud Tasks nên phải được phân tích cú pháp JSON khi đến.
  2. Lệnh gọi HTTP POST đến /trim với Hàng đợi tác vụ có MIMEtype ngầm ẩn 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, bạn có thể trích xuất tải trọng theo một cách hơi khác.
  3. Sử dụng trình quản lý ngữ cảnh ứng dụng Cloud NDB API (Di chuyển mô-đun 2 sang Cloud NDB).

Dưới đây là đoạn mã trước và sau khi thực hiện các thay đổi này đối với trình xử lý tác vụ, trim():

TRƯỚC KHI:

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

@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 đối với 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 tóm tắt lớp học lập trình này 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 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. Kết quả sẽ giống với ứng dụng Mô-đun 7, nhưng hãy nhận ra rằng bạn đã thay đổi 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 dễ di chuyển hơn trước đây!

4aa8a2cb5f527079.pngS

Dọn dẹp

Giải pháp chung

Nếu bạn đã hoàn tất, chúng tôi khuyên bạn nên tắt ứng dụng App Engine để tránh phát sinh thanh toán. Tuy nhiên, nếu bạn muốn kiểm tra hoặc thử nghiệm thêm, nền tảng App Engine có hạn mức miễn phí, và bạn sẽ không bị tính phí, miễn là bạn không vượt quá cấp sử dụng đó. Đó là cho dịch vụ điện toán nhưng bạn cũng có thể bị tính phí cho các dịch vụ có liên quan của App Engine, vì vậy hãy xem trang 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ụ khác trên Google Cloud, thì những 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 "Dành riêng cho lớp học lập trình này" phần dưới đây.

Để công bố đầy đủ thông tin, việc triển khai cho một nền tảng điện toán không máy chủ của Google Cloud như App Engine sẽ làm phát sinh chi phí bản dựng và bộ nhớ thấp. Cloud Build cũng 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ẽ sử dụng hết một phần hạn mức đó. Tuy nhiên, bạn có thể sống ở một khu vực không có bậc miễn phí như vậy, vì vậy hãy chú ý đến mức sử dụng bộ nhớ của bạn để giảm thiểu chi phí tiềm ẩn. "Thư mục" cụ thể trên Cloud Storage bạn nên xem xét, 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 lưu trữ ở trên phụ thuộc vào PROJECT_ID và hoạt động *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 định tiếp tục sử dụng ứng dụng này hoặc các lớp học lập trình di chuyển khác có liên quan và muốn xoá hoàn toàn mọi thứ, hãy ngừng dự án của bạn.

Dành riêng cho lớp học lập trình này

Các dịch vụ được liệt kê dưới đây là những dịch vụ dành riêng cho 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

Đến đây, chúng tôi đã hoàn tất quá trình di chuyển từ Hàng đợi tác vụ của App Engine sang các tác vụ trên 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 sâu hơn nữa sang Cloud Datastore từ Cloud NDB, hãy xem xét Mô-đun 9.

Cloud NDB dành riêng cho các nhà phát triển Python 2 App Engine, cung cấp 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 sử dụng 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 Datastore (mặc dù theo những cách khác nhau), vì vậy, lý do duy nhất để cân nhắ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à mong muốn chuẩn hoá trên một thư viện 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 sẽ được đề cập riêng (không có Hàng đợi tác vụ hay Cloud Tasks) trong Mô-đun 3.

Ngoài Mô-đun 3, 8 và 9, cần xem xét các mô-đun di chuyển khác tập trung vào việc ngừng sử dụng các dịch vụ đi kèm cũ của App Engine bao gồm:

  • Mô-đun 2: di chuyển từ App Engine NDB sang Cloud NDB
  • Mô-đun 12-13: di chuyển từ App Engine Memcache sang Cloud Memorystore
  • Mô-đun 15-16: di chuyển từ App Engine Blobstore sang Cloud Storage
  • Mô-đun 18-19: Hàng đợi tác vụ của App Engine (lấy tác vụ) lên Cloud Pub/Sub

App Engine không còn là nền tảng không máy chủ duy nhất 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 dịch vụ vi mô độ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ể sử dụng lại, thì đây là những lý do chính đáng để bạn cân nhắc chuyển sang Cloud Functions. Nếu việc tích hợp vùng chứa đã trở thành một phần trong quy trình phát triển ứng dụng, đặc biệt là khi quy trình đó bao gồm một quy trình CI/CD (tích hợp liên tục/phân phối hoặc triển khai liên tục), hãy cân nhắc chuyển sang Cloud Run. Những 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 Học phần 11
  • Di chuyển từ App Engine sang Cloud Run: xem Mô-đun 4 để vùng chứa ứng dụng của bạn bằng Docker, hoặc Mô-đun 5 để triển khai mà không cần vùng chứa, kiến thức về Docker hoặc Dockerfile

Việc chuyển sang một nền tảng không máy chủ khác là không bắt buộc. Bạn nên cân nhắc các 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 điều chỉnh bất cứ điều gì.

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 Trạm di chuyển không máy chủ (lớp học lập trình, video, mã nguồn [nếu có]) tại kho lưu trữ nguồn mở của chúng. README của kho lưu trữ này cũng cung cấp hướng dẫn về những quá trình di chuyển cần xem xét và mọi "đơn đặt hàng" có liên quan 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à phát triển đang tìm hiểu thêm về Phụ lục di chuyển này hoặ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ó cả những nơi để đưa ra ý kiến phản hồi về nội dung này, các đường liên kết đến mã nguồn và nhiều thông tin hữu ích khác của tài liệu.

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 vấn đề của bạn trước khi gửi. Đường liên kết để tìm kiếm và báo cáo vấn đề mới:

Tài nguyên di chuyển

Bạn có thể tìm thấy các đường liên kết đến các thư mục repo cho Mô-đun 7 (START) và Mô-đun 8 (Finish) trong bảng bên dưới.

Codelab

Python 2

Python 3

Học phần 7

(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ể phù hợp với hướng dẫn này:

Hàng đợi tác vụ của App Engine và Cloud Tasks

App Engine NDB và Cloud NDB (Datastore)

Nền tảng App Engine

Thông tin khác về đám mây

Video

Giấy phép

Tác phẩm này được cấp phép theo Giấy phép chung Ghi nhận tác giả Creative Commons 2.0.