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

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

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

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

  1. השלמתם את המדריך למתחילים בנושא feature flag.
  2. סביבת gcloud שמוגדרת לניהול המשאבים של App Lifecycle Manager.
  3. אפליקציה קיימת. איך יוצרים מוצר של אפליקציה?

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

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

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

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

‫1. יוצרים את האפליקציה (אם עדיין לא עשיתם את זה)

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"

Application Integration

משלבים את 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"

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