ميكروسيرفيسات بلغة C#: هندسة معمارية وممارسة متقدمة

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

ميكروسيرفيسات بلغة C#: هندسة معمارية وممارسة متقدمة



الانتقال من البنية المتجانسة إلى بنية الميكروسيرفيسات على منصة .NET ليس مجرد قرار تقني، بل خطوة استراتيجية نحو قابلية التوسع وتحمل الأخطاء. ومع ذلك، على المستوى المتقدم، يواجه المطورون مشاكل غير تقليدية: المعاملات الموزعة، تناسق البيانات، والتنسيق المعقد. في هذا المقال، سنحلل الأنماط المعمارية التي ستساعد في بناء نظام بيئي موثوق للميكروسيرفيسات بلغة C#، وسنستعرض أمثلة عملية على الكود.



1. نمط Saga: إدارة المعاملات الموزعة



في الميكروسيرفيسات، المعاملات التقليدية ACID غير ممكنة. يحل نمط Saga مشكلة تناسق البيانات عن طريق تقسيم العملية الشاملة إلى سلسلة من المعاملات المحلية مع إجراءات تعويضية.



التصميم التنسيقي (Choreography) مقابل التنسيق المركزي (Orchestration):

  • التصميم التنسيقي (Choreography) — كل خدمة تنشر الأحداث وتستجيب لها. مناسب للسيناريوهات البسيطة.
  • التنسيق المركزي (Orchestration) — منسق مركزي (Orchestrator) يدير الخطوات. يُوصى به للعمليات التجارية المعقدة.


مثال على تطبيق المنسق المركزي بلغة C# باستخدام MassTransit:



public class OrderSaga : MassTransitStateMachine<OrderSagaState>{    public State Submitted { get; set; }    public State PaymentPending { get; set; }    public State Completed { get; set; }

public Event<OrderSubmitted> OrderSubmitted { get; set; } public Event<PaymentProcessed> PaymentProcessed { get; set; } public Event<PaymentFailed> PaymentFailed { get; set; }

public OrderSaga() { InstanceState(x => x.CurrentState);

Initially( When(OrderSubmitted) .Then(context => context.Saga.OrderId = context.Message.OrderId) .TransitionTo(Submitted) .Publish(context => new ProcessPayment { OrderId = context.Saga.OrderId, Amount = context.Message.Amount }) );

During(Submitted, When(PaymentProcessed) .TransitionTo(Completed) .Finalize(), When(PaymentFailed) .Then(context => Console.WriteLine("التعويض: إلغاء الطلب")) .TransitionTo(Final) ); }}


يوضح هذا الكود كيف يدير المنسق المركزي دورة حياة الطلب: عند نجاح الدفع، تنتهي الـ Saga، وعند حدوث خطأ، يتم تشغيل التعويض.



2. CQRS و Event Sourcing: فصل المسؤوليات



نمط CQRS (Command Query Responsibility Segregation) يفصل الأوامر (الكتابة) عن الاستعلامات (القراءة) إلى نماذج مختلفة. بالاقتران مع Event Sourcing (ES)، يوفر تدقيقًا كاملاً ومرونة.



هندسة CQRS+ES:

  • الأوامر (Commands) — تغير الحالة من خلال الأحداث.
  • الأحداث (Events) — تُخزّن في مخزن الأحداث (Event Store) (مثل EventStoreDB).
  • الإسقاطات (Projections) — تبني نماذج القراءة (read-models) للاستعلامات السريعة.


مثال على أمر ومعالج:



public class CreateOrderCommand : ICommand{    public Guid OrderId { get; set; }    public decimal Amount { get; set; }}

public class CreateOrderHandler : ICommandHandler<CreateOrderCommand>{ private readonly IEventStore _eventStore;

public async Task Handle(CreateOrderCommand command) { var orderCreated = new OrderCreatedEvent { OrderId = command.OrderId, Amount = command.Amount, Timestamp = DateTime.UtcNow };

await _eventStore.AppendEventAsync( $"order-{command.OrderId}", orderCreated ); }

المدونات

توصيات الكتب