برنامه نویسی

بیایید یک خرید کامل را با عملکردهای بادوام لاجورد و استاندارد حماسه شبیه سازی کنیم؟ 🎉

آیا در مورد ارکستر کردن فکر کرده اید؟ کل فرایند خرید یک بازار با خیال راحت ، حتی اگر در نیمه راه مشکلی ایجاد کنید؟ امروز ما دقیقاً این کار را خواهیم کرد عملکردهای بادوام لاجورد در node.js و الگوی حماسه برای اطمینان از اینکه اگر چیزی از بین برود ، می توانیم مراحل قبلی را بدون استرس خنثی کنیم. بیایید گام به گام یک شبیه سازی خرید کامل – از پرداخت تا حمل و نقل – را به سبک بسیار آرام تنظیم کنیم (با من همراه باشید که برای شما توضیح می دهم).

سریع: این حماسه چیست؟

قبل از قرار دادن دست خود در کد ، این توضیح سریع ارزش دارد: حماسه این یک الگوی معماری است که برای مدیریت استفاده می شود معاملات توزیع شده یا فرآیندهای تجاری طولانی مدتبشر به جای اینکه همه چیز را در یک معامله غول پیکر واحد (که در بسیاری از خدمات میکروسرویس غیر عملی است) قرار دهید ، حماسه این روند را به دنباله ای تقسیم می کند مراحل محلی (هرکدام با تعهدات خاص خود) و مهم ، جبران برای هر مرحله اگر چیزی بعداً اشتباه شود.

در پرتغالی خوب: خرید آنلاین را با چند مرحله تصور کنید (پرداخت شارژ ، موجودی رزرو ، ارسال سفارش …). اگر در پایان حمل و نقل از بین برود ، از شارژ مشتری و محصول رزرو شده برای هیچ چیز استفاده نمی شود ، درست است؟ حماسه تضمین می کند که هر مرحله خنثیسازی می شود در صورت لزوم – مانند “Ctrl+Z” برای هر عملی که قبلاً انجام شده است در صورت عدم موفقیت روند انجام شود. بنابراین ، ما سیستم ها را ثابت نگه می داریم و هیچ کس از دست نمی دهد. باحال ، درست است؟ 😁

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

نمای کلی جریان خرید

بیایید ببینیم جریان شبیه سازی خرید ما قبل از غواصی به کد. بیایید یک خرید بسیار ساده را در یک بازار تصور کنیم ، که شامل سه مرحله اصلی است:

  1. موجودی ذخیره از محصول خریداری شده (پس از همه ، ما نمی توانیم آنچه را که موجود نیست ، بفروشیم ، بنابراین ابتدا ذخیره را تضمین می کنیم).
  2. پرداخت از مشتری (به عنوان مثال شارژ روی کارت).
  3. برنامه حمل و نقل از محصول (توزیع کالای مورد را برای تحویل شبیه سازی کنید).

و البته ، همانطور که ما از استاندارد SAGA پیروی می کنیم ، هر دو مرحله اول یک عمل انجام می دهند جبران اگر چیزی پس از آن شکست بخورد:

  • اگر پرداخت پردازش شود اما حمل و نقل انجام نشود ، ما نیاز داریم پرداخت را قرار دهیدبشر
  • اگر سهام محفوظ باشد اما پرداخت از بین نرود ، ما نیاز داریم سهام رزرو شده را آزاد کنیدبشر

در مورد ما ، مرحله سوم (حمل و نقل) نهایی است. در صورت عدم موفقیت ، ما جبران مراحل قبلی را پرواز می کنیم و خرید را لغو می کنیم. اگر همه مراحل بگذرد ، Ball Show: خرید کامل! ✅

به سطح بالا مراجعه کنید:

نمودار جریان

  • موفقیت کل: رزرو -> پرداخت -> حمل و نقل -> پایان (خرید تأیید شده).
  • خرابی پرداخت: ذخیره -> خرابی تلاش برای پرداخت -> سهام منتشر شده -> پایان (خرید لغو شده).
  • شکست حمل و نقل: رزرو -> پرداخت -> حمل و نقل تلاش برای خرابی -> پرداخت بازگشت + سهام منتشر شده -> پایان (خرید لغو شده).

با توجه به این نکته ، کد را شکست!

ارکستر کردن حماسه خرید (کد ارکستر)

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

در پروژه Node.js (با استفاده از TypeScript در اینجا برای ارائه یک سازمان یافته ، اما می تواند JavaScript خالص نیز باشد) ، ارکستور به عنوان یک تابع تولید با استفاده از کتابخانه تعریف می شود durable-functionsبشر کد کامل ما را دنبال کنید OrderOrchestrator با نظرات توضیح هر مرحله:

import * as df from "durable-functions";

const orchestrator = df.orchestrator(function* (context) {
    const input = context.df.getInput();

    // Passo 1: Reservar estoque
    const inventoryResult = yield context.df.callActivity("ReserveInventory", input.orderDetails);
    if (!inventoryResult.success) {
        // Falhou ao reservar estoque, encerra a saga com erro (nada para compensar aqui, pois nada mais foi feito)
        return { success: false, message: "Compra cancelada: estoque indisponível 😕" };
    }

    // Passo 2: Processar pagamento
    const paymentResult = yield context.df.callActivity("ProcessPayment", input.paymentDetails);
    if (!paymentResult.success) {
        // Falhou pagamento: chama compensação do estoque reservado e termina com erro
        yield context.df.callActivity("ReleaseInventory", input.orderDetails);
        return { success: false, message: "Compra cancelada: pagamento falhou, estoque liberado 💸" };
    }

    // Passo 3: Agendar envio
    const shippingResult = yield context.df.callActivity("ScheduleShipping", { 
        orderId: input.orderDetails.orderId, 
        shippingAddress: input.shippingAddress 
    });
    if (!shippingResult.success) {
        // Falhou envio: estorna pagamento e libera estoque (compensações das etapas anteriores)
        yield context.df.callActivity("RefundPayment", input.paymentDetails);
        yield context.df.callActivity("ReleaseInventory", input.orderDetails);
        return { success: false, message: "Compra cancelada: envio n\u00e3o dispon\u00edvel, pagamento estornado e estoque liberado 🚚" };
    }

    // Se chegou aqui, tudo deu certo!
    return { success: true, message: "Pedido concluido com sucesso! 🥳" };
});

export default orchestrator;
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

بیایید آنچه را که در آنجا اتفاق می افتد را جدا کنیم:

  • ممنوع (input): ارکستر انتظار دارد جزئیات سفارش را دریافت کند. orderDetails (مثال: شناسه سفارش ، موارد و غیره) ، paymentDetails (داده های پرداخت) و shippingAddress (آدرس تحویل). به زودی خواهیم دید که چگونه این را ارسال کنیم.
  • ReserveInventory: ابتدا عملکرد فعالیت را صدا می کنیم ReserveInventory عبور از جزئیات سفارش. اگر او برگردد { success: false }، به این معنی است که شما نمی توانید رزرو کنید (شاید سهام کافی). در این حالت ، هیچ فایده ای ندارد – عملکرد در حال حاضر نتیجه خرابی را برمی گرداند و حماسه در همان جا به پایان می رسد. (توجه داشته باشید که قبل از آن هیچ کاری انجام نشده است ، بنابراین ما هنوز نیازی به “خنثی کردن” نداریم.)
  • پردازش فرآیند: اگر سهام با موفقیت محفوظ بود ، ما هزینه پرداخت را با پرداخت هزینه خود رها کردیم ProcessPaymentبشر اگر این مرحله برگردد ، ما جبران سهام را شروع می کنیم: ما تماس می گیریم ReleaseInventory برای انتشار آن سهام که ما رزرو کرده بودیم ، زیرا خرید دیگر اتفاق نمی افتد. سپس به خرابی حماسه خرید بازگشتیم (و هیچ چیز برای امتحان کردن حمل و نقل ، زیرا بدون پرداخت نمی چرخد).
  • برنامه ریزی برنامه ریزی: با پرداخت سهام خوب و رزرو شده ، بیایید محصول را ارسال کنیم! ما تماس می گیریم ScheduleShipping با داده های لازم (ما استفاده می کنیم orderId و شاید آدرس حمل و نقل). اگر برای برخی از zica این مرحله انجام نشود ، باید موارد قبلی را معکوس کنیم: ما تماس می گیریم RefundPayment (پرداخت هزینه پرداخت شده) اشمیه ReleaseInventory (سهام انتشار). سفارش در اینجا اهمیت چندانی ندارد ، اما ما به طور کلی قبل از انتشار سهام ، پرداخت را معکوس می کنیم. سپس ما شکست را برگرداندیم.
  • نهایی سازی: اگر تمام شرایط را بدون بازگشت قبل از آن پشت سر گذاشتید ، این بدان معنی است که رزرو ، پرداخت و حمل و نقل موفقیت آمیز بوده است. سپس یک پیام موفقیت کلی را برگرداندیم. 🎉

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

اکنون که ارکستور “maestro” آماده است ، بیایید توابع فعالیت فردی را تعریف کنیم – هم اقدامات اصلی و هم جبران خسارت.

تعریف فعالیت ها و جبران های حماسه

ما برخی از توابع فعالیت برای ایجاد:

  • ReserveInventory – موارد موجود در انبار را برای سفارش رزرو کنید.
  • ReleaseInventory – جبران خسارت موجودی (ذخیره ذخیره).
  • ProcessPayment – پردازش (مار) پرداخت مشتری.
  • RefundPayment – جبران خسارت (بازپرداخت).
  • ScheduleShipping – ارسال سفارش را برنامه ریزی کنید.

بیایید هرکدام را با کد ببینیم. در اینجا ما منطق را خیلی ساده شبیه سازی خواهیم کرد ، فقط برای تمرکز روی جریان. در یک مورد واقعی ، این توابع با خدمات خارجی ، پایگاه داده ، API های پرداخت و غیره تماس می گیرند.

📦 brezinventory – رزرو محصول موجود در انبار

import { AzureFunction, Context } from "@azure/functions";

const ReserveInventory: AzureFunction = async function (context: Context, orderDetails: any): Promise<{ success: boolean }> {
    context.log(`Reservando estoque para o pedido ${orderDetails.orderId}...`);

    // Simulação de banco de dados de estoque
    const inventory = {
        "item1": 100, // 100 unidades disponíveis
        "item2": 50,  // 50 unidades disponíveis
        "item3": 0,   // 0 unidades disponíveis (sem estoque)
    };

    // Verificando se os itens do pedido estão disponíveis no estoque
    for (let item of orderDetails.items) {
        const availableStock = inventory[item.productId];
        if (availableStock === undefined) {
            context.log(`Item ${item.productId} não encontrado no estoque.`);
            return { success: false };
        }

        if (availableStock < item.quantity) {
            context.log(`Estoque insuficiente para o item ${item.productId}. Disponível: ${availableStock}, Necessário: ${item.quantity}`);
            return { success: false };
        }
    }

    // Simulando a reserva de estoque
    for (let item of orderDetails.items) {
        inventory[item.productId] -= item.quantity;
        context.log(`Reservado ${item.quantity} unidades do item ${item.productId}. Estoque restante: ${inventory[item.productId]}`);
    }

    // Se passou por todas as verificações, consideramos a reserva bem-sucedida
    context.log(`Estoque reservado com sucesso para o pedido ${orderDetails.orderId}`);
    return { success: true };
};

export default ReserveInventory;

حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

این عملکرد دریافت می کند orderDetails (می تواند شناسه محصول ، کمیت و غیره داشته باشد) و رزرو کالا را شبیه سازی می کند. در اینجا ما به سادگی برمی گردیم { success: true } برای نشان دادن موفقیت اگر می خواستیم شکست موجودی را شبیه سازی کنیم ، می توانیم برگردیم { success: false } بسته به برخی شرایط (به عنوان مثال مورد خارج از سهام).

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

♻ ReleaseInventory – انتشار سهام (جبران خسارت)

import { AzureFunction, Context } from "@azure/functions";

const ReleaseInventory: AzureFunction = async function (context: Context, orderDetails: any): Promise<void> {
    context.log(`Liberando estoque do pedido ${orderDetails.orderId} (compensando reserva)...`);

    // Simulação de banco de dados de estoque
    const inventory = {
        "item1": 100, // 100 unidades disponíveis
        "item2": 50,  // 50 unidades disponíveis
        "item3": 0,   // 0 unidades disponíveis (sem estoque)
    };

    // Revertendo a reserva de estoque
    for (let item of orderDetails.items) {
        const availableStock = inventory[item.productId];

        // Verifica se o item existe no estoque
        if (availableStock === undefined) {
            context.log(`Item ${item.productId} não encontrado no estoque.`);
            continue; // Se o item não for encontrado, ignoramos
        }

        // Verifica se a quantidade a ser liberada é válida
        if (item.quantity <= 0) {
            context.log(`Quantidade inválida para o item ${item.productId}. Quantidade: ${item.quantity}`);
            continue; // Se a quantidade for inválida, ignoramos
        }

        // Liberando o estoque
        inventory[item.productId] += item.quantity;
        context.log(`Estoque do item ${item.productId} liberado. Quantidade revertida: ${item.quantity}. Estoque atual: ${inventory[item.productId]}`);
    }

    context.log(`Estoque liberado com sucesso para o pedido ${orderDetails.orderId}`);
};

export default ReleaseInventory;

حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

ای ReleaseInventory فقط در صورت نیاز توسط ارکستر فراخوانی می شود خنثی کردن ذخیره محصول (یعنی خرید دیگر تکمیل نمی شود). او همان را دریافت می کند orderDetails برای اینکه دریابید کدام سفارش/محصول را برای انتشار منتشر کنید و فقط یک ورود به سیستم را برای شبیه سازی این نسخه ایجاد کنید. در یک برنامه واقعی ، در اینجا منطق خواهیم داشت که دوباره سهام را افزایش دهیم.

💳 پردازش پردازش – شارژ مشتری

import { AzureFunction, Context } from "@azure/functions";

const ProcessPayment: AzureFunction = async function (context: Context, paymentDetails: any): Promise<{ success: boolean }> {
    context.log("Processando pagamento do cliente...");

    const { cardNumber, amount } = paymentDetails;

    // Validação de entrada
    if (!cardNumber || cardNumber.length !== 16 || !/^\d+$/.test(cardNumber)) {
        context.log(`Erro: Número de cartão inválido. Card Number: ${cardNumber}`);
        return { success: false };
    }

    if (!amount || amount <= 0) {
        context.log(`Erro: Quantia inválida para o pagamento. Quantia: ${amount}`);
        return { success: false };
    }

    // Aqui seria feita a integração real com o gateway de pagamento (ex: Stripe, PayPal, etc.)
    // Exemplo de integração fictícia com um gateway de pagamento:
    // const paymentGatewayResponse = await callPaymentGateway(paymentDetails);

    // Simulação de sucesso no pagamento
    context.log(`Pagamento de R$ ${amount.toFixed(2)} processado com sucesso com o cartão ${cardNumber.substring(0, 4)}-****-****-${cardNumber.substring(12)}.`);

    // Simulando sempre sucesso no pagamento
    return { success: true };
};

export default ProcessPayment;
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

ای ProcessPayment من از شارژ مشتری مراقبت می کردم. دریافت کردیم paymentDetails (که ممکن است اطلاعات کارت ، ارزش و غیره داشته باشد) و در اینجا ما فقط یک بار موفقیت آمیز را شبیه سازی می کنیم { success: true }بشر اگر می خواستیم به عنوان مثال ، کارت کاهش یافته را شبیه سازی کنیم ، برمی گردیم { success: false }بشر

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

💸 بازپرداخت – پرداخت معکوس (جبران خسارت)

import { AzureFunction, Context } from "@azure/functions";

const RefundPayment: AzureFunction = async function (context: Context, paymentDetails: any): Promise<void> {
    context.log("Estornando pagamento do pedido (compensando pagamento)...");

    const { cardNumber, amount, orderId } = paymentDetails;

    // Validação de entrada
    if (!cardNumber || cardNumber.length !== 16 || !/^\d+$/.test(cardNumber)) {
        context.log(`Erro: Número de cartão inválido. Card Number: ${cardNumber}`);
        return;
    }

    if (!amount || amount <= 0) {
        context.log(`Erro: Quantia inválida para o estorno. Quantia: ${amount}`);
        return;
    }

    if (!orderId) {
        context.log(`Erro: Identificador do pedido não fornecido.`);
        return;
    }

    // Aqui seria feita a integração real com o sistema de pagamento para processar o estorno
    // Exemplo fictício de integração com um gateway de pagamento:
    // const refundResponse = await callRefundGateway(paymentDetails);

    // Simulação de sucesso no estorno
    context.log(`Pagamento de R$ ${amount.toFixed(2)} estornado com sucesso para o pedido ${orderId}.`);
    context.log(`Estorno realizado com o cartão ${cardNumber.substring(0, 4)}-****-****-${cardNumber.substring(12)}.`);

    // Nenhum valor é retornado, pois é um processo de estorno que não requer resposta
};

export default RefundPayment;

حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

ای RefundPayment اگر حماسه نیاز دارد وارد عمل شوید خنثی کردن یک اتهام قبلاً ساخته شده است (به عنوان مثال ، اگر حمل و نقل محصول پس از پرداخت هزینه انجام نشد). او همان را دریافت می کند paymentDetails و خواستار معکوس کردن ارزش کارت مشتری می شود. در شبیه سازی ما فقط یک پیام. نکته مهم این است: این عملکرد نامیده می شود تنها در صورت نیاز به جبران پرداخت.

🚚 برنامه ریزی برنامه ریزی – برنامه ریزی ارسال سفارش

import { AzureFunction, Context } from "@azure/functions";

const ScheduleShipping: AzureFunction = async function (context: Context, shipmentInfo: any): Promise<{ success: boolean }> {
    context.log(`Agendando envio do pedido ${shipmentInfo.orderId}...`);

    // Verificando se as informações necessárias para o agendamento estão presentes
    if (!shipmentInfo.orderId || !shipmentInfo.shippingAddress) {
        context.log("Erro: Informações de envio incompletas.");
        return { success: false };
    }

    // Simulação de integração com API de transportadora
    try {
        // Aqui você chamaria uma API externa de transportadora, por exemplo:
        // const response = await callShippingAPI(shipmentInfo);

        // Simulando a resposta bem-sucedida da transportadora
        const shipmentResponse = {
            trackingNumber: "TRACK123456789",
            estimatedDeliveryDate: "2025-05-10"
        };

        context.log(`Envio agendado com sucesso. Número de rastreamento: ${shipmentResponse.trackingNumber}. Data estimada de entrega: ${shipmentResponse.estimatedDeliveryDate}`);

        return { success: true };
    } catch (error) {
        context.log(`Erro ao agendar o envio: ${error.message}`);
        return { success: false };
    }
};

export default ScheduleShipping;
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

بالاخره ، ScheduleShipping برنامه ریزی حمل و نقل را شبیه سازی می کند. چیزی شبیه به shipmentInfo (در مورد ما ، حاوی orderId و شاید آدرس تحویل) ، و بازگشت { success: true } شبیه سازی اینکه سفارش با موفقیت ارسال شده است. اگر ما به اینجا نادرست برگردیم ، این بدان معنی است که اعزام امکان پذیر نیست (مثلاً اشتباه در شرکت مخابراتی را تصور کنید). در این حالت ، همانطور که در ارکستر ، حماسه دیدیم بازپرداخت بازپرداخت اشمیه آزادسازی بلافاصله

شایان ذکر است: این آخرین مرحله است ، ما یک عملکرد غرامت خاصی برای حمل و نقل نداریم – در صورت عدم موفقیت حمل و نقل ، راه جبران اساساً همه چیز را لغو می کند (معکوس و آزاد کردن سهام). اگر حمل و نقل کار کند ، مأموریت انجام شود ، ما نیازی به خنثی کردن چیزی نداریم.

اکنون که همه کارکردها تعریف شده اند ، بیایید برویم این برنامه را اجرا کنید و حماسه را ببینید!

اجرای همه چیز به صورت محلی

برای اجرای مکان ، بیایید از ابزارهای اصلی Funcentations Azure استفاده کنیم. اگر ساختار پیشنهادی را دنبال کرده اید ، باید یک پروژه عملکرد Azure پیکربندی شده داشته باشید. در غیر این صورت ، خلاصه ای از نحوه ایجاد پروژه و توابع (با استفاده از توابع CLI):

# (Caso ainda não tenha o projeto configurado)
func init minha-saga-compras --typescript
cd minha-saga-compras

# Cria as funções Durable (Orchestrator e Activities)
func new --template "Durable Functions Orchestration" --name OrderOrchestrator
func new --template "Durable Functions Activity" --name ReserveInventory
func new --template "Durable Functions Activity" --name ProcessPayment
func new --template "Durable Functions Activity" --name ScheduleShipping

# (Crie manualmente ou usando o mesmo template as funções de compensação:)
func new --template "Durable Functions Activity" --name ReleaseInventory
func new --template "Durable Functions Activity" --name RefundPayment
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

مشاهده: Azure Functations ابزارهای اصلی برای هر عملکرد برخی از پرونده های پیش فرض تولید می کنند (از جمله function.json برای پیکربندی محرک ها و اتصالات). توابع فعالیت ما از Type Trigger استفاده می کنند فعالیت، و ارکستور از نوع است ارکستراسیونبشر لازم نیست با فایل های JSON به صورت دستی اشتباه بگیرید ، مگر اینکه چیز خاصی را تنظیم کنید. نکته مهم این است که کد ما در بالا در پرونده های صحیح است (OrderOrchestrator/index.tsبا ReserveInventory/index.ts، و غیره ، به عنوان مثال).

قبل از دویدن ، مطمئن شوید که حساب ذخیره سازی پیکربندی شده برای استفاده از Functations Azure (در محل ، ابزارهای اصلی معمولاً از آزوریت به عنوان ذخیره سازی به طور خودکار استفاده می کنند). اگر هنگام اجرا خطای ذخیره سازی به نظر می رسد ، آزوریت را نصب یا چرخانده یا رشته اتصال یک ذخیره واقعی را در آن پیکربندی کنید local.settings.json (کلید "AzureWebJobsStorage").

اکنون ، برای صعود از همه چیز در محلی ، فقط اجرا کنید:

func start
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

این کار زمان اجرا شما را از توابع لاجورد در http: // localhost: 7071 شروع می کند. عملکرد ارکستر عملکرد با دوام به طور پیش فرض یک نقطه پایانی HTTP را برای شروع حماسه در معرض دید قرار می دهد. بیایید یک درخواست برای شروع شبیه سازی خرید ارائه دهیم. شما می توانید از پیچ در ترمینال یا پستچی (یا هر ابزار مشابه) برای ارسال درخواست پست HTTP با JSON حاوی داده سفارش.

مثال با استفاده از CURL (AT Terminal) برای شروع خرید ارکستراسیون:

curl -X POST http://localhost:7071/api/orchestrators/OrderOrchestrator \
  -H "Content-Type: application/json" \
  -d '{
    "orderDetails": { "orderId": "12345", "items": ["item1", "item2"] },
    "paymentDetails": { "cardNumber": "4111111111111111", "amount": 99.90 },
    "shippingAddress": "Rua Exemplo, 123, Cidade XYZ, Brasil"
  }'
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

بیایید این دستور را درک کنیم:

  • ما برای نقطه پایانی استاندارد پست می کنیم /api/orchestrators/OrderOrchestratorبشر این یک روش سریع برای آتش زدن ارکستر عملکرد بادوام بدون نوشتن یک عملکرد HTTP جداگانه است. (در زیر پارچه ها ، عملکردهای بادوام به ایجاد نمونه ای از ارکستور ما اهمیت می دهد.)
  • در بدن (-d) ما JSON را با orderDetailsبا paymentDetails اشمیه shippingAddressبشر می تواند این داده ها را همانطور که می خواهید تنظیم کنید – آنها در متن ما ظاهر می شوند input از ارکستور.
  • ای هدر Content-Type: application/json این مهم است که عملکرد به درستی بدن را دریافت کند.

اگر از Postman استفاده می کنید ، فقط یک درخواست درخواست جدید ایجاد کنید http://localhost:7071/api/orchestrators/OrderOrchestrator، بدن را مانند JSON انتخاب کنید و همان زمینه ها را ارسال کنید.

از جواب چه انتظاری دارید؟

هنگامی که این درخواست را ارسال می کنید ، سرگرمی های بادوام بلافاصله پاسخ http را برمی گردانند 202 پذیرفت با برخی از داده های مربوط به هدر/بدن نشان می دهد که ارکستراسیون شروع شده است (از جمله a نمونه شناسه و URL ها برای مشورت با وضعیت). این امر به این دلیل است که خود پردازش ناهمزمان است – در پس زمینه اتفاق می افتد.

برای ساده کردن آزمایش خود ، می توانیم نظارت کنیم ورود به سیستم کنسول جایی که ما اجرا می کنیم func startبشر در آنجا پیامهایی را که در هر عملکرد قرار داده ایم مشاهده خواهید کرد:

  • باید “موجودی رزرو …” ، سپس “پردازش پرداخت …” ، سپس “برنامه ریزی حمل و نقل …” به نظر برسد.
  • اگر همه چیز خوب پیش رفت ، باید پاسخ نهایی ارکستر نیز ثبت شود. با فراخوانی می توانید نتیجه نهایی را مشاهده کنید نقطه پایانی که پاسخ 202 ارائه می دهد (URL /api/instances/) ، اما بیایید پیچیده نباشیم: در ورود به سیستم می تواند جریان را تحقق بخشد.

به عنوان مثال ، در یک اعدام موفق، شما باید در ورود به سیستم چیزی مانند:

Reservando estoque para o pedido 12345...
Processando pagamento do cliente...
Agendando envio do pedido 12345...
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

و ارکستراسیون با موفقیت به پایان رسید. در حال حاضر در اعدام که ما برخی از شکست ها را شبیه سازی می کنیم (بیایید بگوییم که این کار را کردیم ReserveInventory بازگشت کاذب) ، ورود به سیستم شکست و جبران خسارت را نشان می دهد:

Reservando estoque para o pedido 12345...
** (falha simulada aqui) **
Liberando estoque do pedido 12345 (compensando reserva)...
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

و ارکستور در نهایت علامت گذاری می شود success: false به دلیل عدم موفقیت

نمایش ، درست است؟ شما فقط یک حماسه کامل را به صورت محلی اجرا می کنید!

انتشار بدون لاجورد

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

  1. یک برنامه عملکردی را در لاجورد ایجاد کنید: شما می توانید این کار را از طریق پورتال لاجورد (ایجاد یک ویژگی تفریحی لاجورد) یا از طریق CLI انجام دهید. حتماً یک حساب ذخیره سازی و مواردی از این دست را مرتبط کنید (پورتال معمولاً به طور خودکار انجام می شود). نام برنامه عملکرد را بنویسید (که بخشی از URL خواهد بود).

  2. کد را منتشر کنید: با استفاده از ابزارهای اصلی Funcentations Azure ، ساده است. آرم در حساب لاجورد خود توسط CLI (az login) اگر هنوز این کار را نکرده اید ، و سپس در فهرست پروژه اجرا کنید:

   func azure functionapp publish NOME-DO-SEU-FUNCTIONAPP
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

کجا NOME-DO-SEU-FUNCTIONAPP این نامی است که شما در مرحله 1 انتخاب کرده اید. این فرمان تمام توابع را به لاجورد ارسال می کند. (از طرف دیگر ، می توانید از پسوند Azure در VS Code استفاده کرده و روی “Deploy to Function App” کلیک کنید ، هر آنچه 👍.)

  1. تنظیمات برنامه را پیکربندی کنید (در صورت لزوم): در لاجورد ، توابع به رشته اتصال ذخیره سازی (و هر پیکربندی دیگر) نیاز دارند تنظیمات برنامهبشر معمولاً ، هنگام انتشار ، local.settings.json برای امنیت ارسال نمی شود. بنابراین ، از طریق پورتال لاجورد ، همان کلید را پیکربندی کنید AzureWebJobsStorage با اتصال حساب ذخیره سازی Azure (اگر برنامه عملکرد به طور خودکار آن را گرفتار نشده است). در مثال ما ، ما پیکربندی های خاص دیگری نداریم – مقادیر پیش فرض کافی است.

با این کار ، حماسه Functations شما زنده است! 🌐

آزمایش عملکرد در لاجورد (فر/پستچی)

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

  • در لاجورد ، هر برنامه عملکرد یک URL پایه دریافت می کند: https://.azurewebsites.netبشر
  • نقطه پایانی برای ارکستور مشابه خواهد بود: POST https://.azurewebsites.net/api/orchestrators/OrderOrchestratorبشر

به طور پیش فرض ، توابع موجود در لاجورد به کلید API برای نامگذاری شدن شما می توانید دریافت کنید کلید تابع در پورتال لاجورد (یا سطح AUTH را به عنوان ناشناس در آن پیکربندی کنید function.json از عملکرد httpstart اگر از یکی استفاده می کردید). برای آسانتر کردن آزمایش ، فرض کنیم که عملکرد ارکستراسیون را ناشناس تعریف کرده اید یا کلید را گرفته اید.

در Postman یا Curl ، شما چنین کاری انجام می دهید:

curl -X POST "https://.azurewebsites.net/api/orchestrators/OrderOrchestrator?code=" \
  -H "Content-Type: application/json" \
  -d '{ ... mesmo JSON de antes ... }'
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

اگر همه چیز درست پیکربندی شده باشد ، این 202 پذیرفته شده باز می گردد و ارکستراسیون را در ابر شروع می کند. سپس می توانید وضعیت را از طریق پورتال Azure (در توابع> برنامه عملکرد خود> توابع بادوام> نمونه ها یا استفاده از URL وضعیت ارائه شده در پاسخ) ردیابی کنید.

باز هم ، می توانید سیاهههای مربوط (بینش برنامه یا جریان ورود به سیستم) را بررسی کنید تا توابع توابع اجرا شده به ترتیب را ببینید. خروجی/گسل نهایی حماسه را می توان با مشاوره با نقطه پایانی وضعیت بررسی کرد تا output حاوی ما { success: true/false, message: "..." }بشر

و همین است! حماسه خرید شما در لاجورد ، آماده دریافت نیازهای خرید واقعی (یا به اصطلاح شبیه سازی های ما) است.

نتیجه گیری

در این مقاله ، ما قدم به قدم A می سازیم شبیه سازی فرآیند خرید با استفاده از توابع بادوام لاجورد و استاندارد را پیاده سازی کردیم حماسه به روشی بسیار عملی ما دنباله ای از موجودی رزرو → پرداخت هزینه → حمل و نقل برنامهاطمینان از عدم موفقیت هر مرحله ، موارد قبلی توسط توابع جبران خسارت مربوطه خنثی می شوند. ما دیدیم که چگونه همه چیز را به صورت محلی اجرا کنیم و حتی در Azure منتشر کنیم و عملکرد را از طریق Curl/Postman آزمایش کنیم.

بالکن بزرگ در اینجا این است که درک کند که چگونه سرگرمی های لامپور لاکره زندگی را برای هماهنگی جریان های پیچیده آسان تر می کند: شما اسکریپت فرآیند را بر روی ارکستر (با جبران خسارت) می نویسید و اجازه می دهید که زمان اجرا وضعیت را مدیریت کند ، در صورت عدم موفقیت موقت ، و غیره.

حالا با شماست! 🎮 در مورد بازی با پروژه چطور؟ به عنوان مثال ، می توانید توابع فعالیت را تغییر دهید تا در سناریوهای خاص شکست را برگردانید و حماسه را در عمل مشاهده کنید که همه چیز را خنثی می کند. یا مراحل جدیدی را اضافه کنید (شاید یک ایمیل تأیید در پایان یا یک مرحله از اطلاع رسانی به فروشنده در بازار) و فکر کنید که چه جبران کننده هایی برای آنها لازم است.

احساس راحتی کنید که این مثال را با پرونده استفاده خود کشف و تطبیق دهید. نکته مهم این است کثیف و از یادگیری لذت ببرید. امیدوارم که شما از این سفر آرام در دنیای کارکردهای Duoble و ساگاس لذت برده باشید. هر گونه سؤال یا ایده ، آن را در نظرات dev.to ارسال کنید! 🚀 بورا کدار! خرید مبارک … من می گویم ، کد خوب! 😉

منابع

مایکروسافت یاد بگیرید
وبلاگ Azure Elevate

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا