একটি স্টার্টার তৈরি করুন

এই ডকুমেন্টটিতে ব্যাখ্যা করা হয়েছে কীভাবে এমন একটি স্টার্টার তৈরি করতে হয়, যা আপনার অ্যাপ বা সার্ভিসকে কোনো ইভেন্ট ঘটলে গুগল ওয়ার্কস্পেস স্টুডিও-কে অবহিত করতে এবং একটি ফ্লো এক্সিকিউশন শুরু করতে সাহায্য করে। এপিআই-তে, স্টার্টারগুলোকে workflowTriggers বলা হয়।

একটি স্টার্টার একটি ফ্লো শুরু করে, যেখানে একটি স্টেপ হলো ফ্লো-এর অন্তর্ভুক্ত কাজগুলোর অনুক্রমের একটি একক কাজ। একটি স্টার্টার তৈরি করার মাধ্যমে, আপনি ব্যবহারকারীদের এমন স্বয়ংক্রিয় ফ্লো সেট আপ করার সুযোগ দেন যা আপনার অ্যাপ বা পরিষেবা থেকে আসা রিয়েল-টাইম ইভেন্টগুলোতে সাড়া দেয়।

একটি স্টার্টার তৈরি করতে হলে অ্যাড-অন ম্যানিফেস্ট ফাইলে স্টার্টারটি ডিক্লেয়ার করতে হয় এবং গুগল অ্যাপস স্ক্রিপ্টে লাইফসাইকেল কলব্যাক ইমপ্লিমেন্ট করতে হয়, অথবা গুগল ওয়ার্কস্পেস স্টুডিও এপিআই এন্ডপয়েন্টে পেলোড পোস্ট করে স্টার্টারটি ফায়ার করতে হয়।

পূর্বশর্ত এবং OAuth অনুমোদন

Workspace Studio API এন্ডপয়েন্টের সাথে যোগাযোগ করার জন্য, আপনার অ্যাপ বা সার্ভিসকে অবশ্যই OAuth 2.0 ব্যবহার করে প্রমাণীকরণ করতে হবে। অনুমোদনের সময় অ্যাপটিকে ব্যবহারকারীদের কাছ থেকে নিম্নলিখিত নির্দিষ্ট OAuth স্কোপের জন্য অনুরোধ করতে হবে:

https://www.googleapis.com/auth/workspace.studio.trigger

এই স্কোপটি অ্যাপটিকে ওয়ার্কস্পেস স্টুডিও এপিআই কল করতে এবং ব্যবহারকারী কর্তৃক সেই স্টার্টারের জন্য কনফিগার করা ফ্লোগুলো চালু করতে অনুমোদন দেয়।

অফলাইন অ্যাক্সেস এবং রিফ্রেশ টোকেন

যেহেতু এক্সটার্নাল সার্ভিসে কোনো ইভেন্ট ঘটলে স্টার্টারগুলো অ্যাসিঙ্ক্রোনাসভাবে ওয়ার্কস্পেস স্টুডিওকে অবহিত করে—যা কোনো ব্যবহারকারীর ফ্লো কনফিগার করার কয়েক ঘণ্টা, দিন বা মাস পরেও ঘটতে পারে—তাই এপিআই এন্ডপয়েন্ট কল করার সময় আপনার সার্ভিসকে অবশ্যই একটি বৈধ OAuth 2.0 অ্যাক্সেস টোকেন প্রদান করতে হবে।

অ্যাড-অন ইভেন্ট অবজেক্টে (যেমন স্টার্টার কনফিগারেশন বা লাইফসাইকেল কলব্যাক অনুরোধের সময়) গুগল কর্তৃক প্রদত্ত অ্যাক্সেস টোকেনটি স্বল্পস্থায়ী এবং মাত্র ১ ঘণ্টার জন্য বৈধ। ভবিষ্যতে অ্যাসিঙ্ক্রোনাসভাবে স্টার্টার ইভেন্ট চালু করার জন্য এটি যথেষ্ট নয়। সময়ের সাথে সাথে ওয়ার্কস্পেস স্টুডিও এপিআই কল করার জন্য, আপনার সার্ভিসের একটি অফলাইন রিফ্রেশ টোকেন প্রয়োজন, যা চাহিদা অনুযায়ী নতুন অ্যাক্সেস টোকেন তৈরি করবে।

আপনি কীভাবে অনুমোদন পরিচালনা করেন এবং একটি রিফ্রেশ টোকেন সংগ্রহ করেন, তা আপনার অ্যাড-অন রানটাইমের উপর নির্ভর করে:

  • HTTP অ্যাড-অন (বিকল্প রানটাইম) : HTTP অ্যাড-অনগুলির জন্য, অফলাইন অ্যাক্সেসের ( access_type=offline ) অনুরোধ করতে এবং একটি রিফ্রেশ টোকেন গ্রহণ করার জন্য আপনার ব্যাকএন্ড পরিষেবাটিকে অবশ্যই বিল্ট-ইন অ্যাড-অন অনুমোদন থেকে স্বাধীন একটি পৃথক OAuth 2.0 অনুমোদন প্রবাহ প্রয়োগ করতে হবে।

    ব্যবহারকারী যখন Workspace Studio-তে স্টার্টারটি কনফিগার করেন, তখন একটি সাইন-ইন বা অনুমোদন কার্ড প্রদর্শন করে আপনি এই সংযোগটি অনুমোদন করার জন্য ব্যবহারকারীকে অনুরোধ করতে পারেন। অনুমোদন কার্ড ফেরত দেওয়া এবং OAuth ফ্লো পরিচালনা করার বিষয়ে আরও তথ্যের জন্য, “আপনার Google Workspace অ্যাড-অনকে একটি তৃতীয়-পক্ষ পরিষেবার সাথে সংযুক্ত করুন (যেখানে Google Workspace-কে আপনি যে তৃতীয়-পক্ষ পরিষেবার সাথে সংযোগ করছেন তা হিসাবে বিবেচনা করা হয়)” দেখুন।

    আপনার ব্যাকএন্ড সার্ভিসকে অবশ্যই রিফ্রেশ টোকেনটি নিরাপদে সংরক্ষণ করতে হবে (উদাহরণস্বরূপ, আপনার সার্ভিসের ডেটাবেসে triggerId এর সাথে) এবং স্টার্টারের notifyUri বা triggers.fire API এন্ডপয়েন্টে অনুরোধ পাঠানোর আগে, যখনই কোনো ইভেন্ট ঘটবে, তখন একটি নতুন অ্যাক্সেস টোকেন পুনরুদ্ধার করার জন্য এটি ব্যবহার করতে হবে।

  • গুগল অ্যাপস স্ক্রিপ্ট অ্যাড-অন : গুগল অ্যাপস স্ক্রিপ্ট-ভিত্তিক যে অ্যাড-অনগুলো ইভেন্টের জন্য পোল করতে শিডিউলড (সময়-ভিত্তিক) ট্রিগার ব্যবহার করে, তারা একটি স্বাধীন OAuth ফ্লো প্রয়োগ করা এড়িয়ে যেতে পারে। যেহেতু শিডিউলড ট্রিগারগুলো সরাসরি গুগল অ্যাপস স্ক্রিপ্ট রানটাইম এনভায়রনমেন্টের মধ্যে চলে, তাই গুগল অ্যাপস স্ক্রিপ্ট ম্যানিফেস্টে ঘোষিত স্কোপগুলো ব্যবহার করে স্বয়ংক্রিয়ভাবে OAuth টোকেনগুলো পরিচালনা ও রিফ্রেশ করে।

ম্যানিফেস্ট ফাইলে স্টার্টারটি সংজ্ঞায়িত করুন।

একটি স্টার্টার সংজ্ঞায়িত করতে, এটিকে আপনার অ্যাড-অন ম্যানিফেস্ট ফাইলে ( appsscript.json ) addOns.studio.flows.workflowElements ব্লকের মধ্যে যুক্ত করুন। এই কনফিগারেশনটি অ্যাপস স্ক্রিপ্ট এবং HTTP রানটাইম (বিকল্প রানটাইম) উভয়ের জন্যই আবশ্যক। এলিমেন্টটিকে workflowAction এর পরিবর্তে workflowTrigger হিসেবে কনফিগার করুন (যা একটি স্টেপ সংজ্ঞায়িত করার সময় ব্যবহৃত হয়)। আরও তথ্যের জন্য, Google Workspace অ্যাড-অনগুলির জন্য ম্যানিফেস্ট কাঠামো দেখুন।

workflowTrigger ব্লকের ভিতরে, উল্লেখ করুন:

  • inputs : ভেরিয়েবল যা ব্যবহারকারী কনফিগারেশন কার্ডে নির্ধারণ করেন (যেমন প্রজেক্টের নাম, রিসোর্স ফিল্টার, ইত্যাদি)।
  • outputs : ফ্লো-এর পরবর্তী ধাপগুলিতে স্টার্টার কর্তৃক ফেরতযোগ্য ভেরিয়েবলসমূহ।
  • onConfigFunction : যে কলব্যাক ফাংশনটি ব্যবহারকারী কনফিগারেশন ইন্টারফেস প্রদর্শন করে, তার নাম।
  • onManageFunction : স্টার্টার সাবস্ক্রিপশন তৈরি এবং মুছে ফেলার কাজ পরিচালনা করার জন্য গুগল কর্তৃক ব্যবহৃত কলব্যাক ফাংশনের নাম।

নিম্নলিখিত কোড নমুনাটি একটি ইভেন্ট স্টার্টারের জন্য ম্যানিফেস্ট সংজ্ঞার একটি উদাহরণ দেখায়:

JSON

{
  "timeZone": "America/Los_Angeles",
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8",
  "addOns": {
    "common": {
      "name": "Trigger App",
      "logoUrl": "https://fonts.gstatic.com/s/i/short-term/release/googlesymbols/start/default/24px.svg",
      "useLocaleFromApp": true
    },
    "studio": {
      "flows": {
        "workflowElements": [
          {
            "id": "triggerDemo",
            "state": "ACTIVE",
            "name": "Event Trigger",
            "description": "Fires when a event occurs in the app.",
            "workflowTrigger": {
              "inputs": [
                {
                  "id": "projectId",
                  "description": "The project identifier to watch.",
                  "cardinality": "SINGLE",
                  "dataType": {
                    "basicType": "STRING"
                  }
                }
              ],
              "outputs": [
                {
                  "id": "eventName",
                  "description": "The name of the triggered event.",
                  "cardinality": "SINGLE",
                  "dataType": {
                    "basicType": "STRING"
                  }
                },
                {
                  "id": "eventMessage",
                  "description": "Detailed event message description.",
                  "cardinality": "SINGLE",
                  "dataType": {
                    "basicType": "STRING"
                  }
                }
              ],
              "onConfigFunction": "onConfigTrigger",
              "onManageFunction": "onManageTrigger"
            }
          }
        ]
      }
    }
  }
}

স্টার্টার সাবস্ক্রিপশনের জীবনচক্র পরিচালনা করুন

যখন কোনো ব্যবহারকারী আপনার স্টার্টার সম্বলিত কোনো ফ্লো কনফিগার ও সক্রিয় করেন, অথবা যদি ফ্লোটি নিষ্ক্রিয় বা মুছে ফেলা হয়, তখন Google ম্যানিফেস্টে ঘোষিত onManageFunction কলব্যাক ফাংশনটি ব্যবহার করে আপনার অ্যাড-অনটিকে কল করে।

লাইফসাইকেল ইভেন্ট অবজেক্ট

কলব্যাক ফাংশনটি একটি WorkflowEventObject গ্রহণ করে, যাতে অ্যাকশন কনটেক্সট থাকে। প্রাথমিকভাবে, এর মধ্যে অন্তর্ভুক্ত থাকে:

  • ট্রিগার তৈরি ( event.workflow.triggerCreation ) : ফ্লোটি প্রকাশিত বা সক্রিয় করা হলে এটি সক্রিয় হয়।

    • triggerId : এই স্টার্টার রেজিস্ট্রেশন ইনস্ট্যান্সটিকে শনাক্তকারী একটি অনন্য UUID স্ট্রিং।

    • notifyUri : এই স্টার্টার রেজিস্ট্রেশনের সাথে যুক্ত অনন্য REST API এন্ডপয়েন্ট URL (উদাহরণস্বরূপ, https://workspacestudio.googleapis.com/v1/triggers/YOUR_TRIGGER_ID:fire )।

    • inputs : কার্ড থেকে ব্যবহারকারী কর্তৃক কনফিগার করা পরিবর্তনশীল ইনপুটসমূহ।

  • ডিলিট ট্রিগার ( event.workflow.triggerDeletion ) : যখন স্টার্টারটি ফ্লো থেকে সরিয়ে ফেলা হয়, অথবা যখন সম্পূর্ণ ফ্লোটি নিষ্ক্রিয় বা ডিলিট করা হয়, তখন এটি সক্রিয় হয়।

    • triggerId : যে সাবস্ক্রিপশন ইনস্ট্যান্সটি পরিষ্কার করতে হবে, তার অনন্য UUID স্ট্রিং।

বিকল্প রানটাইম (HTTP API) সাবস্ক্রিপশন জীবনচক্র

বিকল্প রানটাইম ব্যবহার করে তৈরি অ্যাড-অনগুলির জন্য, সাবস্ক্রিপশন লাইফসাইকেল নোটিফিকেশনগুলি onManageFunction কলব্যাক ফাংশন দ্বারা নির্দিষ্ট অ্যাকশন নামটি সহ অ্যাড-অনটির কনফিগার করা HTTP এন্ডপয়েন্ট URL-এ HTTP POST অনুরোধের মাধ্যমে পাঠানো হয়। পেলোডটি WorkflowEventObject এর JSON উপস্থাপনার সাথে মিলে যায়।

বিকল্প রানটাইম সম্পর্কে আরও তথ্যের জন্য, HTTP এন্ডপয়েন্ট ব্যবহার করে একটি Google Workspace অ্যাড-অন তৈরি করুন দেখুন।

অ্যাপস স্ক্রিপ্টে লাইফসাইকেল কলব্যাক প্রয়োগ করুন

নিম্নলিখিত অ্যাপস স্ক্রিপ্ট উদাহরণটি দেখায় কিভাবে ইউজার ইন্টারফেস কার্ড কনফিগার করতে হয়, onManageTrigger ব্যবহার করে সাবস্ক্রিপশন লাইফসাইকেল ইভেন্টগুলি পরিচালনা করতে হয় এবং কোনো ইভেন্ট ঘটলে গুগল-কে স্টার্টার রিকোয়েস্ট ফেরত পাঠাতে হয়।

অ্যাপস স্ক্রিপ্ট

/**
 * Generates and returns the user configuration card to collect inputs.
 */
function onConfigTrigger() {
  const projectInput = CardService.newTextInput()
    .setFieldName("projectId")
    .setTitle("Project ID")
    .setHint("Enter the project identifier to watch");

  const section = CardService.newCardSection()
    .setHeader("Configure Event Trigger")
    .addWidget(projectInput);

  const card = CardService.newCardBuilder()
    .addSection(section)
    .build();

  return card;
}

/**
 * Handles subscription lifecycle events sent from Google Workspace Studio.
 *
 * @param {Object} event The Workspace Studio event object.
 */
function onManageTrigger(event) {
  const triggerCreation = event.workflow.triggerCreation;
  const triggerDeletion = event.workflow.triggerDeletion;

  if (triggerCreation) {
    const triggerId = triggerCreation.triggerId;
    const notifyUri = triggerCreation.notifyUri;
    const inputs = triggerCreation.inputs;

    // Extract input values configured by the user.
    const projectId = inputs["projectId"].stringValues[0];

    // TODO: Save triggerId, notifyUri, and projectId in your database/service.
    // Your backend service listens for events related to 'projectId'
    // and calls notifyUri when those events occur.
    console.log("Trigger subscription created: " + triggerId +
                ", Notify URI: " + notifyUri +
                ", Match Project: " + projectId);

  } else if (triggerDeletion) {
    const triggerId = triggerDeletion.triggerId;

    // TODO: Remove references to triggerId from your database and stop
    // sending future event notifications to the associated notifyUri.
    console.log("Trigger subscription deleted: " + triggerId);
  }
}

/**
 * Mock function showing how your backend service fires the trigger.
 * This logic runs on your service when a watched event occurs.
 *
 * @param {string} notifyUri The stored notifyUri associated with the trigger.
 * @param {string} triggerId The stored triggerId.
 * @param {string} userAccessToken The OAuth 2.0 access token for the user
 *     (obtained using your stored refresh token).
 */
function simulateEventFire(notifyUri, triggerId, userAccessToken) {
  // A unique UUID version 4 is recommended as the requestId for idempotency.
  const requestId = Utilities.getUuid();

  const payload = {
    "name": "triggers/" + triggerId,
    "outputs": {
      "eventName": { "stringValues": ["EventOccurred"] },
      "eventMessage": { "stringValues": ["Hello from the service!"] }
    },
    "requestId": requestId
  };

  const options = {
    "method": "POST",
    "contentType": "application/json",
    "headers": {
      "Authorization": "Bearer " + userAccessToken
    },
    "payload": JSON.stringify(payload),
    "muteHttpExceptions": true
  };

  const response = UrlFetchApp.fetch(notifyUri, options);
  const responseCode = response.getResponseCode();

  if (responseCode === 200) {
    console.log("Trigger successfully fired!");
  } else if (responseCode === 404) {
    // 404 means the trigger registration is invalid or deleted.
    console.log("Trigger not found. Stop sending events for this trigger.");
    // TODO: Clean up the trigger from your backend database.
  } else if (responseCode === 429 || responseCode >= 500) {
    console.log("Temporary error (" + responseCode + "). Retry using exponential backoff.");
  } else {
    console.log("Failed to fire trigger. HTTP Code: " + responseCode + " - " + response.getContentText());
  }
}

ওয়ার্কস্পেস স্টুডিও এপিআই ব্যবহার করুন

আপনি ওয়ার্কস্পেস স্টুডিও এপিআই ( workspacestudio.googleapis.com ) ব্যবহার করে প্রোগ্রাম্যাটিকভাবে গুগলকে স্টার্টার ইভেন্ট সম্পর্কে অবহিত করতে পারেন।

এন্ডপয়েন্টগুলো https://workspacestudio.googleapis.com/v1 এই বেস পাথের অধীনে অবস্থিত।

একটি প্রারম্ভিক ইভেন্ট সম্পর্কে অবহিত করে

একটি ফ্লো-এর নির্বাহ শুরু করার জন্য triggers.fire মেথড ব্যবহার করে একটি স্টার্টার চালু করে।

  • HTTP পদ্ধতি : POST
  • পথ : /v1/triggers/{triggerId}:fire (যেখানে {triggerId} হলো ট্রিগার সাবস্ক্রিপশন তৈরির সময় প্রাপ্ত অনন্য শনাক্তকারী)
  • OAuth স্কোপ : https://www.googleapis.com/auth/workspace.studio.trigger

নিম্নলিখিত কোড নমুনাটি দেখায় কিভাবে অনুরোধে একটি স্টার্টার চালু করতে হয়।

অনুরোধ

{
  "name": "triggers/TRIGGER_ID",
  "outputs": {
    "eventName": {
      "stringValues": [
        "EventOccurred"
      ]
    },
    "eventMessage": {
      "stringValues": [
        "Hello from the service!"
      ]
    }
  },
  "log": {
    "textFormatElements": [
      {
        "text": "An event occurred in the app."
      }
    ]
  },
  "requestId": "UNIQUE_REQUEST_ID"
}
  • name (স্ট্রিং, আবশ্যক): স্টার্টারের রিসোর্স নাম, যা triggers/{triggerId} আকারে বিন্যস্ত।
  • outputs (ম্যাপ, ঐচ্ছিক): ইভেন্টের ডেটা উপস্থাপনকারী প্রারম্ভিক আউটপুট ভেরিয়েবলগুলোর একটি ম্যাপ। প্রতিটি ভ্যালু একটি VariableData অবজেক্ট যা টাইপ করা তালিকা (যেমন, stringValues , booleanValues , integerValues ) সমর্থন করে।
  • log (অবজেক্ট, ঐচ্ছিক): ওয়ার্কস্পেস স্টুডিও এক্সিকিউশন অ্যাক্টিভিটি লগে প্রদর্শিত একটি TextFormat মার্কআপ উপস্থাপনা।
  • requestId (স্ট্রিং, ঐচ্ছিক): পুনরায় চেষ্টার ক্ষেত্রে API-এর আইডম্পোটেন্সি নিশ্চিত করার জন্য সর্বোচ্চ ৩৬টি ASCII অক্ষরের একটি অনন্য শনাক্তকারী (UUID v4 প্রস্তাবিত)।

প্রতিক্রিয়া

সফল হলে প্রতিক্রিয়াটি একটি খালি JSON অবজেক্ট {} ফেরত দেয়।

ওয়ার্কস্পেস স্টুডিও এপিআই কোটা

সিস্টেমের উপর অতিরিক্ত চাপ রোধ করতে, সম্পদের ন্যায্য ব্যবহারকে উৎসাহিত করতে এবং গুগল ওয়ার্কস্পেসের সার্বিক কর্মক্ষমতা রক্ষা করার জন্য workspacestudio.googleapis.com পরিষেবাতে প্রেরিত ট্র্যাফিক সীমিত করা হয়।

নিম্নলিখিত কোটাগুলি বলবৎ করা হয়:

কোটার ধরণ কোটা
প্রতি মিনিটে প্রতি প্রকল্পে ১,০০০টি স্টার্টার অনুরোধ
প্রতি মিনিটে প্রতি ব্যবহারকারী ১০০টি স্টার্টার অনুরোধ

কোটার প্রকারভেদগুলো হলো:

  • প্রতি মিনিটে প্রতি প্রজেক্টে : একজন ডেভেলপারের গুগল ক্লাউড প্রজেক্ট থেকে চালু হওয়া স্টার্টার ইভেন্টের মোট সংখ্যা, সেই প্রজেক্টের স্টার্টারগুলো চালনাকারী সকল ব্যবহারকারীর জন্য প্রতি মিনিটে ১,০০০ রিকোয়েস্টে সীমাবদ্ধ করে।
  • প্রতি ব্যবহারকারী প্রতি মিনিট : একটি নির্দিষ্ট ক্লাউড প্রকল্পে যেকোনো একক ব্যবহারকারীর মোট স্টার্টার ইনভোকেশন প্রতি মিনিটে ১০০টি অনুরোধে সীমাবদ্ধ করে।

সময়-ভিত্তিক কোটা ত্রুটিগুলি পরিচালনা করুন

আপনি এই কোটা অতিক্রম করলে, API একটি HTTP 429 Too Many Requests (বা 429 Resource Exhausted ) এরর কোড রিটার্ন করে, যা নির্দেশ করে যে রেট কোটা অতিক্রম করা হয়েছে।

এই ত্রুটিগুলি সমাধান করার জন্য, আপনার কোডে এক্সেপশনটি ক্যাচ করতে হবে এবং একটি ট্রাঙ্কেটেড এক্সপোনেনশিয়াল ব্যাকঅফ স্ট্র্যাটেজি ব্যবহার করতে হবে। এক্সপোনেনশিয়াল ব্যাকঅফ ব্যর্থ অনুরোধগুলিকে পুনরায় চেষ্টা করে, প্রতিটি চেষ্টার মধ্যে ক্রমান্বয়ে দীর্ঘতর বিলম্ব ব্যবহার করে। এর মধ্যে র‍্যান্ডমাইজড জিটারও (প্রতিটি পুনরাবৃত্তিতে একটি র‍্যান্ডমাইজড বিলম্ব পুনরায় গণনা করা) অন্তর্ভুক্ত থাকে, যা একাধিক ক্লায়েন্টকে একই সময়ে সিঙ্ক্রোনাইজ এবং পুনরায় চেষ্টা করা থেকে বিরত রাখে।

  1. ওয়ার্কস্পেস স্টুডিও এপিআই-তে একটি অনুরোধ পাঠান।
  2. যদি অনুরোধটি 429 ত্রুটির কারণে ব্যর্থ হয়, তবে 1 second + random_number_milliseconds অপেক্ষা করুন এবং পুনরায় চেষ্টা করুন।
  3. যদি এটি আবার ব্যর্থ হয়, তাহলে 2 seconds + random_number_milliseconds অপেক্ষা করুন এবং পুনরায় চেষ্টা করুন।
  4. যদি এটি আবার ব্যর্থ হয়, তাহলে 4 seconds + random_number_milliseconds অপেক্ষা করুন এবং পুনরায় চেষ্টা করুন।
  5. এই চক্রটি চালিয়ে যান, এবং বিলম্বের সময় দ্বিগুণ করে একটি maximum_backoff সীমা (সাধারণত ৩২ বা ৬৪ সেকেন্ড) পর্যন্ত নিয়ে যান।
  6. সর্বোচ্চ ব্যাকঅফ সময়সীমায় পৌঁছানোর পর, সর্বোচ্চ পুনঃচেষ্টার সীমায় না পৌঁছানো পর্যন্ত সেই ধ্রুবক বিলম্ব ব্যবহার করে পুনরায় চেষ্টা করুন, তারপর থেমে যান এবং ত্রুটিটি লগ করুন।

সর্বোত্তম অনুশীলন

একটি স্টার্টার ডিজাইন ও বাস্তবায়ন করার সময়, নিম্নলিখিত সর্বোত্তম অনুশীলনগুলো বিবেচনা করুন:

ব্যাচ তালিকার পরিবর্তে একক ইভেন্ট নির্গত করুন

আপনার স্টার্টারটিকে এমনভাবে ডিজাইন করুন যাতে এটি একাধিক আইটেম বা তালিকার একটি একক ইভেন্ট নির্গত না করে, বরং প্রতিটি স্বতন্ত্র ঘটনার (যেমন একটি রেকর্ড আপডেট করা হলে, একটি নতুন বার্তা পোস্ট করা হলে, বা একটি কাজ বরাদ্দ করা হলে) জন্য একটি পৃথক ইভেন্ট নির্গত করে।

  • বিল্ট-ইন স্টার্টারগুলির সাথে সামঞ্জস্য : ওয়ার্কস্পেস স্টুডিওতে, বিল্ট-ইন গুগল ওয়ার্কস্পেস স্টার্টারগুলি (যেমন জিমেইলে ইমেল পাওয়া বা গুগল চ্যাটে কোনো স্পেসে ব্যবহারকারীর যোগদান) একটিমাত্র ইভেন্টের মাধ্যমে ট্রিগার হয়। একক-আইটেম ইভেন্ট নির্গত করা এই আচরণের সাথে সামঞ্জস্যপূর্ণ এবং সমস্ত স্টার্টার জুড়ে ব্যবহারকারীদের জন্য একটি সামঞ্জস্যপূর্ণ ও অনুমানযোগ্য অভিজ্ঞতা প্রদান করে।
  • সরলতর ফ্লো কনফিগারেশন : একটি ফ্লো-এর পরবর্তী ধাপগুলো সাধারণত একবারে একটি আইটেম প্রসেস করে। সিঙ্গেল-আইটেম ইভেন্ট নির্গত করার মাধ্যমে ব্যবহারকারীরা অ্যারেতে পুনরাবৃত্তি করা বা লিস্ট পার্স করার মতো জটিল ধাপ যোগ না করেই সরাসরি ভেরিয়েবল ম্যাপ করতে পারেন।
  • পোলিং এবং ব্যাচ পরিবর্তনগুলি আলাদাভাবে পরিচালনা করুন : যদি আপনার ব্যাকএন্ড পরিষেবা একটি বাহ্যিক API পোল করে এবং একটি একক পোলিং ব্যবধানের মধ্যে একাধিক পরিবর্তিত আইটেম সনাক্ত করে, তবে সেগুলিকে একটি ব্যাচ ইভেন্টে একত্রিত না করে প্রতিটি আইটেমের জন্য একটি পৃথক স্টার্টার ইভেন্ট চালু করুন।
  • ইভেন্টের হার এবং কোটা পরিচালনা করুন : যেহেতু একাধিক পরিবর্তিত আইটেমের জন্য পৃথক ইভেন্ট চালু করলে অনুরোধের হঠাৎ বৃদ্ধি ঘটতে পারে, তাই নিশ্চিত করুন যে আপনার পরিষেবাটি Workspace Studio API কোটার (যেমন প্রতি ব্যবহারকারী প্রতি মিনিটে ১০০টি অনুরোধের সীমা) মধ্যে থাকে। যদি একটি পোলিং চক্রে প্রচুর পরিমাণে আইটেম আসে (উদাহরণস্বরূপ, ১০০টির বেশি পরিবর্তিত রেকর্ড), তাহলে 429 Too Many Requests ত্রুটি এড়াতে সময়ের সাথে সাথে ইভেন্ট প্রেরণের গতি বা নিয়ন্ত্রণ নিয়ন্ত্রণ করুন।

মূল আচরণ এবং প্রান্তিক পরিস্থিতি

স্টার্টার ইন্টিগ্রেট করার সময়, ডেভেলপারদের নির্দিষ্ট ত্রুটির আচরণ এবং রানটাইম বৈশিষ্ট্যগুলো পরিচালনা করতে হয়:

  • টেস্ট রান সমর্থন নেই : প্রাথমিকভাবে, ওয়ার্কস্পেস স্টুডিও টেস্ট রান সমর্থন করে না।
  • আইডম্পোটেন্সি এবং রিপ্লে প্রতিরোধ : যদিও এটি কঠোরভাবে বাধ্যতামূলক নয়, আপনার HTTP বা অ্যাপস স্ক্রিপ্ট পেলোডে একটি অনন্য requestId (যেমন একটি UUID) অন্তর্ভুক্ত করা উচিত। requestId প্রদান করলে আইডম্পোটেন্সি নিশ্চিত হয়, কারণ এটি API-কে ডুপ্লিকেট নোটিফিকেশন শনাক্ত করতে এবং উপেক্ষা করতে সাহায্য করে, যার ফলে একটিমাত্র ইভেন্টের জন্য ফ্লোটি একাধিকবার রান হওয়া থেকে বিরত থাকে।
  • নিষ্ক্রিয় এবং পুনরায় সক্রিয় করা ফ্লো : যখন ওয়ার্কস্পেস স্টুডিওতে আপনার স্টার্টার ধারণকারী কোনো ফ্লো নিষ্ক্রিয় করা হয়, তখন গুগল আপনার onManageFunction কলব্যাকে একটি triggerDeletion লাইফসাইকেল ইভেন্ট পাঠায়। এছাড়াও, সংশ্লিষ্ট FireTrigger মেথডে করা যেকোনো কল একটি 404 Not Found এরর রিটার্ন কোড দেয় ( Requested entity was not found. )। আপনার সার্ভিসের উচিত 404 এররের প্রতিক্রিয়ায় সেই স্টার্টার ইনস্ট্যান্স আইডির জন্য ভবিষ্যতের ইভেন্ট নোটিফিকেশন ডেলিভারি বন্ধ করে দেওয়া।

    যদি কোনো ব্যবহারকারী পরবর্তীতে ফ্লোটি পুনরায় সক্রিয় করেন, তাহলে Google একটি নতুন triggerId এবং notifyUri সম্বলিত একটি নতুন triggerCreation ইভেন্ট সহ আপনার onManageFunction কলব্যাকটি আহ্বান করে একটি নতুন সাবস্ক্রিপশন লাইফসাইকেল শুরু করে। পূর্ববর্তী triggerId স্থায়ীভাবে নিষ্ক্রিয় হয়ে যায় এবং পুনরায় সক্রিয় করা হয় না, তাই আপনার পরিষেবাটির পুরানো কোনো ট্রিগার ইনস্ট্যান্স পুনরায় সক্রিয় হয়েছে কিনা তা পোল বা পরীক্ষা করা উচিত নয়। আরও তথ্যের জন্য, “স্টার্টার সাবস্ক্রিপশন লাইফসাইকেল পরিচালনা করুন” দেখুন।

  • আইডম্পোটেন্ট সাবস্ক্রিপশন ডিলিট : আপনার onManageFunction কলব্যাক ফাংশনটিকে অবশ্যই গুগলের কাছ থেকে আসা প্রাথমিক ডিলিট অনুরোধগুলো আইডম্পোটেন্টভাবে পরিচালনা করতে হবে। যদি গুগল একই triggerId এর জন্য একাধিকবার ডিলিট হুক কল করে (উদাহরণস্বরূপ, সাময়িক সংযোগ বিচ্ছিন্ন হওয়ার কারণে পুনরায় চেষ্টার সময়), তাহলে ফাংশনটির সফলভাবে রিটার্ন করা উচিত।

  • ফ্লো কোটা : ওয়ার্কস্পেস স্টুডিও এপিআই কোটার বাইরেও, ইউজার ফ্লো অতিরিক্ত অভ্যন্তরীণ কোটা নিয়ন্ত্রণের অধীন। ঘন ঘন লুপ বা অত্যধিক ইভেন্টের পরিমাণ সুরক্ষা সীমা অতিক্রম করতে পারে, যার ফলে ফ্লোটি স্বয়ংক্রিয়ভাবে নিষ্ক্রিয় হয়ে যায়।