ซากาและเวิร์กโฟลว์
ประสานกระบวนการที่ทำงานเป็นเวลานาน
ซากาและเวิร์กโฟลว์ เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ