Bắt đầu với Cloud Functions (thế hệ thứ 2)

1. Giới thiệu

Để bắt đầu viết hàm Cloud Run, bạn có thể tham khảo các lớp học lập trình sau:

Nếu không, lớp học lập trình này sẽ hướng dẫn bạn cách tạo Hàm trên đám mây (thế hệ 2).

Tổng quan

Cloud Functions (thế hệ 2) là phiên bản tiếp theo của Google Cloud Functions, dịch vụ Functions-as-a-Service (Hàm dưới dạng dịch vụ) của Google Cloud. Phiên bản mới này đi kèm với một bộ tính năng nâng cao và hiện được cung cấp bởi Cloud RunEventarc, giúp bạn kiểm soát hiệu suất và khả năng mở rộng một cách nâng cao hơn, cũng như kiểm soát nhiều hơn về thời gian chạy hàm và trình kích hoạt từ hơn 90 nguồn sự kiện.

Lớp học lập trình này sẽ hướng dẫn bạn tạo các Hàm trên đám mây phản hồi các lệnh gọi HTTP và được kích hoạt bằng tin nhắn Pub/Sub và Nhật ký kiểm tra trên đám mây.

Tính năng mới

Phiên bản mới của Cloud Functions mang đến trải nghiệm FaaS nâng cao, được cung cấp bởi Cloud Run, Cloud Build, Artifact Registry và Eventarc.

Cơ sở hạ tầng nâng cao

  • Xử lý yêu cầu lâu hơn: Chạy các Hàm trên đám mây lâu hơn thời gian mặc định là 5 phút, giúp bạn dễ dàng chạy khối lượng công việc yêu cầu lâu hơn, chẳng hạn như xử lý luồng dữ liệu lớn từ Cloud Storage hoặc BigQuery. Đối với các hàm HTTP, thời gian tối đa là 60 phút. Đối với các hàm dựa trên sự kiện, thời gian chờ hiện là tối đa 10 phút.
  • Các phiên bản lớn hơn: Tận dụng tối đa 16 GB RAM và 4 vCPU trên các Hàm trên đám mây để cho phép các khối lượng công việc lớn hơn trong bộ nhớ, chuyên về điện toán và song song hơn.
  • Tính năng đồng thời: Xử lý đồng thời tối đa 1.000 yêu cầu bằng một phiên bản chức năng duy nhất, giảm thiểu quy trình khởi động nguội và cải thiện độ trễ khi mở rộng quy mô.
  • Phiên bản tối thiểu: Cung cấp các phiên bản được làm ấm trước để giảm số lần khởi động nguội và đảm bảo thời gian khởi động của ứng dụng không ảnh hưởng đến hiệu suất của ứng dụng.
  • Phân tách lưu lượng truy cập: Hỗ trợ nhiều phiên bản của hàm, phân chia lưu lượng truy cập giữa các phiên bản và khôi phục hàm về phiên bản trước đó.

Mở rộng phạm vi Sự kiện và hỗ trợ CloudEvents

  • Tích hợp Eventarc: Cloud Functions hiện đã hỗ trợ riêng cho Eventarc, giúp thu hút hơn hơn 90 nguồn sự kiện sử dụng nhật ký Cloud Check (BigQuery, Cloud SQL, Cloud Storage, v.v.) và tất nhiên Cloud Functions vẫn hỗ trợ các sự kiện từ các nguồn tuỳ chỉnh bằng cách xuất bản trực tiếp lên Cloud Pub/Sub.
  • Định dạng CloudEvent: Tất cả các hàm do sự kiện điều khiển đều tuân thủ CloudEvents theo tiêu chuẩn ngành ( cloudevents.io), bất kể nguồn, để đảm bảo trải nghiệm nhất quán cho nhà phát triển. Gói dữ liệu được gửi qua CloudEvent có cấu trúc với gói dữ liệu cloudevent.data và triển khai tiêu chuẩn CloudEvent.

Kiến thức bạn sẽ học được

  • Tổng quan về Cloud Functions (thế hệ 2).
  • Cách viết một hàm phản hồi các lệnh gọi HTTP.
  • Cách viết một hàm phản hồi thông báo Pub/Sub.
  • Cách viết một hàm phản hồi các sự kiện trên Cloud Storage.
  • Cách viết một hàm phản hồi Nhật ký kiểm tra trên đám mây.
  • Cách phân chia lưu lượng truy cập giữa hai bản sửa đổi.
  • Cách tránh tình trạng khởi động nguội bằng số thực thể tối thiểu.
  • Cách thiết lập tính năng đồng thời.

2. Cách thiết lập và các yêu cầu

Thiết lập môi trường theo tốc độ của riêng bạn

  1. Đăng nhập vào Google Cloud Console rồi tạo một dự án mới hoặc sử dụng lại một dự án hiện có. Nếu chưa có tài khoản Gmail hoặc Google Workspace, bạn phải tạo một tài khoản.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Tên dự án là tên hiển thị cho người tham gia dự án này. Đây là một chuỗi ký tự không được API của Google sử dụng. Bạn có thể cập nhật thông tin này bất cứ lúc nào.
  • Mã dự án phải là duy nhất trên tất cả các dự án Google Cloud và không thể thay đổi được (không thể thay đổi sau khi đặt). Cloud Console sẽ tự động tạo một chuỗi duy nhất; thường thì bạn không cần quan tâm đến chuỗi này. Trong hầu hết các lớp học lập trình, bạn sẽ cần tham chiếu đến Mã dự án (thường được xác định là PROJECT_ID). Nếu không thích mã được tạo, bạn có thể tạo một mã ngẫu nhiên khác. Ngoài ra, bạn có thể thử dùng tên của riêng mình để xem tên đó có được chấp nhận hay không. Bạn không thể thay đổi thông tin này sau bước này và thông tin đó sẽ vẫn tồn tại trong thời gian của dự án.
  • Xin lưu ý rằng có một giá trị thứ ba là Mã dự án mà một số API sử dụng. Tìm hiểu thêm về cả ba giá trị này trong tài liệu này.
  1. Tiếp theo, bạn cần bật tính năng thanh toán trong Cloud Console để sử dụng các tài nguyên/API trên Cloud. Việc tham gia lớp học lập trình này sẽ không tốn kém nhiều chi phí, nếu có. Để tắt các tài nguyên để không bị tính phí sau khi hoàn tất hướng dẫn này, bạn có thể xoá các tài nguyên đã tạo hoặc xoá toàn bộ dự án. Người dùng mới của Google Cloud đủ điều kiện tham gia chương trình Dùng thử miễn phí 300 USD.

Khởi động Cloud Shell

Mặc dù có thể điều khiển Google Cloud từ xa trên máy tính xách tay, nhưng trong lớp học lập trình này, bạn sẽ sử dụng Google Cloud Shell, một môi trường dòng lệnh chạy trên đám mây.

Trong Bảng điều khiển Google Cloud, hãy nhấp vào biểu tượng Cloud Shell trên thanh công cụ trên cùng bên phải:

55efc1aaa7a4d3ad.pngS

Quá trình cấp phép và kết nối với môi trường chỉ mất vài phút. Khi quá trình này hoàn tất, bạn sẽ thấy như sau:

7ffe5cbb04455448.png

Máy ảo này được tải sẵn tất cả các công cụ phát triển mà bạn cần. Ứng dụng này cung cấp một thư mục gốc 5 GB ổn định và chạy trên Google Cloud, giúp nâng cao đáng kể hiệu suất mạng và xác thực. Bạn có thể thực hiện tất cả công việc trong lớp học lập trình này trong một trình duyệt. Bạn không cần cài đặt gì cả.

Thiết lập gcloud

Trong Cloud Shell, hãy đảm bảo rằng bạn đã đặt và lưu mã dự án vào biến PROJECT_ID, đồng thời đặt REGION thành us-west1:

gcloud config set project [YOUR-PROJECT-ID]
PROJECT_ID=$(gcloud config get-value project)
REGION=us-west1

Bật API

Bật tất cả các dịch vụ cần thiết:

gcloud services enable \
  artifactregistry.googleapis.com \
  cloudfunctions.googleapis.com \
  cloudbuild.googleapis.com \
  eventarc.googleapis.com \
  run.googleapis.com \
  logging.googleapis.com \
  pubsub.googleapis.com

3. Hàm HTTP

Đối với hàm đầu tiên, hãy tạo một hàm Node.js đã xác thực để phản hồi các yêu cầu HTTP. Hãy sử dụng thời gian chờ 10 phút để minh hoạ cách một hàm có thể có thêm thời gian phản hồi các yêu cầu HTTP.

Tạo

Tạo thư mục cho ứng dụng và chuyển đến thư mục đó:

mkdir ~/hello-http && cd $_

Tạo một tệp index.js chỉ phản hồi các yêu cầu HTTP:

const functions = require('@google-cloud/functions-framework');

functions.http('helloWorld', (req, res) => {
  res.status(200).send('HTTP with Node.js in GCF 2nd gen!');
});

Tạo tệp package.json để chỉ định các phần phụ thuộc:

{
  "name": "nodejs-functions-gen2-codelab",
  "version": "0.0.1",
  "main": "index.js",
  "dependencies": {
    "@google-cloud/functions-framework": "^2.0.0"
  }
}

Triển khai

Triển khai hàm:

gcloud functions deploy nodejs-http-function \
  --gen2 \
  --runtime nodejs16 \
  --entry-point helloWorld \
  --source . \
  --region $REGION \
  --trigger-http \
  --timeout 600s

Mặc dù không bắt buộc phải thực hiện bước này, nhưng hãy lưu ý thời gian chờ là 600 giây. Điều này cho phép hàm có thời gian chờ lâu hơn để phản hồi các yêu cầu HTTP.

Sau khi triển khai hàm, bạn có thể thấy hàm đó trong phần Cloud Functions (Hàm trên đám mây) của Cloud Console:

7541800e1e3f299f.png

Kiểm thử

Kiểm tra hàm này bằng lệnh sau:

gcloud functions call nodejs-http-function \
  --gen2 --region $REGION

Bạn sẽ thấy thông báo HTTP with Node.js in GCF 2nd gen! dưới dạng phản hồi.

4. Hàm Pub/Sub

Đối với hàm thứ hai, hãy tạo một hàm Python được kích hoạt bằng thông báo Pub/Sub được phát hành cho một chủ đề cụ thể.

Thiết lập mã thông báo xác thực Pub/Sub

Nếu bạn đã bật tài khoản dịch vụ Pub/Sub vào hoặc trước ngày 8 tháng 4 năm 2021, hãy cấp vai trò iam.serviceAccountTokenCreator cho tài khoản dịch vụ Pub/Sub:

PROJECT_NUMBER=$(gcloud projects list --filter="project_id:$PROJECT_ID" --format='value(project_number)')

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member  serviceAccount:service-$PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \
  --role roles/iam.serviceAccountTokenCreator

Tạo

Tạo một chủ đề Pub/Sub để dùng cho mẫu:

TOPIC=cloud-functions-gen2-topic
gcloud pubsub topics create $TOPIC

Tạo một thư mục cho ứng dụng và chuyển đến thư mục đó:

mkdir ~/hello-pubsub && cd $_

Tạo một tệp main.py chỉ ghi nhật ký một thông báo chứa mã CloudEvent:

import functions_framework

@functions_framework.cloud_event
def hello_pubsub(cloud_event):
   print('Pub/Sub with Python in GCF 2nd gen! Id: ' + cloud_event['id'])

Tạo tệp requirements.txt có nội dung sau để chỉ định các phần phụ thuộc:

functions-framework==3.*

Triển khai

Triển khai hàm:

gcloud functions deploy python-pubsub-function \
  --gen2 \
  --runtime python39 \
  --entry-point hello_pubsub \
  --source . \
  --region $REGION \
  --trigger-topic $TOPIC

Sau khi triển khai hàm này, bạn có thể thấy hàm đó trong phần Chức năng đám mây của Bảng điều khiển Cloud:

107029714c32baff.png.

Kiểm thử

Kiểm thử hàm bằng cách gửi tin nhắn đến chủ đề:

gcloud pubsub topics publish $TOPIC --message="Hello World"

Bạn sẽ thấy CloudEvent đã nhận được trong nhật ký:

gcloud functions logs read python-pubsub-function \
  --region $REGION --gen2 --format "value(log)"

5. Chức năng Cloud Storage

Đối với hàm tiếp theo, hãy tạo một hàm Node.js phản hồi các sự kiện từ một bộ chứa trên Cloud Storage.

Thiết lập

Để sử dụng các hàm Cloud Storage, hãy cấp vai trò IAM pubsub.publisher cho tài khoản dịch vụ Cloud Storage:

SERVICE_ACCOUNT=$(gsutil kms serviceaccount -p $PROJECT_NUMBER)

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT \
  --role roles/pubsub.publisher

Tạo

Tạo thư mục cho ứng dụng và chuyển đến thư mục đó:

mkdir ~/hello-storage && cd $_

Tạo một tệp index.js chỉ phản hồi các sự kiện trên Cloud Storage:

const functions = require('@google-cloud/functions-framework');

functions.cloudEvent('helloStorage', (cloudevent) => {
  console.log('Cloud Storage event with Node.js in GCF 2nd gen!');
  console.log(cloudevent);
});

Tạo tệp package.json để chỉ định các phần phụ thuộc:

{
  "name": "nodejs-functions-gen2-codelab",
  "version": "0.0.1",
  "main": "index.js",
  "dependencies": {
    "@google-cloud/functions-framework": "^2.0.0"
  }
}

Triển khai

Trước tiên, hãy tạo một bộ chứa trên Cloud Storage (hoặc sử dụng một bộ chứa hiện có):

​​export BUCKET="gs://gcf-gen2-storage-$PROJECT_ID"
gsutil mb -l $REGION $BUCKET

Triển khai hàm:

gcloud functions deploy nodejs-storage-function \
  --gen2 \
  --runtime nodejs16 \
  --entry-point helloStorage \
  --source . \
  --region $REGION \
  --trigger-bucket $BUCKET \
  --trigger-location $REGION

Sau khi triển khai hàm, bạn có thể thấy hàm đó trong phần Hàm trên Cloud Console.

Kiểm thử

Kiểm tra hàm này bằng cách tải một tệp lên bộ chứa:

echo "Hello World" > random.txt
gsutil cp random.txt $BUCKET/random.txt

Bạn sẽ thấy CloudEvent đã nhận được trong nhật ký:

gcloud functions logs read nodejs-storage-function \
  --region $REGION --gen2 --limit=100 --format "value(log)"

6. Hàm Cloud Audit Logs

Đối với hàm tiếp theo, hãy tạo một hàm Node.js nhận sự kiện Nhật ký kiểm tra đám mây khi tạo một thực thể máy ảo Compute Engine. Để phản hồi, công cụ này sẽ thêm một nhãn vào máy ảo mới tạo, chỉ định người tạo máy ảo.

Xác định các máy ảo Compute Engine mới tạo

Compute Engine phát 2 Nhật ký kiểm tra khi tạo máy ảo.

Lần đầu tiên được phát ra khi bắt đầu tạo máy ảo và có dạng như sau:

8d394a481644c4b6.png

Lệnh thứ hai được phát ra sau khi tạo máy ảo và có dạng như sau:

ee0e221d82887cd1.png

Lưu ý trường toán tử có các giá trị first: truelast: true. Nhật ký kiểm tra thứ hai chứa tất cả thông tin mà chúng ta cần để gắn nhãn một thực thể, do đó chúng ta sẽ sử dụng cờ last: true để phát hiện thực thể đó trong Cloud Functions.

Thiết lập

Để sử dụng các chức năng của Nhật ký kiểm tra trên đám mây, bạn phải bật Nhật ký kiểm tra cho Eventarc. Bạn cũng cần sử dụng một tài khoản dịch vụ có vai trò eventarc.eventReceiver.

  1. Bật Nhật ký kiểm tra của Cloud các loại nhật ký Quản trị viên đọc, Đọc dữ liệuGhi dữ liệu cho API Compute Engine:

76b7417ea4071241.pngS

  1. Cấp cho tài khoản dịch vụ Compute Engine mặc định vai trò IAM eventarc.eventReceiver:
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com \
  --role roles/eventarc.eventReceiver

Lấy mã

Sao chép kho lưu trữ chứa ứng dụng:

git clone https://github.com/GoogleCloudPlatform/eventarc-samples.git

Chuyển đến thư mục ứng dụng:

cd eventarc-samples/gce-vm-labeler/gcf/nodejs

Tệp index.js chứa mã xử lý ứng dụng nhận Nhật ký kiểm tra được gói vào CloudEvent. Sau đó, công cụ này sẽ trích xuất thông tin chi tiết về phiên bản máy ảo Compute Engine và đặt nhãn trên phiên bản máy ảo đó. Bạn có thể tự nghiên cứu index.js chi tiết hơn.

Triển khai

Bạn có thể triển khai hàm này bằng gcloud như trước. Hãy lưu ý cách hàm này lọc trên Nhật ký kiểm tra cho các mục chèn Compute Engine bằng cờ --trigger-event-filters:

gcloud functions deploy gce-vm-labeler \
  --gen2 \
  --runtime nodejs16 \
  --entry-point labelVmCreation \
  --source . \
  --region $REGION \
  --trigger-event-filters="type=google.cloud.audit.log.v1.written,serviceName=compute.googleapis.com,methodName=beta.compute.instances.insert" \
  --trigger-location us-central1

Bạn cũng có thể triển khai hàm này và thêm một điều kiện kích hoạt Eventarc trong Google Cloud Console.

Trước tiên, hãy chuyển đến phần Cloud Functions (Hàm trên đám mây) rồi tạo một hàm có môi trường thế hệ 2:

8ba79a12ee152d8.png.

Nhấp vào nút Add Eventarc Trigger:

655346320a5e3631.png

Thao tác này sẽ mở ra một bảng điều khiển bên ở bên phải, nơi bạn có thể chọn các nhà cung cấp sự kiện và sự kiện khác nhau cho trình kích hoạt Eventarc.

Chọn đúng nhà cung cấp sự kiện và sự kiện, rồi nhấp vào Save Trigger:

7d24325ff06c9b05.pngS

Cuối cùng, trên trang tiếp theo, bạn có thể cập nhật tệp index.jspackage.json bằng tệp index.jspackage.json trên GitHub rồi nhấp vào nút Deploy:

f2e338eed2ccf5a2.png

Kiểm thử

Để kiểm thử hàm Nhật ký kiểm tra, bạn cần tạo một máy ảo Compute Engine trong Cloud Console (Bạn cũng có thể tạo máy ảo bằng gcloud nhưng có vẻ như máy ảo này không tạo Nhật ký kiểm tra).

Chuyển đến phần Compute Engine > VM instances (Compute Engine > Thực thể máy ảo) của Cloud Console rồi tạo một máy ảo mới. Sau khi quá trình tạo máy ảo hoàn tất, bạn sẽ thấy nhãn creator đã thêm trên máy ảo trong Cloud Console trong phần Thông tin cơ bản hoặc sử dụng lệnh sau:

gcloud compute instances describe YOUR_VM_NAME

Bạn sẽ thấy nhãn trong kết quả như ví dụ sau:

...
labelFingerprint: ULU6pAy2C7s=
labels:
  creator: atameldev
...

7. Chia tách lưu lượng truy cập

Cloud Functions (thế hệ thứ 2) hỗ trợ nhiều bản sửa đổi hàm, phân chia lưu lượng truy cập giữa các bản sửa đổi và khôi phục hàm về phiên bản trước đó. Điều này có thể xảy ra vì các hàm thế hệ thứ 2 là các dịch vụ Cloud Run.

Ở bước này, bạn sẽ triển khai 2 bản sửa đổi của một hàm, sau đó phân chia lưu lượng truy cập giữa các bản sửa đổi đó theo tỷ lệ 50-50.

Tạo

Tạo thư mục cho ứng dụng và chuyển đến thư mục đó:

mkdir ~/traffic-splitting && cd $_

Tạo tệp main.py bằng một hàm Python đọc biến môi trường màu và phản hồi lại bằng Hello World có màu nền đó:

import os

color = os.environ.get('COLOR')

def hello_world(request):
    return f'<body style="background-color:{color}"><h1>Hello World!</h1></body>'

Triển khai

Triển khai bản sửa đổi đầu tiên của hàm với nền màu cam:

COLOR=orange
gcloud functions deploy hello-world-colored \
  --gen2 \
  --runtime python39 \
  --entry-point hello_world \
  --source . \
  --region $REGION \
  --trigger-http \
  --allow-unauthenticated \
  --update-env-vars COLOR=$COLOR

Tại thời điểm này, nếu kiểm thử hàm bằng cách xem trình kích hoạt HTTP (kết quả URI của lệnh triển khai ở trên) trong trình duyệt, bạn sẽ thấy Hello World có nền màu cam:

36ca0c5f39cc89cf.png.

Triển khai bản sửa đổi thứ hai có nền màu vàng:

COLOR=yellow
gcloud functions deploy hello-world-colored \
  --gen2 \
  --runtime python39 \
  --entry-point hello_world \
  --source . \
  --region $REGION \
  --trigger-http \
  --allow-unauthenticated \
  --update-env-vars COLOR=$COLOR

Vì đây là bản sửa đổi mới nhất, nên nếu kiểm thử hàm này, bạn sẽ thấy Hello World có nền màu vàng:

391286a08ad3cdde.png

Phân chia lưu lượng truy cập theo tỷ lệ 50/50

Để phân chia lưu lượng truy cập giữa các bản sửa đổi màu cam và màu vàng, bạn cần tìm mã bản sửa đổi của các dịch vụ Cloud Run cơ bản. Đây là lệnh để xem mã bản sửa đổi:

gcloud run revisions list --service hello-world-colored \
  --region $REGION --format 'value(REVISION)'

Kết quả sẽ tương tự như kết quả sau:

hello-world-colored-00001-man
hello-world-colored-00002-wok

Bây giờ, hãy phân chia lưu lượng truy cập giữa hai bản sửa đổi này như sau (cập nhật X-XXX theo tên bản sửa đổi của bạn):

gcloud run services update-traffic hello-world-colored \
  --region $REGION \
  --to-revisions hello-world-colored-0000X-XXX=50,hello-world-colored-0000X-XXX=50

Kiểm thử

Hãy kiểm tra hàm này bằng cách truy cập URL công khai của hàm. Trong một nửa thời gian, bạn sẽ thấy bản sửa đổi màu cam và trong nửa thời gian còn lại, bạn sẽ thấy bản sửa đổi màu vàng:

36ca0c5f39cc89cf.png 391286a08ad3cdde.png

Hãy xem phần hoạt động quay lại, triển khai từng bước và di chuyển lưu lượng truy cập để biết thêm thông tin.

8. Số thực thể tối thiểu

Trong Cloud Functions (thế hệ 2), bạn có thể chỉ định số lượng thực thể hàm tối thiểu để giữ ấm và sẵn sàng phân phát yêu cầu. Điều này rất hữu ích trong việc hạn chế số lần khởi động nguội.

Ở bước này, bạn sẽ triển khai một hàm có tốc độ khởi chạy chậm. Bạn sẽ quan sát thấy sự cố khởi động nguội. Sau đó, bạn sẽ triển khai hàm với giá trị thực thể tối thiểu được đặt thành 1 để loại bỏ tình trạng khởi động nguội.

Tạo

Tạo một thư mục cho ứng dụng và chuyển đến thư mục đó:

mkdir ~/min-instances && cd $_

Tạo một tệp main.go. Dịch vụ Go này có một hàm init sẽ ngủ trong 10 giây để mô phỏng quá trình khởi chạy lâu. Tệp này cũng có một hàm HelloWorld phản hồi các lệnh gọi HTTP:

package p

import (
        "fmt"
        "net/http"
        "time"
)

func init() {
        time.Sleep(10 * time.Second)
}

func HelloWorld(w http.ResponseWriter, r *http.Request) {
        fmt.Fprint(w, "Slow HTTP Go in GCF 2nd gen!")
}

Triển khai

Triển khai bản sửa đổi đầu tiên của hàm với giá trị thực thể tối thiểu mặc định là 0:

gcloud functions deploy slow-function \
  --gen2 \
  --runtime go116 \
  --entry-point HelloWorld \
  --source . \
  --region $REGION \
  --trigger-http \
  --allow-unauthenticated

Kiểm thử hàm bằng lệnh sau:

gcloud functions call slow-function \
  --gen2 --region $REGION

Bạn sẽ thấy độ trễ 10 giây (khởi động nguội) trong lệnh gọi đầu tiên, sau đó thấy thông báo. Các lệnh gọi tiếp theo sẽ trả về ngay lập tức.

Đặt số lượng thực thể tối thiểu

Để loại bỏ tình trạng khởi động nguội trên yêu cầu đầu tiên, hãy triển khai lại hàm với cờ --min-instances được đặt thành 1 như sau:

gcloud functions deploy slow-function \
  --gen2 \
  --runtime go116 \
  --entry-point HelloWorld \
  --source . \
  --region $REGION \
  --trigger-http \
  --allow-unauthenticated \
  --min-instances 1

Kiểm thử

Kiểm tra lại hàm:

gcloud functions call slow-function \
  --gen2 --region $REGION

Bạn sẽ không thấy độ trễ 10 giây trong yêu cầu đầu tiên nữa. Vấn đề khởi động nguội cho lệnh gọi đầu tiên (sau một thời gian dài không có) đã biến mất, nhờ các thực thể tối thiểu!

Hãy xem phần sử dụng các thực thể tối thiểu để biết thêm thông tin.

9. Tính đồng thời

Trong Cloud Functions (thế hệ thứ 2), một thực thể hàm xử lý 1 yêu cầu đồng thời theo mặc định, nhưng bạn có thể chỉ định số lượng yêu cầu đồng thời mà một thực thể có thể xử lý đồng thời. Điều này cũng có thể hữu ích trong việc ngăn khởi động nguội vì không cần tạo thực thể hàm mới cho mọi yêu cầu song song.

Ở bước này, bạn sẽ sử dụng hàm có tốc độ khởi tạo chậm từ bước trước. Bạn sẽ gửi 10 yêu cầu và quan sát lại vấn đề khởi động nguội vì cần tạo các thực thể hàm mới để xử lý các yêu cầu.

Để khắc phục sự cố khởi động nguội, bạn sẽ triển khai một hàm khác có giá trị đồng thời là 100. Bạn sẽ nhận thấy rằng 10 yêu cầu này hiện không gây ra sự cố khởi động nguội và một thực thể hàm duy nhất có thể xử lý tất cả các yêu cầu.

Kiểm thử mà không đồng thời

Lấy URL của hàm:

SLOW_URL=$(gcloud functions describe slow-function --region $REGION --gen2 --format="value(serviceConfig.uri)")

Sử dụng công cụ đo điểm chuẩn nguồn mở có tên hey để gửi đồng thời 10 yêu cầu đến hàm chậm. hey đã được cài đặt trong Cloud Shell:

hey -n 10 -c 10 $SLOW_URL

Bạn sẽ thấy trong kết quả của hey rằng một số yêu cầu đang mất nhiều thời gian:

Summary:
  Total:        10.9053 secs
  Slowest:      10.9048 secs
  Fastest:      0.4439 secs
  Average:      9.7930 secs
  Requests/sec: 0.9170

  Total data:   310 bytes
  Size/request: 31 bytes

Response time histogram:
  0.444 [1]     |■■■■
  1.490 [0]     |
  2.536 [0]     |
  3.582 [0]     |
  4.628 [0]     |
  5.674 [0]     |
  6.720 [0]     |
  7.767 [0]     |
  8.813 [0]     |
  9.859 [0]     |
  10.905 [9]    |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

Điều này là do nhiều thực thể hàm hơn đang được tạo để xử lý các yêu cầu. Nếu kiểm tra số lượng thực thể đang hoạt động của hàm, bạn cũng sẽ thấy rằng có nhiều thực thể được tạo tại một thời điểm và các thực thể này đang gây ra vấn đề khởi động nguội:

9f5c6877836d62fb.png

Triển khai

Triển khai một hàm mới giống hệt với hàm trước đó. Sau khi được triển khai, bạn sẽ tăng mức độ đồng thời của mã:

gcloud functions deploy slow-concurrent-function \
  --gen2 \
  --runtime go116 \
  --entry-point HelloWorld \
  --source . \
  --region $REGION \
  --trigger-http \
  --allow-unauthenticated \
  --min-instances 1

Đặt tính đồng thời

Đặt số lượng đồng thời của dịch vụ Cloud Run cơ bản cho hàm thành 100 (tối đa là 1000). Điều này đảm bảo rằng một thực thể hàm có thể xử lý ít nhất 100 yêu cầu:

gcloud run services update slow-concurrent-function \
  --concurrency 100 \
  --cpu 1 \
  --region $REGION 

Kiểm thử bằng mô hình đồng thời

Lấy URL của hàm:

SLOW_CONCURRENT_URL=$(gcloud functions describe slow-concurrent-function --region $REGION --gen2 --format="value(serviceConfig.uri)")

Sau đó, hãy sử dụng hey để gửi 10 yêu cầu đồng thời:

hey -n 10 -c 10 $SLOW_CONCURRENT_URL

Bạn sẽ thấy trong kết quả của hey rằng tất cả các yêu cầu đều được xử lý nhanh chóng:

Summary:
  Total:        0.2164 secs
  Slowest:      0.2163 secs
  Fastest:      0.0921 secs
  Average:      0.2033 secs
  Requests/sec: 46.2028

  Total data:   310 bytes
  Size/request: 31 bytes

Response time histogram:
  0.092 [1]     |■■■■
  0.105 [0]     |
  0.117 [0]     |
  0.129 [0]     |
  0.142 [0]     |
  0.154 [0]     |
  0.167 [0]     |
  0.179 [0]     |
  0.191 [0]     |
  0.204 [0]     |
  0.216 [9]     |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

Một thực thể hàm duy nhất có thể xử lý tất cả các yêu cầu và vấn đề khởi động nguội đã biến mất, nhờ khả năng đồng thời tăng lên!

Hãy xem phần tính đồng thời để biết thêm thông tin.

10. Xin chúc mừng!

Chúc mừng bạn đã hoàn thành lớp học lập trình!

Nội dung đã đề cập

  • Tổng quan về Cloud Functions (thế hệ 2).
  • Cách viết một hàm phản hồi các lệnh gọi HTTP.
  • Cách viết một hàm phản hồi thông báo Pub/Sub.
  • Cách viết một hàm phản hồi các sự kiện trên Cloud Storage.
  • Cách viết một hàm phản hồi Nhật ký kiểm tra trên đám mây.
  • Cách phân chia lưu lượng truy cập giữa hai bản sửa đổi.
  • Cách tránh tình trạng khởi động nguội bằng số thực thể tối thiểu.
  • Cách thiết lập tính năng đồng thời.