• AWS Step Functionsیک سرویس با زبان سطح پایین و بدون سرور در AWS Cloud برای ایجاد گردش کار است.
  • با استفاده از توابع مرحله AWS، می‌توانیم طیف گسترده‌ای از برنامه‌های کاربردی شامل جریان‌های کاری مانند هماهنگ‌سازی میکروسرویس‌ها، خودکارسازی فرآیندهای فناوری اطلاعات و کسب‌وکار، و ساخت پایپ لاین و یادگیری ماشین بسازیم.
  • ما گردش کار را در توابع مرحله ای با بلوک‌های ساختمانی مانند بلوک‌هایی برای پیکربندی اقدامات برای یکپارچه‌سازی سرویس‌های مختلف AWS، موازی‌سازی بیش از یک اقدام، مدیریت شکست و تنظیم مکانیسم‌های مشاهده‌پذیری تعریف می‌کنیم.
  • ما از یک زبان اختصاصی دامنه در قالب JSON با استفاده از طرحی به نام Amazon States Language (ASL) برای تعریف گردش کار در توابع مرحله استفاده می کنیم.
  • Step Function همچنین یک رابط بصری به نام Workflow Studio ارائه می کند تا به ما در تعریف، مشاهده، اشکال زدایی و اجرای گردش کار کمک کند.

در این مقاله، با مفاهیم اصلی توابع مرحله AWS آشنا می‌شویم و آن‌ها را برای ایجاد یک گردش کار برای یک نمونه فرآیند کسب‌وکار به کار می‌بریم: انجام سفارش.

توابع مرحله ای AWS، یک ماشین حالت را پیاده سازی می کند

توابع مرحله ای AWS از یک ماشین حالت برای نمایش گردش کار استفاده می کند. یک گردش کار شامل مجموعه ای از وظایف است که هر یک نشان دهنده یک فعالیت مجزا برای انجام است. هر وظیفه با حالتی از ماشین حالت تعریف می شود.

اساساً، ماشین حالت یک مفهوم ریاضی انتزاعی است که حالت‌های ممکن یک سیستم را در یک نقطه خاص از زمان نشان می‌دهد. به طور سنتی برای مدل‌سازی انتقال حالت در زبان مدل‌سازی واحد (UML) در مهندسی نرم‌افزار استفاده می‌شود.

ما ماشین حالت یک تابع مرحله را در یک زبان خاص دامنه (DSL) به نام Amazon States Language  (ASL) تعریف می کنیم. ASL یک زبان مبتنی بر JSON است که برای توصیف ماشین های حالت به صورت اعلامی استفاده می شود.

ما همچنین می توانیم یک نمایش بصری را در Workflow Studio مشاهده کنیم. Workflow Studio یک طراح بصری است که می‌توانیم ساختارهای مختلف را برای ایجاد و ویرایش گردش کار بکشیم و رها کنیم. همانطور که گردش کار را در طراح ایجاد می کنیم، Workflow Studio اعتبار سنجی و تولید خودکار کد در ASL را انجام می دهد.

یک ماشین حالت برای یک نمونه گردش کار تایید وام در Workflow Studio به شکل زیر است:

ما می توانیم دو نوع ماشین حالت ایجاد کنیم: استاندارد و اکسپرس. نوع Express برای بارهای کاری با حجم بالا و پردازش رویداد استفاده می شود و می تواند تا پنج دقیقه اجرا شود. نوع استاندارد پیش فرض است و برای ایجاد گردش کار برای فرآیندهای طولانی مدت، بادوام و قابل ممیزی استفاده می شود. برای درک عمیق تر از تفاوت های بین دو نوع ماشین حالت به اسناد رسمی مراجعه کنید.

یک ماشین حالت ، چند حالت دارد

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

نوع  وضعیت های هر وظیفه، واحدهای “کار” را در یک ماشین حالت انجام می دهند. آنها به عنوان یک تماس API برای یکی از سرویس های AWS پیکربندی شده اند. پارامترهای API یا در تعریف ماشین حالت مشخص شده اند یا در زمان اجرا ارائه می شوند.

“کار” با استفاده از یک فعالیت یا با فراخوانی اقدامات API خدمات AWS انجام می شود. تابع AWS Lambda رایج‌ترین سرویسی است که توسط حالت‌های نوع وظیفه با فراخوانی متد فراخوانی سرویس Lambda استفاده می‌شود.

یک فعالیت برنامه ای است که روی سیستم دیگری مانند EC2، ECS یا دستگاه های تلفن همراه میزبانی می شود. برخلاف توابع لامبدا، فعالیت ها در حالی که منتظر اجرای حالت نوع وظیفه هستند، عملکردهای مرحله را نظرسنجی می کنند.

به غیر از حالت نوع وظیفه، انواع دیگری از حالت ها عبارتند از:

  1. انتخاب: نقطه تصمیم با یک یا چند شاخه با حالت های فرزند، که یکی از آنها بر اساس یک شرط بولی اجرا می شود.
  2. نقشه: چندین بار در یک حالت فرزند تکرار کنید
  3. Parallel: یک یا چند شاخه را به صورت موازی اجرا کنید
  4. موفقیت یا شکست: اجرا را با موفقیت یا شکست به پایان برسانید
  5.  Pass: یک مکان نگهدار که در آن می‌توانیم تبدیل داده‌ها را انجام دهیم و برای اجرای اشکال‌زدایی استفاده کنیم.

در مثال فرآیند انجام سفارش در بخش های بعدی با این نوع حالت ها مواجه خواهیم شد.

تعریف ماشین حالت برای فرآیند انجام سفارش

اجازه دهید ابتدا ماشین حالت را برای فرآیند انجام سفارش تعریف کنیم.

ما می‌توانیم یک ماشین حالت را از Workflow Studio در کنسول مدیریت AWS یا با تعریف حالت‌ها در ASL در کنسول Step Functions یا با آپلود یک فایل حاوی تعریف حالت در ASL تعریف کنیم.

اجازه دهید از Workflow Studio برای نوشتن ماشین حالت خود برای این مثال استفاده کنیم. ما همچنین نوع ماشین حالت را به عنوان استاندارد انتخاب می کنیم زیرا فرآیند انجام سفارش ما طولانی است و می تواند بیش از 5 دقیقه کار کند.

ما نام انجام سفارش را به ماشین حالت خود می دهیم و نقش IAM را تعیین می کنیم که مشخص می کند ماشین حالت ما به کدام منابع اجازه دسترسی در حین اجرا را دارد. تعریف خط مشی IAM ما با خط مشی زیر مرتبط است:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "lambda:InvokeFunction"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}

این خط مشی به ماشین حالت اجازه می دهد تا هر تابع Lambda را فراخوانی کند.

یک فرآیند انجام سفارش معمولی از یک گردش کاری مشابه این استفاده می کند:

این گردش کار پس از ثبت سفارش توسط مشتری آغاز می شود و شامل مراحل نشان داده شده در نمودار است. یک ماشین حالت function Step برای نمایش این گردش کار در Workflow Studio به شکل زیر خواهد بود:

همانطور که می بینیم، ما از حالت های زیر برای تعریف این ماشین حالت استفاده کرده ایم:

  1. بررسی موجودی: این یک حالت از نوع: Task است و فهرستی از تابع لامبدا را بررسی می کند.
  2. Cancel Order: این حالت از نوع: Task است و دستور به روز رسانی تابع Lambda را فراخوانی می کند.
  3. علامت‌گذاری ترتیب به‌عنوان کامل: این حالت از نوع: Task است و ترتیب به‌روزرسانی تابع Lambda را فراخوانی می‌کند.
  4. به روز رسانی موجودی: این حالت از نوع: Task است و فهرستی به روز رسانی تابع Lambda را فراخوانی می کند.
  5. آیتم های موجود: این حالت از نوع: انتخاب با 2 شاخه است. در صورت موجود نبودن موارد سفارش لغو می شود.
  6. موازی: این حالت از نوع: موازی با 2 شاخه است که ماشین حالت به صورت موازی اجرا می کند.
  7. موفقیت: اجرا را با موفقیت به پایان برسانید.
  8. شکست: اجرا را با شکست پایان دهید.

همچنین می‌توانیم یک نشانگر شروع و پایان برای تعریف موقعیت‌های شروع و پایان برای اجرای ماشین حالت ببینیم.

تعریف مربوطه از ماشین حالت در زبان ایالات آمازون (ASL) به این صورت است:

{
  "Comment": "order processing",
  "StartAt": "check inventory",
  "States": {
    "check inventory": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "OutputPath": "$.Payload",
      "Parameters": {
        "FunctionName": "arn:aws:lambda:us-east-1:**********:function:checkInventory:$LATEST"
      },
      "Next": "items available?"
    },
    "items available?": {
      "Type": "Choice",
      "Choices": [
        {
          "Variable": "$.item.num_of_items",
          "NumericGreaterThanPath": "$.inventory.num_of_items",
          "Next": "cancel order"
        }
      ],
      "Default": "Parallel"
    },
    "Parallel": {
      "Type": "Parallel",
      "Branches": [
        {
          "StartAt": "mark order as complete",
          "States": {
            "mark order as complete": {
              "Type": "Task",
              "Resource": "arn:aws:states:::lambda:invoke",
              "OutputPath": "$.Payload",
              "Parameters": {
                "Payload.$": "$",
                "FunctionName": "arn:aws:lambda:us-east-1:**********:function:updateOrder:$LATEST"
              },
              "End": true
            }
          }
        },
        {
          "StartAt": "update inventory",
          "States": {
            "update inventory": {
              "Type": "Task",
              "Resource": "arn:aws:states:::lambda:invoke",
              "OutputPath": "$.Payload",
              "Parameters": {
                "Payload.$": "$",
                "FunctionName": "arn:aws:lambda:us-east-1:**********:function:updateInventory:$LATEST"
              },
              "End": true
            }
          }
        }
      ],
      "Next": "Success"
    },
    "Success": {
      "Type": "Succeed"
    },
    "cancel order": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "OutputPath": "$.Payload",
      "Parameters": {
        "Payload.$": "$",
        "FunctionName": "arn:aws:lambda:us-east-1:**********:function:updateOrder:$LATEST"
      },
      "Next": "Fail"
    },
    "Fail": {
      "Type": "Fail"
    }
  }
}

این ساختار دارای فیلد State است که شامل مجموعه ای از تمام اشیاء حالت با نام هایی مانند: موجودی چک، لغو سفارش، موجودی به روز رسانی و غیره است. موجودی چک به نام.

هر شیء حالت دارای یک ویژگی Type برای نوع حالت و یک ویژگی Next است. ویژگی Next حاوی نام حالت بعدی است که ماشین حالت اجرا خواهد کرد.

سایر ویژگی های شیء حالت به نوع حالت بستگی دارد. در این مثال، برای هر یک از حالت‌های نوع Task، یک ویژگی Resource با مقدار arn:aws:states:::lambda:invoke تعریف کرده‌ایم تا نشان دهنده API مورد فراخوانی باشد. ویژگی Resource یک ARN از سرویس AWS را برای فراخوانی می گیرد که دارای قالب: arn:aws:states:::aws-sdk:serviceName:apiAction.[serviceIntegrationPattern] است. پسوند serviceIntegrationPattern در این فرمت می تواند یکی از مقادیر را بگیرد:

  1. .sync: وقتی از .sync به عنوان پسوند استفاده می کنیم، توابع Step منتظر تکمیل درخواست هستند تا به حالت بعدی بروند.
  2. .waitForTaskToken: وقتی از این الگوی یکپارچه سازی استفاده می کنیم، می توانیم توابع Step را به طور نامحدود متوقف کنیم و منتظر بمانیم تا یک فرآیند یا گردش کار خارجی کامل شود.
  3. empty: اگر این پسوند حذف شود، الگوی یکپارچه سازی از نوع درخواست-پاسخ است که به این معنی است که توابع مرحله قبل از پیشرفت به حالت بعدی منتظر پاسخ HTTP هستند. همه توابع Lambda ما به این ترتیب فراخوانی می شوند زیرا ما هیچ پسوندی برای serviceIntegrationPattern در ویژگی Resource ارائه نکرده ایم.

ما پارامترهای API را در ویژگی Parameters تعریف کرده‌ایم که مجموعه‌ای از جفت‌های کلید-مقدار را می‌گیرد. ما می توانیم کلیدها را ببینیم: FunctionName و Payload.$. کلید FunctionName مقدار نام تابع Lambda را دارد در حالی که کلید Payload.$ حاوی عبارتی برای تعیین ورودی است که باید در طول اجرای ماشین حالت به تابع Lambda ارسال شود.

در قسمت بعدی شاهد عبور و دستکاری ورودی و خروجی توسط حالت های مختلف در حین اجرای ماشین حالت خواهیم بود.

دستکاری داده ها با فیلترهای ورودی و خروجی

بسته به اینکه نوع گردش کار استاندارد یا اکسپرس باشد، می توانیم ماشین های حالت را به صورت ناهمزمان یا همزمان فراخوانی کنیم. آنها را می توان از طریق کنسول Step Functions یا رابط خط فرمان AWS (CLI) یا با فراخوانی Step Functions API با AWS SDK فراخوانی کرد.

توابع، مرحله ورودی را با فرمت JSON دریافت می کنند که سپس به حالت های مختلف در ماشین حالت ارسال می شود. همانطور که در این نمودار نشان داده شده است، می توانیم انواع مختلفی از فیلترها را برای دستکاری داده ها در هر حالت قبل و بعد از پردازش کار پیکربندی کنیم:

اکنون ببینیم چگونه می‌توانیم از این فیلترها با اعمال آنها در حالت‌های مختلف ماشین حالت فرآیند انجام سفارش خود استفاده کنیم.

{
    "order_processing_request": {
        "customer": {

        },
        "item": {
                "item_no": "I1234",
                "num_of_items": 5,
                "shipping_date": "23/12/2022",
                "shipping_address": "address_1"
        },
        "order_details" : {
                "order_id": "ORD345567",
                "order_date": "15/12/2022"
        }    
    }
}

داده های ورودی شامل اطلاعات مربوط به مشتری است که سفارش را ارسال کرده است، کالایی که برای آن سفارش داده شده است و جزئیات سفارش. این ورودی به حالت اول وارد می شود: بررسی موجودی. ماشین حالت تابع Lambda را اجرا می کند: موجودی مربوط به این کار را بررسی کنید. در اینجا کد تابع Lambda برای بررسی موجودی است:

exports.handler = async (event, context, callback) => {
    const item_no = event.item_no
    const num_of_items = event.num_of_items
    console.log(`item::: ${item_no} ${num_of_items}`)
    
     // TODO fetch inventory info from the database
    const inventoryData = getInventoryDataForItem(item_no)
   
    callback(null, inventoryData)
}

function getInventoryDataForItem(item_no) {  
    var rand = Math.random()*100
    var power = Math.pow(10, 0)
    quantity_in_stock =  Math.floor(rand*power)
    
    const inventory = {
                        sku: "S0001",  
                        quantity_in_stock: quantity_in_stock,
                        warehouse_no: "W001",
                        age_of_stock_in_days: 98
                      }
    return inventory
}

item_no را به عنوان ورودی می گیرد و اطلاعات موجودی را از یک فروشگاه داده واکشی می کند. برای این مثال، ما یک مقدار کدگذاری شده از داده های موجودی را برمی گردانیم.

ما ورودی تابع Lambda را با استفاده از دو فیلتر آماده می کنیم:

  1. InputPath ما این فیلتر را به عنوان $.item تنظیم کرده ایم این فیلتر ویژگی آیتم را از ورودی ماشین حالت استخراج می کند. نتیجه اعمال این فیلتر در اینجا آمده است:
{
    "item_no": "I1234",
    "num_of_items": 5,
    "shipping_date": "23/12/2022",
    "shipping_address": "address_1"
}
  1. پارامتر: این فیلتر ورودی مورد نیاز تابع Lambda را آماده می کند.
{
  "item_no.$": "$.item_no",
  "num_of_items.$": "$.num_of_items"
}

در اینجا نتیجه اعمال فیلترهای InputPath و Parameter در ورودی حالت است:

{
    "item_no": "I1234",
    "num_of_items": 5
}

این بار ورودی است که توسط ماشین حالت برای اجرای وظیفه مرتبط با این حالت استفاده می شود. نتیجه اجرای تابع Lambda: checkInventory این است:

{
  "sku": "S0001",
  "quantity_in_stock": 84,
  "warehouse_no": "W001",
  "age_of_stock_in_days": 98
}

هنگامی که تابع لامبدا توسط حالت نوع وظیفه ماشین حالت فراخوانی می شود، به شکل زیر خواهد بود:

{
  "ExecutedVersion": "$LATEST",
  "Payload": {
      "sku": "S0001",
      "quantity_in_stock": 84,
      "warehouse_no": "W001",
      "age_of_stock_in_days": 98
  },
  "SdkHttpMetadata": {
    "AllHttpHeaders": {
      ...
    },
    "HttpHeaders": {
      ...
    },
    "HttpStatusCode": 200
  },
  "SdkResponseMetadata": {
    "RequestId": "ac79dacd-7c6f-41c7-bfcf-eea70b43e141"
  },
  "StatusCode": 200
}

اگر فیلتر دیگری اعمال نکنیم، این بار به حالت بعدی منتقل می شود. در آن صورت، داده‌های ورودی اصلی حاوی اطلاعات مشتری و سفارش را که برای اجرای حالت‌های باقی‌مانده ماشین حالت لازم است، از دست خواهیم داد. همچنین نیازی به بازگشت همه فیلدها در پاسخ JSON نداریم.

برای حفظ ورودی اصلی و استخراج تنها فیلدهای مربوطه از نتیجه کار برای پردازش بیشتر توسط دستگاه حالت، اجازه دهید چند فیلتر دیگر اضافه کنیم:

  1. ResultSelector: ما از این فیلتر برای ساخت یک بار JSON جدید استفاده می کنیم که فقط شامل فیلدهای مورد نیاز برای اجرای حالت های باقیمانده در ماشین حالت است. به عنوان مثال، می‌توانیم با خیال راحت فیلدهای: warehouse_no و age_of_stock_in_days را که برای هیچ پردازش دیگری لازم نیست، کنار بگذاریم. بر این اساس، فیلتر ResultSelector را با عبارت زیر تعریف می کنیم:
{
    "num_items_in_inventory.$": "$.Payload.quantity_in_stock",
    "item_sku.$": "$.Payload.sku"
}

با این کار یک محموله تنها با ویژگی‌های num_items_in_inventory و item_sku ساخته می‌شود. payload  ما پس از اعمال این فیلتر در نتیجه اجرای کار به صورت زیر است:

{
  "num_items_in_inventory": 84,
  "item_sku": "S0001"
}
  1. ResultPath: از فیلتر ResultPath برای اضافه کردن نتیجه کار به ورودی حالت اصلی استفاده می کنیم. ما فیلتر ResultPath را برای وضعیت فعلی تعریف کرده‌ایم: فهرست موجودی را به صورت $.task_result بررسی کنید. payload ما پس از اعمال این فیلتر به صورت زیر خواهد بود:
{
    "order_processing_request": {
        "customer": {
           "customer_id": "C123456"
        },
        "item": {
                "item_no": "I1234",
                "num_of_items": 5,
                "shipping_date": "23/12/2022",
                "shipping_address": "address_1"
        },
        "order_details" : {
                "order_id": "ORD345567",
                "order_date": "15/12/2022"
        }    
    },
    "task_result": {
        "num_items_in_inventory": 84,
        "item_sku": "S0001"
    }
}

اکنون می‌توانیم خروجی ResultSelector را که به داده‌های ورودی تحت ویژگی task_result اضافه شده است، ببینیم.

  1. OutputPath: از فیلتر OutputPath برای استخراج بخشی از خروجی برای عبور به حالت بعدی استفاده می شود. به عنوان مثال، اگر فقط به order_details نیاز داشته باشیم، فیلتر OutputPath را به صورت $.order_processing_request.order_details تعریف می کنیم. برای مثال ما از انجام سفارش، ما به تمام فیلدها نیاز داریم، بنابراین $ را به عنوان مقدار فیلتر OutputPath که پیش‌فرض نیز است، تعریف می‌کنیم.

موجودی بررسی وضعیت پس از افزودن این فیلترها به شکل زیر است:

{
  "Comment": "order processing",
  "StartAt": "check inventory",
  "States": {
    "check inventory": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "OutputPath": "$",
      "Parameters": {
        "FunctionName": "arn:aws:lambda:us-east-1:***********:function:checkInventory:$LATEST",
        "Payload": {
          "item_no.$": "$.item_no",
          "num_of_items.$": "$.num_of_items"
        }
      },
      "Next": "items available?",
      "InputPath": "$.order_processing_request.item",
      "ResultSelector": {
        "num_items_in_inventory.$": "$.Payload.quantity_in_stock",
        "item_sku.$": "$.Payload.sku"
      },
      "ResultPath": "$.task_result"
    },
    …
    …
  }
}

ما می توانیم لیستی از اجرای ماشین های حالت را با اطلاعاتی مانند شناسه اجرا، وضعیت و تاریخ شروع در کنسول Step Functions مشاهده کنیم. ما می‌توانیم یک graph inspector  را در انتخاب یک اجرا ببینیم که حالت‌ها و انتقال‌هایی را نشان می‌دهد که با رنگ‌ها علامت‌گذاری شده‌اند تا کارهای موفق، شکست‌ها و کارهایی را که هنوز در حال انجام هستند نشان دهد. graph inspector  حاصل از اجرای گردش کار انجام سفارش ما در زیر نشان داده شده است:

مدیریت خطاها در گردش کار تابع مرحله

در صورت عدم رسیدگی به خطا، هر زمان که یک حالت خطا را گزارش کند، اجرای یک ماشین حالت با شکست مواجه خواهد شد. وضعیت های نوع: Task گزینه هایی را برای پیکربندی یک امتحان مجدد و بازگشت به عقب برای رسیدگی به خطاها ارائه می دهد.

تلاش مجدد روی خطا

ما سعی مجدد را با تعریف یک یا چند قانون تکرار مجدد به نام retriers پیکربندی می کنیم. این امر اجازه می دهد تا زمانی که در حین اجرای کار خطاهایی رخ می دهد، کار برای اجرا دوباره امتحان شود.

به مثال خودمان می رسیم، تابع Lambda ما می تواند با خطاهایی از نوع: Lambda.ServiceException، Lambda.AWSLambdaException یا Lambda.SdkClientException مواجه شود. برای امتحان مجدد کار برای بررسی موجودی، هنگامی که این خطاها رخ می دهد، یک قانون امتحان مجدد را همانطور که در ASL نشان داده شده است پیکربندی کرده ایم:

{
  "Comment": "order processing",
  "StartAt": "check inventory",
  "States": {
    "check inventory": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "OutputPath": "$",
      "Parameters": {
        "FunctionName": "arn:aws:lambda:us-east-1:***********:function:checkInventory:$LATEST",
        "Payload": {
          "item_no.$": "$.item_no",
          "num_of_items.$": "$.num_of_items"
        }
      },
      "Retry": [
        {
          "ErrorEquals": [
            "Lambda.ServiceException",
            "Lambda.AWSLambdaException",
            "Lambda.SdkClientException"
          ],
          "IntervalSeconds": 3,
          "MaxAttempts": 2,
          "BackoffRate": 2
        }
      ],
      "Next": "items available?",
    }
}

در اینجا ما retrier را با فاصله 3 ثانیه، MaxAttempts: 2، و BackoffRate 2 تعریف کرده ایم. فاصله، تعداد ثانیه های قبل از اولین تلاش مجدد است. MaxAttempts حداکثر تعداد تلاش‌های مجدد است و BackoffRate ضریبی است که در آن فاصله تلاش مجدد با هر تلاش افزایش می‌یابد.

بازگشت به حالت متفاوت در صورت خطا

زمانی که خطاها رخ می‌دهند، می‌توانیم با تعریف قوانینی برای رهگیری خطاها که «گیرنده» نامیده می‌شوند، به حالت بازگشتی برگردیم. در این مثال، ما یک حالت خطای آماده را تعریف می‌کنیم که وضعیت موجودی چک می‌تواند در صورت مواجهه با خطای نوع: States.TaskFailed، به حالت اولیه بازگردد.

ماشین حالت با یک retrier و یک گیرنده تعریف شده برای مرحله موجودی چک در Workflow Studio به شکل زیر است:

ما موجودی چک را برای بازگشت به حالت لغو سفارش در مواجهه با خطا تعریف کرده‌ایم یا عبارت State.TaskFailed را تایپ کنید.

خلاصه مراحل استفاده شده برای ساخت ماشین حالت

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

  1. ما یک ماشین حالت از نوع استاندارد ایجاد کردیم زیرا انجام سفارش یک فرآیند طولانی مدت است.
  2. ما از یک نقش IAM استفاده کردیم تا به ماشین حالت اجازه فراخوانی توابع مختلف AWS Lambda را بدهیم.
  3. ما از حالت های نوع: Task، Parallel، Choice، Success و Fail در ماشین حالت برای طراحی گردش کار خود استفاده کردیم.
  4. فیلترهای InputPath، Parameter، ResultSelector، ResultPath و OutputPath را برای دستکاری داده ها از طریق ماشین حالت در حین اجرا تعریف کردیم.
  5. ما مدیریت خطا را با پیکربندی یک امتحان مجدد و یک شرط بازگشتی به یک حالت متصل کردیم.

نتیجه

اجرای گردش‌های کاری برای هماهنگی بین سرویس‌های گرانول یکی از چالش‌های رایجی است که هنگام ساخت برنامه‌های پیچیده با آن مواجه می‌شویم.

AWS Step Functions به ما کمک می کند تا گردش کار را به صورت بصری یا به زبان اختصاصی دامنه (Amazon States Language) برای خواندن آسان طراحی کنیم. هنگام اجرای ماشین‌های حالت، توابع  stepبه نگرانی‌های رایج گردش کار مانند مدیریت وضعیت، چک‌پوینت، تلاش‌های مجدد و بازگشت مجدد توجه می‌کنند.

ما باید از ترکیب مناسبی از بلوک‌های سازنده ماشین حالت استفاده کنیم تا گردش‌های کاری خود را برای عملکرد بهینه طراحی کنیم. ما می‌توانیم از مجموعه گردش کار تابع Step استفاده کنیم تا بهترین روش‌ها را در طراحی گردش کار خود اعمال کنیم.

مجموعه گردش کار Step Function چیزی است که AWS آن را تجربه جدیدی برای طراحی گردش کار با الگوهای نظری، الگوهای قابل استفاده مجدد و برنامه های مثال می نامد تا به ساخت گردش کار ما با توابع Step کمک کند.