שימוש בדגלי תכונות בארכיטקטורה של ריבוי דיירים

במדריך הזה נסביר איך להטמיע דגלים של תכונות ב-App Lifecycle Manager בסביבה מרובת דיירים בלי לשנות את תהליך הפריסה הבינארי הקיים.

דרישות מוקדמות

לפני שמתחילים, חשוב לוודא שיש לכם:

  1. השלמתם את המדריך למתחילים בנושא פריסת דגלים של תכונות.
  2. סביבת gcloud שמוגדרת לניהול משאבים של App Lifecycle Manager.
  3. מוצר SaaS קיים. מידע נוסף על יצירת מוצר SaaS זמין במאמר יצירת מוצר SaaS.

מודלים של משאבים

בהגדרה של ריבוי דיירים, מומלץ להגדיר סוג יחידה לשירות או לאפליקציה, ויחידה לכל מופע של השירות או האפליקציה (שמייצג דייר או פריסה).

כדי להטמיע דגלי תכונות בסביבה מרובת דיירים, צריך להגדיר מאפיינים של Common Expression Language ‏ (CEL) שמזהים את הדיירים, להגדיר את האפליקציה כך שתחדיר מזהי דיירים בזמן ריצה ולהשתמש בכללי הערכה כדי להשפיע על תכונות של דיירים ספציפיים.

במקרים פשוטים יותר, אפשר גם ליצור ידנית השקות נפרדות לכל לקוח.

1. יצירת מוצר SaaS (אם עדיין לא עשיתם זאת)

gcloud beta app-lifecycle-manager saas create "SAAS_NAME" \
    --project="PROJECT_ID" \
    --location="global" \
    --locations=name="LOCATION_1"

2. יצירת UnitKind

gcloud beta app-lifecycle-manager unit-kinds create "tenant-service-kind" \
    --project="PROJECT_ID" \
    --location="global" \
    --saas="SAAS_NAME"

3. יצירת יחידות לדיירים

כשיוצרים יחידות, משתמשים בתוויות כדי לסווג את השירותים של הדייר לקבוצות (לדוגמה, group=beta, group=preview, group=all).

# Create a unit for Tenant A (Beta group)
gcloud beta app-lifecycle-manager units create "tenant-a-service" \
    --unit-kind="tenant-service-kind" \
    --location="LOCATION_1" \
    --labels="group=beta"

# Create a unit for Tenant B (Standard group)
gcloud beta app-lifecycle-manager units create "tenant-b-service" \
    --unit-kind="tenant-service-kind" \
    --location="LOCATION_1" \
    --labels="group=all"

הגדרת מאפיינים ודגלים

כדי להבטיח בטיחות סוגים בכללי הערכה, צריך להגדיר מאפיינים באופן רשמי (כמו customerID).

1. יצירת מאפיין customerID

gcloud beta app-lifecycle-manager flags attributes create "customer-id-attr" \
    --key="customerID" \
    --attribute-value-type="STRING" \
    --location=global

2. יצירת feature flag

gcloud beta app-lifecycle-manager flags create "enhanced-search" \
    --key="enhanced-search" \
    --flag-value-type=BOOL \
    --unit-kind="tenant-service-kind"

שילוב אפליקציות

משלבים את OpenFeature SDK בשירות. האפליקציה צריכה להחדיר את customerID להקשר בזמן הריצה.

דוגמה ל-Go:

// Inject customerID into the evaluation context
evalCtx := map[string]any{
    "customerID": currentTenant.ID,
}

// Evaluate the flag
isEnabled, err := client.BooleanValue(
    context.Background(),
    "enhanced-search",
    false,
    evalCtx,
)

הגדרת טירגוט ספציפי לדייר

אפשר להשתמש בכללי הערכה כדי להפעיל תכונה ללקוחות ספציפיים.

gcloud beta app-lifecycle-manager flags update "enhanced-search" \
    --location="global"
    --evaluation-spec='{
      "rules": [{
        "id": "allowlist-for-premium-tenants",
        "condition": "customerID in [\"tenant-xyz-123\", \"tenant-abc-789\"]",
        "target": "Enabled"
      }],
      "defaultTarget": "Disabled",
      "attributes": ["projects/PROJECT_ID/locations/global/flagAttributes/customer-id-attr"]
    }'

השקה הדרגתית ידנית עם מסננים

במקרים פשוטים יותר, אפשר להפעיל גלים על ידי הפעלה ידנית של השקות נפרדות לכל תווית לקוח.

1. יצירת גרסה ופרסום שלה

# Create a Revision (Snapshot)
gcloud beta app-lifecycle-manager flags revisions create "enhanced-search-rev-1" \
    --location=global \
    --flag="enhanced-search"

# Create a Release
gcloud beta app-lifecycle-manager flags releases create "release-of-enhanced-search" \
    --location=global \
    --unit-kind="tenant-service-kind" \
    --revisions="enhanced-search-rev-1"

2. הפעלת השקות ידניות

אתם יכולים לתזמן את ההשקה באופן ידני על ידי הפעלה של פעולות נפרדות לכל קבוצת יעד באמצעות --unit-filter.

# Rollout to Beta group first
gcloud beta app-lifecycle-manager rollouts create "beta-rollout" \
    --flag-release="release-of-enhanced-search" \
    --rollout-kind="rollout-kind-of-enhanced-search" \
    --location=global \
    --rollout-orchestration-strategy="Google.Cloud.Simple.AllAtOnce" \
    --unit-filter="labels.group == beta"

# After verification, rollout to the rest of the fleet
gcloud beta app-lifecycle-manager rollouts create "full-rollout" \
    --flag-release="release-of-enhanced-search" \
    --rollout-kind="rollout-kind-of-enhanced-search" \
    --location=global \
    --rollout-orchestration-strategy="Google.Cloud.Production" \
    --unit-filter="labels.group == all"

המאמרים הבאים