0Pricing
C# Academy · บทเรียน

ซากาและเวิร์กโฟลว์

ประสานกระบวนการที่ทำงานเป็นเวลานาน

ซากาและเวิร์กโฟลว์ เป็นบทเรียน C# Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C# Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน

การประสานกระบวนการทำงานระยะยาว

กระบวนการทางธุรกิจบางอย่างครอบคลุมหลายข้อความและหลายขั้นตอนที่เกิดขึ้นต่อเนื่องตามเวลา เช่น วางคำสั่งซื้อ เรียกเก็บเงิน สำรองสินค้า และจัดส่ง ซากาจะประสานกระบวนการทำงานระยะยาวเช่นนี้และติดตามสถานะของกระบวนการผ่านข้อความต่าง ๆ

ซากาคืออะไร

ซากาคือตัวรับข้อความที่มีสถานะ ซากาจะเชื่อมโยงข้อความที่เกี่ยวข้อง เก็บสถานะปัจจุบันของกระบวนการ และตอบสนองต่อเหตุการณ์ด้วยการเปลี่ยนจากสถานะหนึ่งไปยังอีกสถานะหนึ่งจนกว่ากระบวนการจะเสร็จสมบูรณ์

ซากาแบบเครื่องจักรสถานะ

MassTransit จำลองซากาเป็นเครื่องจักรสถานะโดยใช้ MassTransitStateMachine คุณกำหนดสถานะ เหตุการณ์ และการเปลี่ยนสถานะในรูปแบบประกาศ

dotnet add package MassTransit
// state machine sagas are built in

สถานะของซากา

สถานะคือคลาสที่ใช้งาน SagaStateMachineInstance โดยมี CorrelationId รวมถึงข้อมูลใด ๆ ที่คุณจำเป็นต้องจดจำระหว่างขั้นตอนต่าง ๆ

public class OrderState : SagaStateMachineInstance
{
    public Guid CorrelationId { get; set; }
    public string CurrentState { get; set; }
    public decimal Amount { get; set; }
}

การประกาศสถานะและเหตุการณ์

ภายในเครื่องจักรสถานะ คุณประกาศพร็อพเพอร์ตี State และพร็อพเพอร์ตี Event ที่เชื่อมโยงกับชนิดข้อความ

public class OrderSaga : MassTransitStateMachine<OrderState>
{
    public State AwaitingPayment { get; private set; }
    public State Completed { get; private set; }
    public Event<OrderPlaced> OrderPlaced { get; private set; }
    public Event<PaymentReceived> PaymentReceived { get; private set; }
}

การเชื่อมโยง

เหตุการณ์ทุกเหตุการณ์ต้องเชื่อมโยงกับอินสแตนซ์ซากาที่ถูกต้อง โดยปกติจะใช้รหัสร่วมกัน เช่น OrderId วิธีนี้จะกำหนดเส้นทางข้อความขาเข้าไปยังกระบวนการที่กำลังทำงานถูกต้อง

Event(() => PaymentReceived, e =>
    e.CorrelateById(m => m.Message.OrderId));

การกำหนดการเปลี่ยนสถานะ

ตัวสร้างจะเชื่อมโยงลักษณะการทำงานต่าง ๆ เข้าด้วยกัน เหตุการณ์เริ่มต้นจะสร้างอินสแตนซ์ เก็บข้อมูล และเปลี่ยนไปยังสถานะถัดไป

Initially(
    When(OrderPlaced)
        .Then(ctx => ctx.Saga.Amount = ctx.Message.Amount)
        .TransitionTo(AwaitingPayment));

การตอบสนองภายในสถานะ

ใช้ During เพื่อจัดการเหตุการณ์ที่ใช้ได้เฉพาะในสถานะหนึ่ง จากนั้นเผยแพร่ข้อความถัดไปและเปลี่ยนไปยังสถานะถัดไป

During(AwaitingPayment,
    When(PaymentReceived)
        .Publish(ctx => new OrderConfirmed(ctx.Saga.CorrelationId))
        .TransitionTo(Completed)
        .Finalize());

การจัดเก็บสถานะซากา

สถานะซากาต้องคงอยู่แม้ระบบเริ่มทำงานใหม่ จึงจัดเก็บไว้ในที่เก็บข้อมูล เช่น เอนทิตีเฟรมเวิร์ก MongoDB เรดิส หรือระบบอื่น ๆ MassTransit จะโหลดและบันทึกอินสแตนซ์รอบการจัดการข้อความแต่ละรายการ

x.AddSagaStateMachine<OrderSaga, OrderState>()
    .EntityFrameworkRepository(r =>
    {
        r.ExistingDbContext<OrderDbContext>();
    });

ระยะหมดเวลาด้วยกำหนดการ

ซากาสามารถกำหนดระยะหมดเวลาได้ เช่น ยกเลิกหากไม่ได้รับการชำระเงินภายใน 30 นาที โดยใช้ Schedule จากนั้นจัดการเหตุการณ์หมดเวลาเพื่อดำเนินการชดเชย

การชดเชย

หากขั้นตอนภายหลังล้มเหลว ซากาสามารถดำเนินการชดเชยเพื่อย้อนกลับการดำเนินการก่อนหน้า เช่น คืนเงินที่เรียกเก็บหรือคืนสินค้าเข้าสู่คลัง ทำให้กระบวนการโดยรวมยังคงสอดคล้องกันโดยไม่ต้องใช้ธุรกรรมแบบกระจาย

ตรวจสอบอย่างรวดเร็ว

ทดสอบซากาและกระบวนการทำงาน

สรุป

ซากาประสานกระบวนการทำงานระยะยาวในฐานะตัวรับข้อความที่มีสถานะและมีการเชื่อมโยง MassTransit ใช้ MassTransitStateMachine พร้อมสถานะที่เป็น SagaStateMachineInstance สมาชิก State/Event ที่ประกาศไว้ การเชื่อมโยงด้วยรหัส และการเปลี่ยนสถานะผ่าน Initially/During สถานะจะถูกจัดเก็บในที่เก็บข้อมูล ระยะหมดเวลาใช้กำหนดการ และการชดเชยจะย้อนกลับขั้นตอนก่อนหน้าเมื่อเกิดความล้มเหลว

คำถามที่พบบ่อย

บทเรียน “ซากาและเวิร์กโฟลว์” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ซากาและเวิร์กโฟลว์” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C# Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ซากาและเวิร์กโฟลว์”

ประสานกระบวนการที่ทำงานเป็นเวลานาน คุณปฏิบัติ C# Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C# Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน C# Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “ซากาและเวิร์กโฟลว์” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C# Academy นี้ได้ไหม

ได้ บทเรียน C# Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. แนวคิดการส่งข้อความ
  2. การผลิตและการใช้ข้อความ
  3. ซากาและเวิร์กโฟลว์
  4. การจัดการข้อผิดพลาดและการลองใหม่
← กลับไปที่ C# Academy