Cách sử dụng App Engine Memcache trong các ứng dụng Flask (Mô-đun 12)

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ể.

Lớp học lập trình này hướng dẫn bạn cách thêm và sử dụng App Engine Memcache cho ứng dụng mẫu trong lớp học lập trình Mô-đun 1. Chúng ta sẽ thêm cách sử dụng Memcache trong hướng dẫn này ở Mô-đun 12, sau đó di chuyển sang Cloud Memorystore trong Mô-đun 13.

Bạn sẽ tìm hiểu cách

  • Sử dụng API/thư viện Memcache của App Engine
  • Thêm tính năng lưu vào bộ nhớ đệm vào một ứng dụng NDB cơ bản của Flask App Engine Python 2

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 Đọc và hoàn thành 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

Để di chuyển từ App Engine Memcache, hãy thêm việc sử dụng Memcache vào ứng dụng Flask và App Engine NDB hiện có trong lớp học lập trình Mô-đun 1. Ứng dụng mẫu hiển thị 10 lượt truy cập gần đây nhất của người dùng. Nếu cùng một người dùng làm mới trình duyệt, thì việc liên tục tạo các thực thể Lượt truy cập mới và tìm nạp các lượt truy cập gần đây nhất từ Datastore là không tối ưu, vì vậy, chúng ta sẽ lưu vào bộ nhớ đệm những lượt truy cập gần đây nhất đó.

Nếu cùng một khách truy cập truy cập vào trang, thì những lượt truy cập đó sẽ được trả về từ bộ nhớ đệm. Nếu người dùng mới truy cập vào trang web hoặc đã hết một giờ, thì bộ nhớ đệm sẽ bị xoá và thay thế bằng các mục gần đây nhất (chưa kể một Lượt truy cập mới được đăng ký). Sau khi triển khai chế độ tích hợp App Engine Memcache này, chúng ta có thể di chuyển chế độ này sang Cloud Memorystore trong lớp học lập trình tiếp theo (Mô-đun 13).

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ị

Trước khi bắt đầu phần chính của hướng dẫn, hãy thiết lập dự án, lấy mã rồi triển khai ứng dụng cơ sở để chúng ta biết rằng mình đã bắt đầu bằng mã hoạt động.

1. Thiết lập dự án

Nếu đã hoàn thành lớp học lập trình Mô-đun 1, bạn nên sử 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à App Engine được bật.

2. Tải ứng dụng mẫu cơ sở

Một trong những điều kiện tiên quyết của lớp học lập trình này là bạn phải có một ứng dụng mẫu Hoạt động 1 đang hoạt động. Nếu không có, hãy hoàn thành một trong hai hướng dẫn (đường liên kết ở trên) trước khi tiếp tục ở đây. Nếu đã quen thuộc với nội dung này, bạn có thể bắt đầu bằng mã Mô-đun 1 bên dưới.

Cho dù bạn dùng mã của mình hay mã của chúng tôi, mã của Mô-đun 1 sẽ là nơi chúng ta BẮT ĐẦU. Lớp học lập trình này sẽ hướng dẫn bạn từng bước, kết thúc bằng mã tương tự như mã trong thư mục kho lưu trữ Mô-đun 11 (FINISH).

Thư mục của các tệp BẮT ĐẦU Mô-đun 1 (của bạn hoặc của chúng tôi) sẽ có dạng như sau:

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

3. (Triển khai lại) Ứng dụng cơ sở

Các bước chuẩn bị còn lại mà bạn cần thực hiện ngay:

  1. Làm quen lại với công cụ dòng lệnh gcloud
  2. Triển khai lại ứng dụng mẫu bằng gcloud app deploy
  3. Xác nhận rằng ứng dụng chạy trên App Engine mà không gặp vấn đề

Sau khi thực hiện thành công các bước đó và thấy ứng dụng web của bạn hoạt động (với đầu ra tương tự như bên dưới), bạn đã sẵn sàng thêm tính năng sử dụng bộ nhớ đệm vào ứng dụng của mình.

a7a9d2b80d706a2b.png

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

Bạn không cần thay đổi các tệp cấu hình App Engine tiêu chuẩn (app.yaml, requirements.txt, appengine_config.py).

5. Sửa đổi tệp ứng dụng

Vì chúng ta chỉ thêm một API App Engine, nên không có gói bên ngoài nào liên quan, tức là bạn không cần cập nhật tệp cấu hình (app.yaml, requirements.txt, appengine_config.py). Chỉ có một tệp ứng dụng, main.py, nên mọi thay đổi trong phần này chỉ ảnh hưởng đến tệp đó.

Nhập

Bước quan trọng nhất là nhập thư viện Memcache, google.appengine.api.memcache. Vì chúng ta sẽ lưu vào bộ nhớ đệm những lượt truy cập gần đây nhất trong một giờ, nên hãy thêm một hằng số cho số giây trong một giờ. Dưới đây là giao diện mã của bạn trước và sau khi thay đổi này:

TRƯỚC:

from flask import Flask, render_template, request
from google.appengine.ext import ndb

app = Flask(__name__)

SAU:

from flask import Flask, render_template, request
from google.appengine.api import memcache
from google.appengine.ext import ndb

app = Flask(__name__)
HOUR = 3600

Thêm tính năng lưu vào bộ nhớ đệm có hỗ trợ Memcache

Thay đổi đáng kể nhất là thêm việc sử dụng tính năng lưu vào bộ nhớ đệm trong ứng dụng của chúng ta. Cụ thể hơn, chúng ta nên lưu vào bộ nhớ đệm những lượt truy cập gần đây nhất, kiểm tra xem có lượt truy cập nào được lưu vào bộ nhớ đệm hay không và cố gắng sử dụng kết quả được lưu vào bộ nhớ đệm nhiều nhất có thể theo kế hoạch của chúng ta. Sau đây là các bước mà ứng dụng sẽ thực hiện để đạt được mục tiêu của chúng ta:

  1. Đặt lượt truy cập hiện tại và gọi là visitor
  2. Tìm cách tìm nạp visits gần đây nhất từ bộ nhớ đệm
  3. Nếu bộ nhớ đệm trống hoặc khách truy cập gần đây nhất (visits[0]['visitor']) khác với visitor hiện tại: lưu lượt truy cập mới nhất này, tìm nạp các lượt truy cập gần đây nhất và lưu chúng vào bộ nhớ đệm trong một giờ.
  4. Hiển thị visits cho người dùng thông qua mẫu web

Sau đây là hình ảnh trước và sau khi áp dụng các nội dung cập nhật này:

TRƯỚC:

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

SAU:

@app.route('/')
def root():
    'main application (GET) handler'
    # check for (hour-)cached visits
    ip_addr, usr_agt = request.remote_addr, request.user_agent
    visitor = '{}: {}'.format(ip_addr, usr_agt)
    visits = memcache.get('visits')

    # register visit & run DB query if cache empty or new visitor
    if not visits or visits[0]['visitor'] != visitor:
        store_visit(ip_addr, usr_agt)
        visits = list(fetch_visits(10))
        memcache.set('visits', visits, HOUR)  # set() not add()

    return render_template('index.html', visits=visits)

Sau đây là hình ảnh minh hoạ những thay đổi đã được thực hiện:

b1242503602f7bf0.png

Như vậy là bạn đã thực hiện tất cả các thay đổi cần thiết để thêm việc sử dụng App Engine memcache vào ứng dụng mẫu trong Mô-đun 1. Hãy tạo và triển khai ứng dụng này để xem ứng dụng hoạt động!

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 thực hiện mọi bước 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 lại ứng dụng bằng gcloud app deploy và xác nhận rằng ứng dụng hoạt động. Giờ đây, mã của bạn sẽ khớp với mã trong FINISH (HOÀN TẤT), thư mục Mô-đun 12. Kết quả đầu ra phải giống hệt với ứng dụng trong Mô-đun 1 mà bạn đã triển khai trước đó:

a7a9d2b80d706a2b.png

Tất cả những gì chúng tôi làm là tăng tốc trải nghiệm người dùng cho cùng một người dùng. Khi làm mới, bạn sẽ nhận được kết quả trực tiếp từ bộ nhớ đệm, việc này không tạo lượt truy cập mới cũng như không thực hiện lệnh tìm nạp Datastore.

Chúc mừng bạn đã hoàn thành lớp học lập trình Mô-đun 12 để thêm việc sử dụng dịch vụ memcache App Engine vào ứng dụng mẫu của chúng tôi. Giờ đây, bạn có thể chuyển ứng dụng Python 2 này sang Python 3 trong bước bổ sung.

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

Quá trình di chuyển hợp lý tiếp theo cần xem xét được đề cập trong Học phần 13, cho thấy cách nhà phát triển di chuyển từ dịch vụ memcache của App Engine sang Cloud Memorystore. Tất cả các quy trình di chuyển này đều không bắt buộc và dành cho những người dùng muốn thực hiện các bước để hiện đại hoá ứng dụng của họ. Dịch vụ Cloud Memorystore là một bản nâng cấp đáng kể cho memcache của App Engine vì nhiều lý do:

  • Cloud Memorystore không phải là dịch vụ không cần máy chủ. Điều này có nghĩa là bạn phải phân bổ một máy chủ cho bộ nhớ đệm. Cloud Memorystore cũng không có cấp miễn phí. Cả hai yếu tố này đều có thể ảnh hưởng đáng kể đến chi phí.
  • Cloud Memorystore hỗ trợ một cặp cơ chế lưu trữ cơ bản khác nhau (công cụ lưu vào bộ nhớ đệm), RedisMemcached.
  • Cloud Memorystore (cho Redis) có một bộ tính năng phong phú và chuyên sâu hơn nhiều so với App Engine Memcache.
  • Để sử dụng Cloud Memorystore, bạn phải thiết lập một máy chủ Cloud Memorystore, thêm máy chủ đó vào mạng VPC của Google Cloud, sau đó để ứng dụng App Engine sử dụng mạng đó để giao tiếp với máy chủ Memorystore.

Nếu không cảm thấy cần tất cả các tính năng có trong Cloud Memorystore hoặc lo ngại về ảnh hưởng của tính năng này đến chi phí, bạn có thể tiếp tục sử dụng App Engine Memcache.

Ngoài Mô-đun 13, còn có rất nhiều hoạt động di chuyển khác có thể xảy ra, chẳng hạn như Cloud NDB và Cloud Datastore hoặc Cloud Tasks. Ngoài ra, còn có các hoạt động di chuyển trên nhiều sản phẩm sang Cloud Run và Cloud Functions. Bạn sẽ tìm thấy tất cả các hướng dẫn này tại kho lưu trữ di chuyển.

Một bước tiếp theo có thể là quy trình chuyển đổi sang Python 3. Đây là bước không bắt buộc và sẽ được đề cập trong phần tiếp theo.

7. PHẦN THƯỞNG: Di chuyển sang Python 3

Tổng quan

Phần này bao gồm nội dung bổ sung không bắt buộc, di chuyển ứng dụng Mô-đun 12 mà chúng ta vừa hoàn thành ở trên sang Python 3. Chúng ta sẽ bắt đầu với cấu hình, sau đó là ứng dụng.

Đơn giản hoá app.yaml

Một trong những lợi ích của thời gian chạy Python 3 là app.yaml có thể được đơn giản hoá đáng kể.

TRƯỚC:

Dưới đây là nội dung trong app.yaml khi kết thúc Mô-đun 12:

runtime: python27
threadsafe: yes
api_version: 1

handlers:
- url: /.*
  script: main.app

Vì thời gian chạy Python 3 yêu cầu các khung web tự thực hiện định tuyến, nên tất cả trình xử lý tuyến đường trong app.yaml phải được thay đổi thành auto. Nếu không có tệp tĩnh nào được phân phát, người dùng có thể xoá hoàn toàn phần handlers:. Ngoài ra, cả threadsafeapi_version đều không còn được dùng nữa.

SAU:

Với những thay đổi bắt buộc vừa được mô tả, đây là app.yaml thay thế cho Python 3:

runtime: python39
app_engine_apis: true

Dòng duy nhất cần có lời giải thích là app_engine_apis: true. Khi các dịch vụ App Engine cũ được cung cấp cho thời gian chạy thế hệ thứ hai vào năm 2021, một số thời gian chạy, bao gồm cả Python 3, yêu cầu thêm quy trình khởi động để truy cập vào các API đó như ndb, taskqueuememcache. Dòng này trong cấu hình sẽ phục vụ mục đích đó.

Cập nhật tệp requirements.txt

Một quy trình khởi động khác của các API ban đầu là bắt buộc trong requirements.txt: bạn phải có quyền truy cập vào SDK App Engine mới.

TRƯỚC:

Dưới đây là nội dung trong app.yaml khi kết thúc Mô-đun 12:

flask

SAU:

Bạn chỉ cần thêm App Engine Python SDK là có thể sử dụng những tính năng sau:

flask
appengine-python-standard

Xoá appengine_config.py và lib

Thế hệ tiếp theo của thời gian chạy App Engine cải tiến việc sử dụng gói của bên thứ ba:

  • Thư viện tích hợp là những thư viện được Google kiểm tra và cung cấp trên các máy chủ App Engine, có thể là do chúng chứa mã C/C++ mà nhà phát triển không được phép triển khai lên đám mây. Những thư viện này không còn có trong thời gian chạy thế hệ thứ 2 nữa.
  • Bạn không cần sao chép các thư viện không tích hợp sẵn (đôi khi được gọi là "vendoring" hoặc "self-bundling") trong thời gian chạy thế hệ thứ 2. Thay vào đó, chúng phải được liệt kê trong requirements.txt, nơi hệ thống xây dựng tự động cài đặt chúng thay cho bạn tại thời điểm triển khai.

Do những thay đổi đó đối với việc quản lý gói của bên thứ ba, bạn không cần tệp appengine_config.py cũng như thư mục lib, vì vậy hãy xoá chúng. Trong thời gian chạy thế hệ thứ 2, App Engine sẽ tự động cài đặt các gói của bên thứ ba có trong requirements.txt. Tóm tắt:

  1. Không có thư viện tự đóng gói hoặc sao chép của bên thứ ba; hãy liệt kê các thư viện đó trong requirements.txt
  2. Không có pip install nào trong thư mục lib, tức là không có thư mục lib nào
  3. Không có thư viện tích hợp sẵn của bên thứ ba (do đó không có phần libraries) trong app.yaml; liệt kê các thư viện đó trong requirements.txt
  4. Không có thư viện bên thứ ba nào để tham chiếu từ ứng dụng của bạn, tức là không có tệp appengine_config.py

Yêu cầu duy nhất đối với nhà phát triển là liệt kê tất cả các thư viện bên thứ ba mong muốn trong requirements.txt.

Cập nhật ứng dụng để sử dụng App Engine SDK

Như đã đề cập ở trên, các ứng dụng Python 3 cần có một số điểm sửa đổi để truy cập vào các dịch vụ đi kèm của App Engine:

  1. Gói SDK App Engine (trong requirements.txt)
  2. Kích hoạt App Engine SDK (trong app.yaml)
  3. Bọc đối tượng WSGI (trong main.py)

Cặp đầu tiên đã hoàn tất ở trên, vì vậy yêu cầu cuối cùng là cập nhật main.py.

TRƯỚC:

Dưới đây là main.py Python 2 ở phần kết luận của Mô-đun 12:

from flask import Flask, render_template, request
from google.appengine.api import memcache
from google.appengine.ext import ndb

app = Flask(__name__)
HOUR = 3600

SAU:

Đối với cổng Python 3, hãy nhập SDK và bao bọc đối tượng ứng dụng Flask bằng SDK đó (trình bao bọc SDK), dẫn đến kết quả như sau:

from flask import Flask, render_template, request
from google.appengine.api import memcache, wrap_wsgi_app
from google.appengine.ext import ndb

app = Flask(__name__)
app.wsgi_app = wrap_wsgi_app(app.wsgi_app)
HOUR = 3600

Nhà phát triển cần thực hiện những thay đổi này cho các ứng dụng Python khi thực hiện quy trình chuyển đổi từ phiên bản 2.x sang 3.x để truy cập vào các dịch vụ đi kèm. Nếu không dùng Flask, bạn cũng có thể tham khảo các mẫu Django và Pyramid trong tài liệu. Nếu mã Python 2 của bạn không phải là một ứng dụng web, thì chỉ cần thêm gói SDK là đủ khi chuyển sang Python 3. Mã xử lý ứng dụng của chúng tôi ban đầu được thiết kế để hoạt động trong Python 2 và 3, nên không cần thay đổi thêm về khả năng tương thích.

Triển khai ứng dụng

Sau khi hoàn tất các thay đổi nêu trên, bạn có thể triển khai ứng dụng mẫu đã cập nhật. (Không có vấn đề gì khi triển khai phiên bản Python 3 của ứng dụng qua phiên bản Python 2 ban đầu trong cùng một dự án GCP.) Hành vi của ứng dụng sẽ không thay đổi. Nếu bạn cần so sánh ứng dụng đã cập nhật của mình với ứng dụng của chúng tôi, hãy xem thư mục Module 12b trong kho lưu trữ di chuyển. Để tìm hiểu thêm về việc hỗ trợ các dịch vụ đi kèm của App Engine trong các thời gian chạy mới nhất như Python 3, hãy xem thông báo ra mắt tính năng cũng như lớp học lập trình Mô-đun 17.

Chúc mừng bạn đã hoàn thành bước thưởng trong Mô-đun 12! Ngoài ra, hãy xem tài liệu về cách chuẩn bị tệp cấu hình cho thời gian chạy Python 3. Xem phần Tóm tắt/Dọn dẹp ở trên để biết các bước tiếp theo và cách dọn dẹp.

8. 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 2 (BẮT ĐẦU) và Mô-đun 12 (KẾT THÚC) trong bảng bên dưới. Bạn cũng có thể truy cập vào các hướng dẫn này trong kho lưu trữ cho tất cả các hoạt động di chuyển codelab App Engine. Bạn có thể sao chép hoặc tải tệp ZIP xuống.

Lớp học lập trình

Python 2

Python 3

Module 1

code

(không có trong hướng dẫn này)

Mô-đun 12 (lớp học lập trình này)

code

code

Tài liệu tham khảo 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:

App Engine

Cloud Memorystore và Cloud Datastore

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.