Skip to content

Quản lý quota: Cơ chế giới hạn và chiến lược đối phó

Vì sao Quota Management quan trọng

Quota là một khía cạnh thường bị xem nhẹ trong vận hành GCP. Khi bạn chạm quota:

gcloud compute instances create test-vm
ERROR: (gcloud.compute.instances.create) Could not fetch resource:
- Invalid value for field 'resource.projectId': 'my-project'. 
  Project 'my-project' exceeds quota for 'CPUS' in region 'us-central1'.

Hệ quả:

  • Triển khai production bị chặn (không thể scale)
  • Pipeline CI/CD thất bại (không tạo được môi trường test)
  • Chạm quota liên quan chi phí → gây sốc hóa đơn
  • Lỗi dây chuyền giữa các microservice

Xét theo quy mô:

  • Org nhỏ (10 projects): ít khi chạm quota
  • Org vừa (100 projects): cần quản lý cẩn thận
  • Org lớn (1000+ projects): quota là hạ tầng quan trọng

Phân cấp quota

Khác với IAM policies (có kế thừa), quota trong GCP được quản lý độc lập ở từng cấp:

Organization
├── Quota cấp project (chính)
├── Quota cấp folder (tổng hợp)
└── Quota cấp organization (lập kế hoạch năng lực)

Quota cấp Project

Quota cấp project là điểm thực thi chính. Mỗi project có giới hạn quota độc lập:

my-project-prod:
  - CPUs (us-central1): 24
  - CPUs (us-east1): 0
  - External IPs: 5
  - Cloud Storage: 100 TB
  - Requests/minute: 10,000

my-project-staging:
  - CPUs (us-central1): 4
  - CPUs (us-east1): 0
  - External IPs: 1
  - Cloud Storage: 10 TB
  - Requests/minute: 1,000

Quota theo project là độc lập — chạm quota ở project A không ảnh hưởng project B.

Quota cấp Folder

Folder cung cấp góc nhìn tổng hợp về quota:

Folder/Engineering (tổng hợp):
  - CPUs trên tất cả projects: 100 (24+4+... từ các child projects)
  - External IPs trên tất cả projects: 10

Giới hạn: Quota cấp folder không áp đặt thêm giới hạn — nó chỉ tổng hợp. Việc thực thi xảy ra ở cấp project.

Quota cấp Organization

Quota cấp organization là giới hạn năng lực toàn cục:

Organization:
  - Max Projects: 10,000
  - Max Folders: 100,000

Quota organization rất hiếm khi chạm (trừ khi ở quy mô cực lớn). Nó chủ yếu là công cụ lập kế hoạch năng lực.

Các loại quota

Quota của GCP được chia thành nhiều nhóm:

1. Allocation Quotas

Lượng tài nguyên cố định mà project có thể cấp phát:

Ví dụ:
- Tối đa 24 CPUs trong project
- Tối đa 10 persistent disks
- Tối đa 100 GB Cloud SQL storage

Hành vi:

  • Khi đã cấp phát, resource "tiêu tốn" quota
  • Dù resource nhàn rỗi, quota vẫn bị dùng
  • Gỡ bỏ resource (xóa VM) sẽ trả quota về

2. Rate Quotas

Số request trong một khoảng thời gian:

Ví dụ:
- 10 requests/phút cho Compute Engine API
- 1,000 requests/giây cho Cloud Storage API

Hành vi:

  • Cửa sổ reset: theo phút, giây, hoặc ngày
  • Request bị giới hạn tốc độ sẽ trả lỗi 429 (Too Many Requests)
  • Tạm thời — quota được reset khi cửa sổ thời gian kết thúc

3. Concurrent Quotas

Số operation đang chạy đồng thời:

Ví dụ:
- Tối đa 100 VM đang được tạo đồng thời
- Tối đa 50 BigQuery jobs đồng thời

Hành vi:

  • Giới hạn tạm thời
  • Được reset khi operation hoàn tất

Kịch bản cạn quota

Kịch bản 1: Tăng tải nhanh

python
# Ứng dụng tự động scale khi traffic tăng
# Mỗi lần scale tạo thêm VM

while traffic > threshold:
    create_vm()  # Chạm quota sau khi cấp 24 CPUs
    
# Kết quả:
# ✓ Tạo được 24 VM
# ✗ VM thứ 25 thất bại
# ✗ Load balancer không đạt số replica mong muốn
# ✗ Một phần traffic bị rớt (dịch vụ suy giảm)

Giải pháp: Yêu cầu tăng quota trước khi dự kiến xảy ra đợt tăng tải.

Kịch bản 2: Tài nguyên bị quên

T+0: Developer tạo VMs/clusters để test
T+1 ngày: Developer quên dọn dẹp
T+2 tuần: 50 test VMs tiêu tốn 100 CPUs
T+3 tuần: Production scaling thất bại — không còn quota

Bài học: Triển khai dọn dẹp tài nguyên (qua Cloud Scheduler) hoặc cảnh báo chi phí

Kịch bản 3: Cạn quota theo vùng

Quota có thể theo region:
- US-central1: 24 CPUs (đã chạm)
- US-east1: 0 CPUs (đã chạm)
- Europe-west1: 50 CPUs (còn)

Vấn đề: Yêu cầu ứng dụng chỉ cho phép vùng US
Giải pháp: Tăng quota hoặc thiết kế lại cho multi-region

Chiến lược quản lý quota

Chiến lược 1: Right-size ngay từ đầu

Xác định quota dựa trên:
1. Mức tải đỉnh dự kiến
2. Hệ số dự phòng mong muốn (HA)
3. Buffer cho spike bất ngờ (20%)

Ví dụ:
- Peak load: 10 jobs đồng thời
- HA mong muốn: 2x để failover
- Buffer: 20%
- Quota cần: 10 * 2 * 1.2 = 24 jobs

Chiến lược 2: Yêu cầu tăng quota chủ động

bash
# Xem mức sử dụng quota hiện tại
gcloud compute project-info describe --project=PROJECT_ID \
  --format='value(quotas[name=CPUS].usage)'

# Yêu cầu tăng trước khi chạm giới hạn
gcloud compute project-info quotas describe \
  --filter='name=CPUS' \
  --format='value(limit)'

# Tăng bằng chương trình (thông qua Cloud Quotas API)
gcloud quotas preferences update \
  --project=PROJECT_ID \
  --metric=compute.googleapis.com/cpus_per_region \
  --value=100

Chiến lược 3: Cảnh báo quota

python
from google.cloud import monitoring_v3

def setup_quota_alert(project_id, quota_metric, threshold=80):
    """Cảnh báo khi mức sử dụng quota vượt ngưỡng"""
    
    client = monitoring_v3.AlertPolicyServiceClient()
    
    # Tạo điều kiện: quota_usage > 80%
    condition = monitoring_v3.AlertPolicy.Condition(
        display_name=f"{quota_metric} usage alert",
        condition_threshold=monitoring_v3.AlertPolicy.Condition.MetricThreshold(
            filter=f'metric.type="serviceruntime.googleapis.com/quota_used_count" AND resource.labels.quota_metric="{quota_metric}"',
            comparison=monitoring_v3.ComparisonType.COMPARISON_GT,
            threshold_value=threshold,
            duration={"seconds": 300}
        )
    )
    
    # Tạo notification channel (email)
    notify_channel = create_email_notification_channel("team@company.com")
    
    # Tạo alert policy
    policy = monitoring_v3.AlertPolicy(
        display_name=f"Alert: {quota_metric} quota usage",
        conditions=[condition],
        notification_channels=[notify_channel],
        alert_strategy=monitoring_v3.AlertPolicy.AlertStrategy(
            auto_close={"seconds": 86400}
        )
    )
    
    client.create_alert_policy(name=f"projects/{project_id}", alert_policy=policy)
    print(f"✓ Đã tạo cảnh báo cho {quota_metric}")

Chiến lược 4: Phân phối tải qua nhiều project

Phân phối workload trên nhiều project để tránh cạn quota:

python
import random

def distribute_workload(projects, workload_units):
    """Phân phối workload trên nhiều project"""
    
    workloads = {}
    for unit in workload_units:
        # Chọn project có capacity còn lại
        project = select_project_with_capacity(projects)
        
        if project not in workloads:
            workloads[project] = []
        workloads[project].append(unit)
    
    return workloads

def select_project_with_capacity(projects):
    """Chọn project có quota khả dụng nhiều nhất"""
    
    project_capacities = {}
    for project in projects:
        available = get_available_quota(project)
        project_capacities[project] = available
    
    # Trả về project có quota khả dụng cao nhất
    return max(project_capacities, key=project_capacities.get)

Giới hạn quota thủ công

Đôi khi bạn cố ý muốn quota thấp hơn để ngăn chi phí vượt kiểm soát:

bash
# Đặt quota override để chặn mức sử dụng
gcloud quotas preferences update \
  --project=PROJECT_ID \
  --metric=compute.googleapis.com/external_ips \
  --value=2  # Giới hạn external IP ở mức 2 (thông thường là 5)

# Lý do: Kiểm soát chi phí, ngăn cấp phát tài nguyên nhầm

Trường hợp sử dụng:

  • Project development: Giới hạn tài nguyên để tránh vượt chi phí
  • Team cụ thể: Giới hạn mức tiêu thụ tài nguyên
  • Kiểm soát chi phí: Chốt cứng ngân sách của team

Quy trình yêu cầu quota

Khi bạn chạm giới hạn quota và cần tăng:

T+0: Gửi yêu cầu quota
     gcloud quotas preferences update \
       --project=PROJECT_ID \
       --metric=METRIC \
       --value=NEW_VALUE

T+sau vài phút: Google xem xét yêu cầu
     - Kiểm tra tự động (không lạm dụng, hợp lý)
     - Duyệt thủ công nếu tăng lớn

T+từ vài phút đến vài giờ: Kết quả
     - Được duyệt ✓
     - Bị từ chối ✗
     - Được duyệt kèm điều kiện

Kết quả:
- Được duyệt: Quota tăng
- Bị từ chối: Có lý do (phải liên hệ hỗ trợ)

Mẹo để được duyệt:

  • Yêu cầu tăng dần (đừng nhảy từ 10 lên 1000)
  • Giải thích nhu cầu kinh doanh
  • Chỉ ra xu hướng sử dụng (nếu có)
  • Dẫn chiếu yêu cầu SLA/uptime

Đặc thù quota theo service

Compute Engine

Quota theo:
- Region (CPUs, External IPs, Disks)
- Zone (GPU, Local SSD)
- Global (Images, Snapshots, Security Policies)

Ví dụ:
- us-central1: 24 CPUs
- us-central1-a: 4 GPUs
- Global: 5 snapshots

Cloud Storage

Quota:
- Dung lượng theo project (thực tế là không giới hạn, nhưng có giới hạn billing)
- Số object mỗi bucket (thực tế: hàng tỷ)
- API requests: giới hạn tốc độ (không phải hard quota)

BigQuery

Quota theo project:
- Concurrent queries: 100
- Query timeout: tối đa 6 giờ
- Slot hours: Nếu dùng mô hình capacity reserved
- Data size: Không giới hạn (tính tiền theo dung lượng)

Kiểm thử hành vi quota

python
def test_quota_enforcement():
    """Kiểm thử việc thực thi quota của project"""
    
    # Tạo resource cho tới khi chạm quota
    project_quota = get_quota(PROJECT_ID, "CPUS")
    vms = []
    
    try:
        for i in range(project_quota + 5):
            vm = create_vm(f"test-vm-{i}", machine_type="n1-standard-4")
            vms.append(vm)
    except QuotaExceededException as e:
        print(f"✓ Quota đang được thực thi đúng: {e}")
    
    finally:
        # Dọn dẹp
        for vm in vms:
            delete_vm(vm)

def test_quota_reset_behavior():
    """Kiểm thử việc reset của rate quota"""
    
    # Gọi API tới giới hạn rate limit
    for i in range(10001):  # Giả sử giới hạn 10k/phút
        try:
            call_api()
        except RateLimitedException:
            print(f"✓ Chạm rate limit ở request {i}")
            break
    
    # Chờ cửa sổ reset
    time.sleep(65)
    
    # Xác nhận request mới thành công
    try:
        call_api()
        print("✓ Rate limit đã reset")
    except RateLimitedException:
        print("✗ Rate limit chưa reset")

Quản lý quota với Terraform

hcl
# Ví dụ: Terraform không có quota manager riêng
# Thay vào đó, đảm bảo việc tạo resource tuân thủ quota

resource "google_compute_instance" "app" {
  count = local.vm_count
  
  # Sẽ thất bại nếu vượt quota
  # Hãy bắt lỗi, tăng quota, rồi thử lại
  
  name         = "app-vm-${count.index}"
  machine_type = "n1-standard-4"
  zone         = "us-central1-a"
  
  # Metadata để theo dõi
  metadata = {
    environment = var.environment
    app         = "production"
  }
}

locals {
  # Tính số VM cần dựa trên tải
  desired_vms = var.expected_load / var.requests_per_vm
  
  # Yêu cầu quota đủ trước khi tạo
  required_quota = desired_vms * 4  # 4 CPUs mỗi VM
}

# Output: xác minh quota trước khi apply
output "required_quota" {
  value = local.required_quota
}

Các anti-pattern cần tránh

Anti-patternVấn đềGiải pháp
Bỏ qua quotaChạm giới hạn đột ngộtGiám sát chủ động
Giả định quota toàn cụcCạn quota theo regionKiểm tra theo region
Không yêu cầu tăngBị chặn khi scaleYêu cầu sớm
Một project quá lớnThiếu linh hoạtChia theo nhiều project
Không cảnh báoLỗi âm thầmThiết lập monitoring
Theo dõi thủ côngDễ sai sótTự động qua API

Tham khảo