Ngân hàng đề — Google Cloud Professional Cloud Developer
Tìm thấy 358 câu.
What should you do?
- A Use FTP to upload files.
- B Use CPanel to upload files.
- C Use signed URLs to upload files.
- D Change the API to be a multipart file upload API.
Xem giải thích
🧩 Phân tích chi tiết câu hỏi trắc nghiệm
Câu hỏi gốc (giữ nguyên):
You need to migrate an internal file upload API with an enforced 500-MB file size limit to App Engine. What should you do?
Giải thích nội dung câu hỏi:
🛤️ Câu hỏi này tập trung vào việc di chuyển (migrate) một API upload file nội bộ có giới hạn kích thước file tối đa 500 MB sang Google App Engine (một dịch vụ PaaS của Google Cloud Platform - GCP).
📏 Vấn đề chính: App Engine (đặc biệt là môi trường Standard) có giới hạn kích thước request mặc định là 32 MB (theo quota cập nhật mới nhất đến năm 2026). Do đó, không thể upload trực tiếp file 500 MB qua API thông thường mà không gặp lỗi quota hoặc timeout.
🎯 Mục tiêu: Tìm giải pháp tối ưu, tuân thủ giới hạn của App Engine, cho phép upload file lớn một cách an toàn và hiệu quả, đồng thời giữ nguyên logic API hiện tại.
💡 Bối cảnh cập nhật 2026: App Engine Flexible Environment hỗ trợ lớn hơn (lên đến 1 GB), nhưng Standard vẫn giữ quota chặt chẽ. Giải pháp chuẩn là kết hợp Cloud Storage (GCS) để bypass giới hạn.
✅ Đáp án đúng và lý do lựa chọn
Đáp án đúng: Use signed URLs to upload files.
Lý do chi tiết:
🔥 Signed URLs là URL tạm thời, có chữ ký bảo mật (signed) được tạo bởi App Engine API, cho phép client upload trực tiếp file lên Google Cloud Storage (GCS) mà bỏ qua giới hạn 32 MB của App Engine.
- App Engine chỉ xử lý tạo URL (request nhỏ), client upload thẳng vào GCS (hỗ trợ file lên đến 5 TB).
- An toàn: URL có thời hạn hết hạn, quyền kiểm soát (read/write), phù hợp migrate API với giới hạn 500 MB.
- Cập nhật 2026: Vẫn là best practice theo docs GCP, tích hợp seamless với App Engine (qua
google-cloud-storagelibrary).
✅ Hoàn hảo cho migrate: Giữ nguyên flow API (client gọi App Engine → nhận signed URL → upload).
📝 Giải thích tất cả các phương án (đúng/sai)
Dưới đây là phân tích từng lựa chọn. Giữ nguyên văn bản gốc bằng tiếng Anh, giải thích hoàn toàn bằng tiếng Việt:
-
❌ Use FTP to upload files.
❌ Sai hoàn toàn: App Engine không hỗ trợ FTP (hoặc bất kỳ giao thức file transfer truyền thống nào). App Engine là môi trường serverless, không expose file system trực tiếp. Sử dụng FTP sẽ thất bại vì không có endpoint FTP trên GCP. -
❌ Use CPanel to upload files.
❌ Sai và không liên quan: CPanel là control panel cho shared hosting truyền thống (như web server Linux), không tồn tại trên App Engine. App Engine không dùng cPanel; đây là giải pháp legacy, không migrate được sang cloud-native. -
✅ Use signed URLs to upload files.
✅ Đúng tuyệt đối: Như giải thích ở trên. Signed URLs cho phép upload trực tiếp GCS, bypass quota App Engine, hỗ trợ file 500 MB dễ dàng. Best practice từ GCP docs. -
❌ Change the API to be a multipart file upload API.
❌ Sai vì không giải quyết gốc rễ: Multipart upload (nhưmultipart/form-data) chỉ chia nhỏ dữ liệu, nhưng App Engine vẫn enforce quota 32 MB/request. File 500 MB cần >15 requests, gây phức tạp, timeout, và không scale tốt. Không phải giải pháp migrate chuẩn.
📘 Tài liệu tham khảo (cập nhật mới nhất 2026)
- App Engine Quotas: cloud.google.com/appengine/quotas – Xác nhận giới hạn 32 MB/request (Standard Env).
- Signed URLs cho Upload: cloud.google.com/storage/docs/access-control/signed-urls – Hướng dẫn tạo signed URL cho write/upload lớn.
- Migrate File Upload to App Engine: cloud.google.com/appengine/docs/standard/migrating-an-app – Best practices cho file lớn.
- GCP SDK (Python/Node): Libraries
google-cloud-storagev3.x (2026) hỗ trợ signed URLs seamless.
🛠️ Lời khuyên từ Google Cloud Professional Cloud Developer: Nếu implement, dùng generate_signed_url method trong App Engine handler. Test với gsutil để verify! 🚀
Which code snippet should you include in your Pod configuration?
-
A
livenessProbe: httpGet: path: /healthz port: 80 -
B
readinessProbe: httpGet: path: /healthz port: 80 -
C
loadbalancerHealthCheck: httpGet: path: /healthz port: 80 -
D
healthCheck: httpGet: path: /healthz port: 80
Xem giải thích
🧩 Phân tích chi tiết câu hỏi trắc nghiệm
✅ Nội dung câu hỏi được giải thích rõ ràng:
Câu hỏi tập trung vào việc triển khai ứng dụng trên Google Kubernetes Engine (GKE) cluster. Ứng dụng cung cấp một endpoint kiểm tra sức khỏe dựa trên HTTP tại đường dẫn /healthz. Mục tiêu là sử dụng endpoint này để quyết định liệu load balancer có nên chuyển hướng traffic đến pod hay không. Điều này liên quan đến cấu hình Pod trong Kubernetes (GKE sử dụng Kubernetes làm nền tảng). Cụ thể, chúng ta cần chọn đoạn code phù hợp để tích hợp health check endpoint vào Pod spec, đảm bảo load balancer (thường là Ingress hoặc Service LoadBalancer trong GKE) chỉ gửi traffic đến các pod "sẵn sàng" (ready).
🛠️ Bối cảnh kỹ thuật: Trong GKE, health checks giúp kubelet và load balancer quản lý pod hiệu quả. Phiên bản Kubernetes mới nhất (tính đến 2026, Kubernetes v1.30+) hỗ trợ các probe chuẩn như readinessProbe để kiểm tra pod có sẵn sàng nhận traffic không, tránh gửi request đến pod đang khởi động hoặc gặp vấn đề tạm thời.
🟢 Đáp án đúng:
readinessProbe:
httpGet:
path: /healthz
port: 80
📘 Lý do chọn đáp án đúng (bằng tiếng Việt):
ReadinessProbe là cơ chế chuẩn của Kubernetes dùng để xác định pod có sẵn sàng nhận traffic từ Service hoặc Load Balancer không. Khi probe này thành công (HTTP 200 từ /healthz), pod được đánh dấu "ready" và load balancer sẽ route traffic đến. Nếu probe thất bại, pod bị loại khỏi endpoint slice, ngăn traffic đến pod đó. Trong GKE, readinessProbe tích hợp trực tiếp với Google Cloud Load Balancer (HTTP(S) LB hoặc Network LB), đảm bảo zero-downtime deployment. Đây là cách khuyến nghị theo docs Kubernetes/GKE mới nhất (2026).
🔍 Giải thích tất cả các phương án (đúng/sai):
Dưới đây là phân tích từng lựa chọn một cách chi tiết, giữ nguyên văn bản gốc bằng tiếng Anh. Mỗi phương án được đánh giá với lý do cụ thể dựa trên Kubernetes spec (áp dụng phiên bản mới nhất v1.30+ trên GKE).
-
❌ Phương án SAI:
livenessProbe:
httpGet:
path: /healthz
port: 80
Giải thích: LivenessProbe dùng để kiểm tra pod còn sống hay không (alive). Nếu thất bại, Kubernetes sẽ restart pod (kill và recreate). Nó KHÔNG ảnh hưởng đến routing traffic từ load balancer – pod vẫn nhận traffic ngay cả khi livenessProbe fail tạm thời. Không phù hợp cho mục tiêu "determine whether traffic should be routed". -
✅ Phương án ĐÚNG:
readinessProbe:
httpGet:
path: /healthz
port: 80
Giải thích: Như đã nêu ở trên, readinessProbe chính xác kiểm soát readiness cho traffic routing. Endpoint /healthz trả HTTP 200 sẽ mark pod ready, load balancer route traffic; thất bại thì loại pod khỏi traffic flow. Hoàn hảo cho GKE load balancing. -
❌ Phương án SAI:
loadbalancerHealthCheck:
httpGet:
path: /healthz
port: 80
Giải thích: Không tồn tại field loadbalancerHealthCheck trong Pod spec của Kubernetes/GKE. Đây là cấu hình không hợp lệ, kubelet sẽ báo lỗi khi apply YAML. Load balancer health check ở GKE được derive từ readinessProbe, không phải field riêng. -
❌ Phương án SAI:
healthCheck:
httpGet:
path: /healthz
port: 80
Giải thích: healthCheck không phải là loại probe chuẩn trong Kubernetes Pod spec. Kubernetes chỉ hỗ trợ livenessProbe, readinessProbe, startupProbe. Field này sẽ gây validation error khi deploy trên GKE.
📚 Tài liệu tham khảo (cập nhật mới nhất đến 2026):
- Kubernetes Docs: Configure Liveness, Readiness and Startup Probes (v1.30+, nhấn mạnh readinessProbe cho traffic routing).
- GKE Docs: Health checks in GKE (tích hợp với Cloud Load Balancing, khuyến nghị dùng readinessProbe cho HTTP endpoints).
- AWS? Lưu ý: Câu hỏi là về GKE (Google Cloud), không liên quan AWS dù đề cập nhầm – kiến thức dựa trên Google Cloud/Kubernetes chuẩn.
Hy vọng phân tích này giúp bạn nắm vững! 🚀 Nếu cần ví dụ YAML đầy đủ, hãy hỏi thêm.
BigQuery service = BigQueryOptions.newBuilder().build().getService();
public void writeToBigQuery(Collection> rows){
for (Map row : rows) {
InsertAllRequest insertRequest = InsertAllRequest.newBuilder(
"datasetId", "tableId",
InsertAllRequest.RowToInsert.of(row).build();
service.insertAll(insertRequest);
}
}
Which improvement should you suggest your teammate make?
- A Include multiple rows with each request.
- B Perform the inserts in parallel by creating multiple threads.
- C Write each row to a Cloud Storage object, then load into BigQuery.
- D Write each row to a Cloud Storage object in parallel, then load into BigQuery.
Xem giải thích
🧩 Phân tích chi tiết nội dung câu hỏi
Câu hỏi yêu cầu review một đoạn code Java sử dụng BigQuery API để chèn (insert) một lượng lớn các hàng dữ liệu nhỏ (small rows) vào bảng BigQuery một cách hiệu quả.
📝 Mô tả code hiện tại:
- Code khởi tạo BigQuery service qua
BigQueryOptions. - Trong method
writeToBigQuery, nó lặp qua từngMap<String, String>(mỗi map đại diện cho một row) và thực hiện insert từng row một bằngInsertAllRequestvới chỉ một row per request. - Vấn đề chính: Với số lượng lớn rows (large number), việc gửi từng request riêng lẻ sẽ gây tốn kém về hiệu suất (latency cao, quota nhanh hết, chi phí tăng vì mỗi request có overhead). BigQuery streaming insert được thiết kế để hỗ trợ batching nhằm tối ưu throughput và giảm số lượng request.
🎯 Mục tiêu cải thiện: Tìm cách tối ưu hóa code để xử lý efficient cho large volume small rows, dựa trên best practices của BigQuery (cập nhật đến 2026: Streaming Inserts hỗ trợ batch tối đa 10.000 rows hoặc 10MB/request, quota 1 triệu rows/giờ/table tùy tier).
📘 Nguồn tham khảo:
- BigQuery Streaming Inserts (Google Cloud Docs, cập nhật 2024-2026).
- BigQuery API Reference - InsertAll (hỗ trợ multiple rows).
- Best Practices for Streaming (khuyến nghị batching để tránh quota throttling).
✅ Đáp án đúng và lý do lựa chọn
Đáp án đúng: Include multiple rows with each request.
🛠️ Lý do chi tiết:
- Code hiện tại gửi 1 row/request, dẫn đến số lượng request = số rows → inefficient (tăng latency ~50-100ms/request, dễ hit quota 100k rows/second/project).
- Cải thiện trực tiếp: Sử dụng
InsertAllRequestvớirowslist chứa multiple rows (batch), giảm số request xuống còn rows / batch_size (tối ưu 100-10k rows/request). - Lợi ích: Tăng throughput lên hàng triệu rows/phút, giảm chi phí (mỗi request tính phí cố định), phù hợp streaming real-time cho large small rows.
- Cách implement: Thu thập rows vào list, rồi
InsertAllRequest.newBuilder().setRows(rowsList).build().
✅ Đây là best practice chính thức từ Google Cloud cho streaming inserts.
📋 Giải thích tất cả các phương án (đúng/sai)
Dưới đây là phân tích từng lựa chọn, giữ nguyên văn bản gốc tiếng Anh, với lý do đúng/sai bằng tiếng Việt:
✅ Include multiple rows with each request.
- Đúng vì: Như phân tích trên, đây là cải thiện trực tiếp và hiệu quả nhất cho code streaming insert. Batching giảm overhead request, tối ưu quota và performance cho large small rows (hàng nghìn rows/second). Không cần thay đổi architecture, chỉ sửa loop thành batch.
❌ Perform the inserts in parallel by creating multiple threads.
- Sai vì: Parallel threads có thể tăng throughput bằng cách gửi concurrent requests, nhưng vẫn giữ 1 row/request → không giải quyết gốc rễ (vẫn tốn quota/request cao). BigQuery quota streaming là per-project/table (ví dụ: 100k rows/sec), parallel dễ gây throttling/error. Phức tạp code (threading overhead), không phải best practice chính (Google ưu tiên batch trước parallel).
❌ Write each row to a Cloud Storage object, then load into BigQuery.
- Sai vì: Chuyển sang batch load từ GCS efficient cho very large static data, nhưng sequential write từng row vào GCS object sẽ chậm hơn (I/O GCS latency + loop sequential). Không phù hợp "small rows" continuous (thêm bước trung gian, latency cao hơn streaming ~seconds vs milliseconds). Code gốc là streaming, cải thiện này thay đổi hoàn toàn flow.
❌ Write each row to a Cloud Storage object in parallel, then load into BigQuery.
- Sai vì: Parallel write GCS tốt hơn option trước (tăng speed), và load job BigQuery rất efficient (free load, atomic), nhưng vẫn không phải cải thiện tối ưu cho code streaming. Thêm complexity (quản lý GCS objects, trigger load job), latency cao (batch load ~1-2 phút), không real-time như streaming. Google khuyến nghị streaming + batch cho high-velocity small rows thay vì GCS detour.
🧩 Tóm tắt khuyến nghị: Ưu tiên batching streaming trước, chỉ dùng GCS/load nếu volume > hàng tỷ rows hoặc offline processing. Code cải thiện mẫu:
List<InsertAllRequest.RowToInsert> rowList = rows.stream().map(InsertAllRequest.RowToInsert::of).collect(Collectors.toList());
InsertAllRequest request = InsertAllRequest.newBuilder("datasetId", "tableId").setRows(rowList).build();
service.insertAll(request);
Hy vọng phân tích giúp teammate optimize code! 🚀
What should you do?
- A Define a GKE Service. Clients should use the name of the A record in Cloud DNS to find the service's cluster IP address.
- B Define a GKE Service. Clients should use the service name in the URL to connect to the service.
- C Define a GKE Endpoint. Clients should get the endpoint name from the appropriate environment variable in the client container.
- D Define a GKE Endpoint. Clients should get the endpoint name from Cloud DNS.
Xem giải thích
🧩 Phân tích nội dung câu hỏi
Câu hỏi tập trung vào việc phát triển một API xử lý thay đổi kích thước hình ảnh JPEG (image-resizing API) được host trên Google Kubernetes Engine (GKE). Các client gọi API này nằm trong cùng một GKE cluster. Mục tiêu là cho phép các client có thể lấy được địa chỉ IP của service một cách dễ dàng và hiệu quả.
🛠️ Chi tiết vấn đề:
- Trong Kubernetes (GKE), service cần được expose để các pod/client khác trong cluster có thể truy cập qua tên service (DNS discovery nội bộ).
- Không yêu cầu expose ra ngoài cluster (external IP), vì client ở nội bộ.
- Cần sử dụng cơ chế chuẩn của Kubernetes để resolve tên service thành cluster IP tự động, không phụ thuộc vào external DNS như Cloud DNS.
Kiến thức cập nhật đến 2026: Theo Kubernetes v1.30+ (tích hợp trong GKE Standard/Enterprise 2026), Kubernetes Service với loại ClusterIP (mặc định) cung cấp DNS resolution nội bộ qua CoreDNS (kube-dns), cho phép client dùng http://service-name.namespace.svc.cluster.local để kết nối.
📘 Tài liệu tham khảo:
- Kubernetes Services Docs (2026).
- GKE Networking Overview (cập nhật 2026).
✅ Đáp án đúng
Define a GKE Service. Clients should use the service name in the URL to connect to the service.
Lý do chọn:
- Trong GKE/Kubernetes, khi định nghĩa một Service (loại ClusterIP), Kubernetes tự động tạo DNS record nội bộ (qua CoreDNS). Client trong cùng cluster chỉ cần dùng tên service trong URL (ví dụ:
http://my-service.my-namespace.svc.cluster.local) để resolve thành cluster IP và kết nối load-balanced đến các pod backend. - Đây là cách chuẩn, đơn giản, tự động nhất cho internal communication, không cần cấu hình thêm external DNS hay endpoint thủ công.
- Hỗ trợ service discovery native, scalable và highly available.
❌ Giải thích tất cả các phương án
-
[SAI] Define a GKE Service. Clients should use the name of the A record in Cloud DNS to find the service's cluster IP address.
❌ Sai vì: Cloud DNS là dịch vụ external DNS của Google Cloud, dùng cho public/private zones bên ngoài cluster. Trong cùng GKE cluster, không cần và không nên dùng Cloud DNS cho service discovery nội bộ – điều này phức tạp, tốn kém và không tự động. Kubernetes dùng CoreDNS nội bộ để resolve service name trực tiếp, không qua A record external. -
[ĐÚNG] Define a GKE Service. Clients should use the service name in the URL to connect to the service.
✅ Đúng vì: Như giải thích ở trên, đây là best practice. Service name được resolve tự động thành cluster IP qua DNS nội bộ Kubernetes, client chỉ cần dùng tên trong URL mà không cần biết IP cụ thể (IP có thể thay đổi). -
[SAI] Define a GKE Endpoint. Clients should get the endpoint name from the appropriate environment variable in the client container.
❌ Sai vì: Endpoint là object low-level chỉ định các pod IP trực tiếp (dùng khi không có Service). Không có "endpoint name" chuẩn để lấy từ environment variable (env var chỉ dùng cho ConfigMap/Secret). Cách này thủ công, không scalable (phải update env var khi pod thay đổi), và không load-balance như Service. -
[SAI] Define a GKE Endpoint. Clients should get the endpoint name from Cloud DNS.
❌ Sai vì: Endpoint không được expose qua Cloud DNS (external). Endpoint chỉ dùng nội bộ và không có DNS integration tự động. Sử dụng Cloud DNS cho endpoint là sai hoàn toàn, vì nó không hỗ trợ dynamic pod endpoints và vi phạm nguyên tắc internal cluster communication.
What should you do?
- A Download the binary from the internet during the build process.
- B Build a custom cloud builder image and reference the image in your build steps.
- C Include the binary in your Cloud Source Repositories repository and reference it in your build scripts.
- D Ask to have the binary added to the Cloud Build environment by filing a feature request against the Cloud Build public Issue Tracker.
Xem giải thích
🧩 Phân tích nội dung câu hỏi
Câu hỏi xoay quanh tình huống sử dụng Cloud Build (dịch vụ xây dựng và kiểm thử CI/CD trên Google Cloud Platform - GCP) để build và test mã nguồn ứng dụng được lưu trữ trong Cloud Source Repositories (kho lưu trữ mã nguồn của GCP). Vấn đề chính là quy trình build yêu cầu một build tool (công cụ xây dựng) không có sẵn trong môi trường Cloud Build tiêu chuẩn.
📌 Mục tiêu: Tìm cách bổ sung công cụ này một cách hiệu quả, an toàn và tuân thủ best practices của GCP. Đây là câu hỏi kiểm tra kiến thức về tùy chỉnh môi trường build trong Cloud Build (cập nhật đến năm 2026, theo tài liệu GCP mới nhất).
✅ Đáp án đúng và lý do lựa chọn
Đáp án đúng: Build a custom cloud builder image and reference the image in your build steps.
🛠️ Lý do: Đây là phương pháp best practice được GCP khuyến nghị chính thức. Cloud Build hỗ trợ tạo custom builder image (hình ảnh builder tùy chỉnh) bằng cách sử dụng Dockerfile, cài đặt công cụ cần thiết vào image, sau đó tham chiếu image này trong các bước build (build steps) qua trường image trong config cloudbuild.yaml. Cách này đảm bảo tính tái sử dụng, bảo mật (không phụ thuộc internet), tốc độ cao và dễ quản lý. Không làm ảnh hưởng đến repo mã nguồn và tránh các vấn đề bảo mật từ feature request.
📋 Giải thích chi tiết tất cả các phương án
Dưới đây là phân tích từng phương án (giữ nguyên văn bản gốc bằng tiếng Anh), đánh dấu đúng/sai và lý do bằng tiếng Việt:
-
Download the binary from the internet during the build process.
❌ Sai: Cloud Build không cho phép truy cập internet trực tiếp trong các build steps tiêu chuẩn (theo chính sách bảo mật của GCP từ 2020 và vẫn áp dụng đến 2026). Việc download binary từ internet sẽ thất bại, chậm chạp, không an toàn (rủi ro malware) và không đáng tin cậy do phụ thuộc mạng. -
Build a custom cloud builder image and reference the image in your build steps.
✅ Đúng: Như đã giải thích ở trên, đây là cách chính thức và tối ưu của GCP. Bạn có thể push image lên Container Registry hoặc Artifact Registry, rồi sử dụng trongcloudbuild.yamlnhư:steps: - name: 'gcr.io/your-project/custom-builder' args: ['build-command']🏆 Hoàn hảo cho scalability và reproducibility.
-
Include the binary in your Cloud Source Repositories repository and reference it in your build scripts.
❌ Sai: Việc nhúng binary vào repo sẽ làm repo phình to (vượt giới hạn kích thước repo), khó quản lý phiên bản, và vi phạm nguyên tắc "repo chỉ chứa source code". Binary có thể thay đổi kích thước lớn, ảnh hưởng hiệu suất clone/pull, không khuyến khích theo best practices GCP. -
Ask to have the binary added to the Cloud Build environment by filing a feature request against the Cloud Build public Issue Tracker.
❌ Sai: Đây là cách không thực tế và thụ động. GCP cung cấp hơn 20+ builder chuẩn (như ubuntu, golang, node.js) và khuyến khích custom builder thay vì chờ feature request (có thể mất hàng năm). Issue Tracker chỉ để báo bug, không phải yêu cầu thêm tool cá nhân hóa.
📘 Tài liệu tham khảo
- Chính thức GCP: Cloud Build Custom Builders (cập nhật 2025-2026).
- Cloud Build config reference: cloudbuild.yaml schema.
- Best practices: Extending Cloud Build – Xác nhận custom image là cách chuẩn cho tool không có sẵn.
🔍 Kiểm tra thêm tại Google Cloud Console > Cloud Build > Images để thực hành!
What should you do?
- A Install the Observability Logging Agent and configure it to send the application logs.
- B Use a Observability Logging Library to log directly from the application to Observability Logging.
- C Provide the log file folder path in the metadata of the instance to configure it to send the application logs.
- D Change the application to log to /var/log so that its logs are automatically sent to Observability Logging.
Xem giải thích
🧩 Phân tích chi tiết nội dung câu hỏi
Câu hỏi tập trung vào Google Cloud Compute Engine (một dịch vụ VM ảo trên Google Cloud Platform - GCP). Tình huống: Bạn đang triển khai ứng dụng lên một instance Compute Engine, ứng dụng này ghi logs vào đĩa (disk) (không phải stdout/stderr). Yêu cầu: Xem logs trong Observability Logging (nay là Cloud Logging trong Google Cloud Observability) mà KHÔNG thay đổi code ứng dụng.
📌 Mục tiêu chính: Thu thập và gửi logs từ file trên disk đến Cloud Logging một cách tự động, không can thiệp vào mã nguồn. Đây là kịch bản phổ biến trong production để giám sát mà không ảnh hưởng đến dev code. Kiến thức dựa trên phiên bản mới nhất GCP đến 2026: Sử dụng Ops Agent (thay thế Logging Agent cũ từ 2023, tích hợp logging, metrics, traces trong Google Cloud Observability).
✅ Đáp án đúng và lý do lựa chọn
Đáp án đúng: Install the Observability Logging Agent and configure it to send the application logs.
🛠️ Lý do chi tiết:
- Ops Agent (hay Observability Logging Agent) là agent chính thức của Google Cloud để thu thập logs từ file trên disk của Compute Engine VM.
- Bạn chỉ cần cài đặt agent (qua gcloud hoặc startup script) và config file (fluentbit hoặc fluentd config) để chỉ định đường dẫn thư mục logs của app. Agent sẽ tail file logs, parse và gửi trực tiếp đến Cloud Logging.
- Ưu điểm: Không cần thay đổi code, hỗ trợ custom format (JSON, text), filter, và tích hợp metrics/traces. Đây là best practice theo docs GCP 2026.
- Cách thực hiện nhanh:
sudo apt-get install google-cloud-ops-agentrồi edit/etc/google-cloud-ops-agent/config.yamlvới phần logs section.
📘 Nguồn tham khảo:
📋 Giải thích tất cả các phương án (đúng/sai)
-
Install the Observability Logging Agent and configure it to send the application logs.
✅ Đúng 🟢: Như giải thích trên, đây là phương pháp chuẩn, không yêu cầu thay đổi code. Agent tự động đọc file logs từ đường dẫn bất kỳ (không chỉ /var/log), hỗ trợ Compute Engine native integration. -
Use a Observability Logging Library to log directly from the application to Observability Logging.
❌ Sai 🔴: Logging Library (như Google Cloud Logging client libraries cho Python/Java/Node.js) yêu cầu thay đổi code ứng dụng để gọi API log trực tiếp (ví dụ:logging_client.log_text(...)). Vi phạm yêu cầu "without changing the application code". -
Provide the log file folder path in the metadata of the instance to configure it to send the application logs.
❌ Sai 🔴: Metadata của Compute Engine (quagcloud compute instances add-metadata) chỉ dùng cho startup scripts, SSH keys, hoặc custom data, KHÔNG có tính năng tự động gửi logs. Không tồn tại cơ chế native như vậy trong GCP (khác với một số AWS features). -
Change the application to log to /var/log so that its logs are automatically sent to Observability Logging.
❌ Sai 🔴: GCP KHÔNG tự động gửi logs từ /var/log mà không có agent. Chỉ có serial console logs hoặc systemd-journald (nếu config) mới tự động, nhưng app logs custom vẫn cần Ops Agent để tail và gửi. Hơn nữa, "change the application" vi phạm yêu cầu không thay đổi code.
🧠 Lưu ý bổ sung: Trong GCP 2026, Ops Agent là unified agent cho toàn bộ Observability (Logging + Monitoring + Tracing). Nếu VM dùng Container-Optimized OS, dùng sidecar container cho agent. Test bằng Logs Explorer trong console để verify!
Requests" status code.
How should you handle this error?
- A Add a cache-control header to the objects.
- B Request a quota increase from the GCP Console.
- C Retry the request with a truncated exponential backoff strategy.
- D Change the storage class of the Cloud Storage bucket to Multi-regional.
Xem giải thích
🧩 Phân tích nội dung câu hỏi
Câu hỏi mô tả một dịch vụ (service) đang thêm văn bản vào hình ảnh được đọc từ Cloud Storage (dịch vụ lưu trữ của Google Cloud Platform - GCP). Trong giờ cao điểm, các yêu cầu truy cập Cloud Storage thất bại với mã lỗi HTTP 429 "Too Many Requests".
✅ Ý nghĩa lỗi 429: Đây là lỗi rate limiting (giới hạn tốc độ yêu cầu), xảy ra khi ứng dụng gửi quá nhiều request trong thời gian ngắn, vượt quá quota (giới hạn) của Cloud Storage (ví dụ: 1000-5000 request/giây tùy loại operation, theo tài liệu GCP mới nhất 2024-2026).
🛠️ Mục tiêu: Tìm cách xử lý lỗi này một cách hiệu quả, tập trung vào client-side (phía ứng dụng gọi API), không phải thay đổi cấu hình bucket hay quota.
✅ Đáp án đúng và lý do lựa chọn
Đáp án đúng: Retry the request with a truncated exponential backoff strategy.
📘 Lý do chi tiết:
- Đây là best practice chuẩn của GCP cho xử lý lỗi 429 (và 5xx khác). Truncated exponential backoff nghĩa là:
- Retry (thử lại) request sau khoảng delay tăng dần theo hàm mũ (exponential: 1s → 2s → 4s...).
- Truncated (cắt cụt): Giới hạn số lần retry tối đa (ví dụ: 5-10 lần) để tránh loop vô tận.
- Giúp giảm tải server, tránh "thundering herd" (đám đông request đồng thời).
- Được khuyến nghị trong GCP Client Libraries (Java, Python, Go...) và Google Cloud Storage JSON/XML API docs (cập nhật 2024: hỗ trợ jitter/randomization để tránh đồng bộ retry).
🧩 Nguồn tham khảo: - Cloud Storage quotas ✅
- Best practices for handling API errors ✅
- Exponential backoff in GCP APIs (phiên bản mới nhất 2026 không thay đổi cơ bản).
❌ Phân tích tất cả các phương án
Dưới đây là giải thích từng phương án một cách chi tiết, giữ nguyên văn bản gốc bằng tiếng Anh. Mỗi phương án được đánh giá đúng/sai dựa trên best practices GCP:
-
[SAI] Add a cache-control header to the objects.
❌ Giải thích sai: Cache-Control header chỉ kiểm soát caching ở client/browser/CDN (như giữ image trong cache để giảm request lặp lại). Không giải quyết rate limiting 429 vì lỗi xảy ra do tốc độ request cao đột ngột, không phải cache miss. Thêm header có thể giúp lâu dài nếu request lặp, nhưng không handle lỗi ngay lập tức và không liên quan trực tiếp đến quota Cloud Storage. -
[SAI] Request a quota increase from the GCP Console.
❌ Giải thích sai: Tăng quota (qua GCP Console > IAM & Admin > Quotas) là giải pháp dài hạn cho workload lớn, nhưng:- Không phải cách handle error realtime (phải chờ approve, có thể mất ngày).
- GCP khuyến nghị luôn dùng backoff trước khi yêu cầu quota (quota mặc định đã cao: ~5000 GET/s).
- Không giải quyết giờ cao điểm đột biến, chỉ trì hoãn vấn đề.
-
[ĐÚNG] Retry the request with a truncated exponential backoff strategy.
✅ Giải thích đúng: Như đã nêu ở trên, đây là cách xử lý chuẩn, tự động cho transient errors như 429. GCP client libraries tích hợp sẵn (ví dụ:google-cloud-storagePython lib dùngRetrypolicy với exponential backoff mặc định). Hiệu quả cao, scalable, và tránh overload hệ thống. -
[SAI] Change the storage class of the Cloud Storage bucket to Multi-regional.
❌ Giải thích sai: Storage class (Multi-regional nhưmulti-regionalhoặcdual-regional) ảnh hưởng đến durability/latency/chi phí (phân phối multi-zone/region), không ảnh hưởng đến rate quotas. Quota Cloud Storage là per-project/per-region (không phụ thuộc class). Thay đổi chỉ tốn kém và downtime nhỏ, không fix 429.
🛠️ Lời khuyên bổ sung: Triển khai backoff với jitter (random delay) để tránh tất cả client retry cùng lúc. Sử dụng GCP Monitoring theo dõi quota và alert 429 sớm! 🚀
* Support HTTPs
* Minimize bandwidth cost
* Integrate easily with mobile apps
Which API architecture should you use?
- A RESTful APIs
- B MQTT for APIs
- C gRPC-based APIs
- D SOAP-based APIs
Xem giải thích
🧩 Phân tích chi tiết nội dung câu hỏi
Câu hỏi tập trung vào việc lựa chọn kiến trúc API phù hợp cho một ứng dụng API được sử dụng bởi các ứng dụng di động Android và iOS. Các yêu cầu cụ thể của API bao gồm:
- Hỗ trợ HTTPS: Đảm bảo kết nối an toàn, mã hóa dữ liệu truyền tải.
- Giảm thiểu chi phí băng thông (Minimize bandwidth cost): Cần giao thức tiết kiệm dữ liệu, tránh overhead lớn như text-based verbose.
- Tích hợp dễ dàng với ứng dụng di động (Integrate easily with mobile apps): Hỗ trợ đa nền tảng, ngôn ngữ lập trình phổ biến (như Java/Kotlin cho Android, Swift/Objective-C cho iOS), và hiệu suất cao cho thiết bị di động có kết nối không ổn định.
🛠️ Bối cảnh kỹ thuật: Đây là câu hỏi về thiết kế API hiện đại, thường áp dụng trong môi trường cloud như AWS API Gateway (hỗ trợ gRPC từ năm 2021 và cập nhật ổn định đến 2026 với HTTP/2+). Kiến thức AWS mới nhất (2026) nhấn mạnh gRPC cho các API hiệu suất cao, đặc biệt với mobile, nhờ Protocol Buffers (Protobuf) nén dữ liệu binary, streaming bidirectional, và client libraries chính thức cho Android/iOS.
✅ Đáp án đúng: gRPC-based APIs
Lý do lựa chọn:
- Hỗ trợ HTTPS hoàn hảo qua HTTP/2 (TLS 1.3+), đảm bảo bảo mật end-to-end. ✅
- Tiết kiệm băng thông tối ưu: Sử dụng Protocol Buffers (Protobuf) – định dạng binary compact, nén dữ liệu lên đến 50-70% so với JSON/XML, lý tưởng cho mobile với dữ liệu nhỏ gọn. AWS đo lường cho thấy gRPC giảm latency và bandwidth đáng kể. 📉
- Tích hợp dễ dàng với mobile: Có client SDK chính thức cho Android (gRPC-Java), iOS (gRPC-ObjectiveC/Swift), hỗ trợ code generation tự động từ .proto files, multiplexing, và streaming (unidirectional/bidirectional) phù hợp kết nối di động yếu. 🏗️
- Cập nhật AWS 2026: AWS API Gateway v2 hỗ trợ gRPC native, tích hợp Lambda/Fargate, autoscaling, với metrics chi tiết cho mobile traffic.
📋 Giải thích tất cả các phương án (đúng/sai)
Dưới đây là phân tích từng lựa chọn giữ nguyên văn bản gốc tiếng Anh. Mỗi phương án được đánh giá dựa trên 3 yêu cầu chính, sử dụng kiến thức AWS cập nhật 2026.
-
RESTful APIs ❌
Sai vì: RESTful thường dùng JSON/XML over HTTP/1.1, dữ liệu text verbose dẫn đến bandwidth cao (overhead 2-3x so gRPC). Hỗ trợ HTTPS nhưng không tối ưu mobile (không streaming native, polling kém hiệu quả). AWS API Gateway hỗ trợ REST tốt nhưng không tiết kiệm bandwidth bằng gRPC. Phù hợp web nhưng không lý tưởng di động. -
MQTT for APIs ❌
Sai vì: MQTT là giao thức pub/sub messaging nhẹ cho IoT (TCP-based), không phải kiến trúc API chuẩn cho request-response như mobile apps cần. Hỗ trợ HTTPS qua MQTT over WebSocket nhưng khó tích hợp với Android/iOS API calls thông thường (yêu cầu broker như AWS IoT Core). Bandwidth thấp cho pub/sub nhưng không phù hợp API REST-like, thiếu HTTPS native mạnh mẽ. -
gRPC-based APIs ✅
Đúng vì: Hoàn hảo khớp 3 yêu cầu như giải thích ở trên. AWS khuyến nghị gRPC cho microservices và mobile trong Well-Architected Framework 2026, với hỗ trợ HTTP/2, Protobuf, và client libs đa nền tảng. -
SOAP-based APIs ❌
Sai vì: SOAP dùng XML heavyweight, bandwidth cực cao (overhead lớn do envelope/tags), chỉ hỗ trợ HTTPS cơ bản. Tích hợp mobile kém (thư viện ít, verbose parsing chậm trên thiết bị). AWS không ưu tiên SOAP (deprecated trong hầu hết services), thay bằng REST/gRPC từ lâu.
📘 Tài liệu tham khảo (cập nhật mới nhất 2026)
- AWS API Gateway gRPC docs: docs.aws.amazon.com/apigateway/latest/developerguide/grpc-api.html – Chi tiết support HTTP/2 & Protobuf.
- gRPC official for mobile: grpc.io/docs/languages/ – Android/iOS SDKs.
- AWS Well-Architected: API best practices: aws.amazon.com/architecture/well-architected/ – Khuyến nghị gRPC cho low-latency mobile (Operational Excellence pillar, 2026 edition).
- Benchmark gRPC vs REST: AWS re:Post & Google Cloud benchmarks cho thấy gRPC tiết kiệm 60% bandwidth (tìm "gRPC bandwidth mobile AWS").
Hy vọng phân tích này giúp bạn ôn thi hiệu quả! 🚀 Nếu cần ví dụ code, hỏi thêm nhé.
How should you perform reads from Cloud Spanner for this application?
- A Perform Read-Only transactions.
- B Perform stale reads using single-read methods.
- C Perform strong reads using single-read methods.
- D Perform stale reads using read-write transactions.
Xem giải thích
🧩 Phân tích chi tiết nội dung câu hỏi
Câu hỏi tập trung vào Google Cloud Spanner (không phải AWS như mô tả ban đầu, có thể là nhầm lẫn), một cơ sở dữ liệu quan hệ phân tán hỗ trợ SQL toàn cầu với tính nhất quán mạnh mẽ. Ứng dụng nhận input từ người dùng, lưu vào bảng trong Cloud Spanner, sau đó publish đến contacts của người dùng. Đặc điểm quan trọng:
- Ưu tiên latency thấp (nhạy cảm với độ trễ).
- Ít nhạy cảm với consistency (có thể chấp nhận dữ liệu hơi cũ - stale data).
Mục tiêu: Chọn cách thực hiện reads (đọc dữ liệu) từ Spanner sao cho tối ưu latency, chấp nhận eventual consistency thay vì strong consistency.
🛠️ Lý do ngữ cảnh: Publish đến contacts cần reads nhanh (low latency) để phản hồi user kịp thời, không cần dữ liệu mới nhất tuyệt đối (ví dụ: danh sách contacts có thể hơi cũ một chút vẫn ổn).
✅ Đáp án đúng và lý do lựa chọn
Đáp án đúng: Perform stale reads using single-read methods.
🧩 Lý do:
- Single-read methods (như
Read()hoặcLookup()không giao dịch - non-transactional) có latency thấp nhất vì không cần lock hoặc overhead của transaction. - Stale reads sử dụng
ReadOptionsvớimaxStaleness(ví dụ: 15 giây) hoặcexactStaleness, cho phép đọc dữ liệu cũ để giảm tải replication và tăng tốc độ (phù hợp ứng dụng ít nhạy consistency). - Theo docs Spanner mới nhất (2024-2026), stale reads qua single methods giảm latency lên đến 60-90% so với strong reads, lý tưởng cho workload read-heavy như publish contacts.
📘 Nguồn: Cloud Spanner Reads & SQL Queries và Transactions Overview.
📋 Giải thích tất cả các phương án (đúng & sai)
Dưới đây là phân tích từng lựa chọn, giữ nguyên văn bản gốc tiếng Anh. Mỗi phương án được đánh giá dựa trên hiệu suất latency vs consistency trong Spanner (phiên bản mới nhất 2026, hỗ trợ Spanner SQL với improved staleness bounds).
-
❌ Perform Read-Only transactions.
Sai vì: Read-only transactions (nhưReadOnlyTransaction) mặc định strong consistency (đọc dữ liệu mới nhất), hoặc nếu dùngboundedStalenessthì vẫn có overhead cao hơn single reads (phải khởi tạo transaction context, lock rows). Không tối ưu cho latency-sensitive app, dù có thể stale nhưng chậm hơn single methods ~20-50ms. -
✅ Perform stale reads using single-read methods.
Đúng vì: Như giải thích ở trên, single-read methods (non-transactionalRead()/Lookup()) kết hợpReadOptionscho stale reads mang lại latency thấp nhất (sub-10ms thường xuyên), chấp nhận stale data phù hợp yêu cầu "more sensitive to latency, less to consistency". Hoàn hảo cho read input trước publish. -
❌ Perform strong reads using single-read methods.
Sai vì: Single-read methods mặc định strong consistency (exact timestamp hiện tại), yêu cầu full replication sync → latency cao hơn stale reads (có thể +100ms trong multi-region). Không phù hợp app ưu tiên tốc độ, dù đơn giản không transaction. -
❌ Perform stale reads using read-write transactions.
Sai vì: Read-write transactions luôn strong reads (không hỗ trợ stale), chỉ dùng cho write kèm read với linearizable consistency. Overhead lớn (2-phase commit), latency cao nhất (~50-200ms), hoàn toàn ngược yêu cầu low-latency.
🛠️ Lời khuyên thực tế: Trong code Node.js/Python, dùng session.singleUse().read() với options: {maxStaleness: Duration.fromSeconds(30)} để implement. Test với Spanner Emulator cho latency metrics.
📘 Tài liệu tham khảo chính:
- Spanner Consistency & Latency.
- Best Practices for Reads.
- Cập nhật 2026: Spanner v2.1+ hỗ trợ adaptive staleness tự động optimize.
Which change should you make to the GKE Deployment object shown below?
apiVersion: apps/v1
kind: Deployment
metadata:
name: ecommerce-frontend-deployment
spec:
replicas: 3
selector:
matchLabels:
app: ecommerce-frontend
template:
metadata:
labels:
app: ecommerce-frontend
spec:
containers:
- name: ecommerce-frontend-webapp
image: ecommerce-frontend-webapp:1.7.9
ports:
- containerPort: 80
- A Set the Deployment strategy to RollingUpdate with maxSurge set to 0, maxUnavailable set to 1.
- B Set the Deployment strategy to RollingUpdate with maxSurge set to 1, maxUnavailable set to 0.
- C Set the Deployment strategy to Recreate with maxSurge set to 0, maxUnavailable set to 1.
- D Set the Deployment strategy to Recreate with maxSurge set to 1, maxUnavailable set to 0.
Xem giải thích
🧩 Phân tích nội dung câu hỏi
Câu hỏi tập trung vào việc cập nhật Deployment trong Google Kubernetes Engine (GKE) – một dịch vụ managed Kubernetes trên Google Cloud. Ứng dụng đang chạy với 3 replicas (sử dụng image phiên bản ecommerce-frontend-webapp:1.7.9). Khi CI/CD tool cập nhật image mới trong spec.template.spec.containers[0].image, Deployment sẽ trigger quá trình rollout.
Yêu cầu cụ thể:
- Deploy ít nhất 1 replica của phiên bản mới ngay khi thay đổi được apply.
- Giữ nguyên tất cả replicas cũ (previous replicas) cho đến khi replica mới đầu tiên trở nên healthy (sẵn sàng phục vụ, dựa trên readiness probe).
Mặc định, Kubernetes Deployment sử dụng strategy RollingUpdate với maxSurge=25% và maxUnavailable=25% (có thể gây giảm capacity tạm thời hoặc tạo extra pods). Chúng ta cần chỉnh strategy trong YAML Deployment để đáp ứng chính xác yêu cầu: ưu tiên tạo new pod trước, chờ healthy, không scale down old pods ngay lập tức.
📘 Nguồn tham khảo:
- Kubernetes Documentation (phiên bản mới nhất 1.30+ đến 2026): Deployment Strategy.
- GKE Documentation: Updating Deployments.
✅ Đáp án đúng
Set the Deployment strategy to RollingUpdate with maxSurge set to 1, maxUnavailable set to 0.
Lý do lựa chọn:
- Với
replicas: 3, strategy này sẽ tạo ngay 1 pod mới (maxSurge=1 → total tạm thời 4 pods: 3 old + 1 new). - Kubernetes chờ pod mới healthy (ready) trước khi tiến hành bước tiếp theo.
maxUnavailable=0đảm bảo không scale down bất kỳ old pod nào, giữ nguyên 3 previous replicas đầy đủ.- Kết quả: Đáp ứng chính xác "deploy at least 1 new replica" và "maintain previous replicas until the new replica is healthy". Rollout sẽ pause ở trạng thái 3 old + 1 new healthy (không tự hoàn tất full 3 new do surge limit, nhưng yêu cầu chỉ cần ít nhất 1 new).
🛠️ YAML chỉnh sửa mẫu (thêm vào spec):
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
❌ Phân tích tất cả các phương án
Dưới đây là phân tích chi tiết từng lựa chọn. Tôi giữ nguyên văn bản gốc tiếng Anh của phương án, chỉ giải thích bằng tiếng Việt với lý do đúng/sai dựa trên hành vi Kubernetes RollingUpdate/Recreate (không thay đổi đến 2026).
-
[SAI] Set the Deployment strategy to RollingUpdate with maxSurge set to 0, maxUnavailable set to 1.
❌ Sai vì: Không tạo extra pod (surge=0 → total luôn =3). Nó scale down 1 old pod trước (unavailable=1 → còn 2 old), rồi tạo 1 new pod thay thế. Lúc này có lúc chỉ 2 old + 1 new (không tạo new trước, vi phạm "deploy at least 1 new" mà không maintain full previous). Gây giảm capacity tạm thời, không chờ new healthy trước khi giảm old. -
[ĐÚNG] Set the Deployment strategy to RollingUpdate with maxSurge set to 1, maxUnavailable set to 0.
✅ Đúng như giải thích ở trên: Tạo 1 new extra, chờ healthy, giữ full 3 old → Hoàn hảo khớp yêu cầu. -
[SAI] Set the Deployment strategy to Recreate with maxSurge set to 0, maxUnavailable set to 1.
❌ Sai vì: Strategy Recreate là "all-or-nothing": Scale all old pods xuống 0 trước (downtime toàn bộ), rồi tạo full 3 new pods. Surge/unavailable không áp dụng cho Recreate (bị ignore). Không deploy new trong khi maintain previous, gây downtime lớn. -
[SAI] Set the Deployment strategy to Recreate with maxSurge set to 1, maxUnavailable set to 0.
❌ Sai vì: Tương tự trên, Recreate bỏ qua surge/unavailable. Vẫn terminate tất cả 3 old trước, tạo new sau → Không maintain previous replicas, gây downtime 100% capacity.
🧩 Tóm tắt so sánh:
- RollingUpdate linh hoạt, partition rollout.
- Recreate phù hợp test/non-prod, không zero-downtime.
- Combo surge=1 + unavailable=0 lý tưởng cho "canary-like" đầu tiên mà yêu cầu mô tả!