توابع را با وظایف Cloud در صف قرار دهید


توابع صف وظایف از Google Cloud Tasks استفاده می‌کنند تا به برنامه شما کمک کنند تا کارهای زمان‌بر، منابع فشرده یا با پهنای باند محدود را به‌طور ناهمزمان، خارج از جریان برنامه اصلی‌تان اجرا کند.

به عنوان مثال، تصور کنید که می‌خواهید از مجموعه بزرگی از فایل‌های تصویری که در حال حاضر روی یک API با محدودیت نرخ میزبانی می‌شوند، نسخه پشتیبان تهیه کنید. برای اینکه یک مصرف کننده مسئول آن API باشید، باید به محدودیت های نرخ آن ها احترام بگذارید. بعلاوه، این نوع کار طولانی مدت می تواند به دلیل وقفه های زمانی و محدودیت حافظه در معرض شکست قرار گیرد.

برای کاهش این پیچیدگی، می‌توانید یک تابع صف کار بنویسید که گزینه‌های اصلی کار مانند scheduleTime و dispatchDeadline را تنظیم می‌کند و سپس تابع را به یک صف در Cloud Tasks تحویل می‌دهد. محیط Cloud Tasks به طور خاص برای اطمینان از کنترل تراکم مؤثر و سیاست‌های امتحان مجدد برای این نوع عملیات طراحی شده است.

Firebase SDK for Cloud Functions برای Firebase نسخه 3.20.1 و بالاتر با Firebase Admin SDK v10.2.0 و بالاتر برای پشتیبانی از توابع صف وظایف، تعامل دارد.

استفاده از توابع صف وظایف با Firebase می‌تواند منجر به هزینه‌هایی برای پردازش Cloud Tasks شود. برای اطلاعات بیشتر به قیمت گذاری Cloud Tasks مراجعه کنید.

ایجاد توابع صف وظایف

برای استفاده از توابع صف کار، این گردش کار را دنبال کنید:

  1. با استفاده از Firebase SDK for Cloud Function، یک تابع صف کار بنویسید.
  2. عملکرد خود را با فعال کردن آن با یک درخواست HTTP آزمایش کنید.
  3. تابع خود را با Firebase CLI مستقر کنید. هنگامی که برای اولین بار عملکرد صف وظیفه خود را به کار می گیرید، CLI یک صف کار در Cloud Tasks با گزینه هایی (محدود کردن نرخ و تلاش مجدد) که در کد منبع شما مشخص شده است ایجاد می کند.
  4. وظایف را به صف وظایف جدید ایجاد شده اضافه کنید و در صورت نیاز، پارامترها را برای تنظیم یک برنامه زمانبندی اجرا ارسال کنید. می‌توانید با نوشتن کد با استفاده از Admin SDK و استقرار آن در Cloud Functions برای Firebase به این هدف برسید.

توابع صف وظایف را بنویسید

برای شروع نوشتن توابع صف وظایف، از onDispatch استفاده کنید. بخش مهمی از نوشتن یک تابع صف کار، تنظیم مجدد در هر صف و پیکربندی محدود کننده نرخ است. نمونه‌های کد موجود در این صفحه بر اساس برنامه‌ای است که سرویسی را راه‌اندازی می‌کند که از تمام تصاویر عکس روز نجوم ناسا نسخه پشتیبان تهیه می‌کند:

پیکربندی توابع صف وظایف

توابع صف کار با مجموعه ای قدرتمند از تنظیمات پیکربندی برای کنترل دقیق محدودیت های نرخ و رفتار مجدد یک صف کار ارائه می شوند:

exports.backupApod = functions
    .runWith( {secrets: ["NASA_API_KEY"]})
    .tasks.taskQueue({
      retryConfig: {
        maxAttempts: 5,
        minBackoffSeconds: 60,
      },
      rateLimits: {
        maxConcurrentDispatches: 6,
      },
    }).onDispatch(async (data) => {
  • retryConfig.maxAttempts=5 : هر کار در صف وظایف به طور خودکار تا 5 بار تکرار می شود. این به کاهش خطاهای گذرا مانند خطاهای شبکه یا اختلال موقت سرویس یک سرویس خارجی وابسته کمک می کند.
  • retryConfig.minBackoffSeconds=60 : هر کار حداقل با فاصله 60 ثانیه از هر تلاش دوباره امتحان می شود. این یک بافر بزرگ بین هر تلاش ایجاد می کند، بنابراین ما عجله نداریم که 5 تلاش مجدد را خیلی سریع تمام کنیم.
  • rateLimits.maxConcurrentDispatch=6 : حداکثر 6 کار در یک زمان معین ارسال می شود. این به اطمینان از جریان ثابت درخواست‌ها به تابع اصلی کمک می‌کند و به کاهش تعداد نمونه‌های فعال و شروع سرد کمک می‌کند.

تست توابع صف وظایف

توابع صف وظایف در مجموعه شبیه ساز محلی Firebase به عنوان توابع ساده HTTP در معرض دید قرار می گیرند. می توانید یک تابع وظیفه شبیه سازی شده را با ارسال یک درخواست HTTP POST با بارگذاری داده json آزمایش کنید:

 # start the Firebase Emulators
 firebase emulators:start

 # trigger the emulated task queue function
 curl \
  -X POST                                            # An HTTP POST request...
  -H "content-type: application/json" \              # ... with a JSON body
  http://localhost:$PORT/$PROJECT_ID/$REGION/$NAME \ # ... to function url
  -d '{"data": { ... some data .... }}'              # ... with JSON encoded data

استقرار توابع صف وظایف

با استفاده از Firebase CLI تابع صف وظایف را اجرا کنید:

$ firebase deploy --only functions:backupApod

هنگام استقرار یک تابع صف کار برای اولین بار، CLI یک صف کار در Cloud Tasks با گزینه هایی (محدود کردن نرخ و امتحان مجدد) که در کد منبع شما مشخص شده است ایجاد می کند.

اگر هنگام استقرار توابع با خطاهای مجوز مواجه شدید، مطمئن شوید که نقش های IAM مناسب به کاربری که دستورات استقرار را اجرا می کند اختصاص داده شده است.

توابع صف وظایف را در صف قرار دهید

توابع صف وظایف را می توان در Cloud Tasks از یک محیط سرور قابل اعتماد مانند Cloud Functions برای Firebase با استفاده از Firebase Admin SDK برای Node.js قرار داد. اگر با Admin SDK ها تازه کار هستید، برای شروع به افزودن Firebase به سرور مراجعه کنید.

در یک جریان معمولی، Admin SDK یک کار جدید ایجاد می‌کند، آن را در Cloud Tasks قرار می‌دهد و پیکربندی کار را تنظیم می‌کند:

exports.enqueueBackupTasks = functions.https.onRequest(
async (_request, response) => {
  const queue = getFunctions().taskQueue("backupApod");
  const enqueues = [];
  for (let i = 0; i <= 10; i += 1) {
    // Enqueue each task with i*60 seconds delay. Our task queue function
    // should process ~1 task/min.
    const scheduleDelaySeconds = i * 60 
    enqueues.push(
        queue.enqueue(
          { id: `task-${i}` },
          {
            scheduleDelaySeconds,
            dispatchDeadlineSeconds: 60 * 5 // 5 minutes
          },
        ),
    );
  }
  await Promise.all(enqueues);
  response.sendStatus(200);

});
  • scheduleDelaySeconds : کد نمونه سعی می کند تا اجرای وظایف را با مرتبط کردن یک تاخیر N امین دقیقه برای کار نهم گسترش دهد. به این معنی است که ~ 1 کار در دقیقه راه اندازی می شود. توجه داشته باشید که اگر می‌خواهید Cloud Tasks یک کار را در زمان خاصی فعال کند، می‌توانید از scheduleTime نیز استفاده کنید.
  • dispatchDeadlineSeconds : حداکثر مدت زمانی که Cloud Tasks منتظر تکمیل یک کار است. Cloud Tasks پس از پیکربندی مجدد صف یا تا زمانی که به این مهلت رسیده باشد، کار را دوباره امتحان می کند. در نمونه، صف به گونه ای پیکربندی شده است که کار را تا 5 بار دوباره امتحان کنید، اما اگر کل فرآیند (از جمله تلاش های مجدد) بیش از 5 دقیقه طول بکشد، کار به طور خودکار لغو می شود.

عیب یابی

ثبت وظایف Cloud را روشن کنید

گزارش‌های مربوط به Cloud Tasks حاوی اطلاعات تشخیصی مفیدی مانند وضعیت درخواست مرتبط با یک کار هستند. به‌طور پیش‌فرض، گزارش‌های Cloud Tasks به دلیل حجم زیاد گزارش‌هایی که می‌تواند در پروژه شما ایجاد کند، غیرفعال می‌شوند. توصیه می کنیم در حالی که به طور فعال در حال توسعه و اشکال زدایی عملکردهای صف وظایف خود هستید، گزارش های اشکال زدایی را روشن کنید. به روشن کردن ورود به سیستم مراجعه کنید.

مجوزهای IAM

هنگام قرار دادن وظایف یا زمانی که Cloud Tasks سعی می کند توابع صف وظایف شما را فراخوانی کند، ممکن است خطاهای PERMISSION DENIED را مشاهده کنید. اطمینان حاصل کنید که پروژه شما دارای الزامات IAM زیر است:

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member=serviceAccount:${PROJECT_ID}@appspot.gserviceaccount.com \
  --role=roles/cloudtasks.enqueuer
  • هویتی که برای ردیف کردن وظایف در Cloud Tasks استفاده می‌شود برای استفاده از حساب سرویس مرتبط با یک کار در Cloud Tasks به مجوز نیاز دارد.

    در نمونه، این حساب سرویس پیش‌فرض App Engine است.

برای دستورالعمل‌هایی درباره نحوه افزودن حساب سرویس پیش‌فرض App Engine به‌عنوان کاربر حساب خدمات پیش‌فرض App Engine، به اسناد Google Cloud IAM مراجعه کنید.

  • هویت مورد استفاده برای راه اندازی تابع صف وظایف به مجوز cloudfunctions.functions.invoke نیاز دارد.

    در نمونه، این حساب سرویس پیش‌فرض App Engine است

gcloud functions add-iam-policy-binding $FUNCTION_NAME \
  --region=us-central1 \
  --member=serviceAccount:${PROJECT_ID}@appspot.gserviceaccount.com \
  --role=roles/cloudfunctions.invoker