أكبر كابوس في الـ Microservices هو الـ Distributed Transactions
تخيل user اشترى منتج:
1️⃣ خصمت من محفظته (Payments Service) ✅
2️⃣ نقصت المخزن (Inventory Service) ✅
3️⃣ جيت تكريت الأوردر (Order Service).. الـ Database وقعت!
دلوقتي الuser فلوسه نقصت والمخزن نقص، بس مفيش أوردر! الداتا باظت (Inconsistent).
هنا بقا الحل، الـ Saga Pattern
بما إن الـ 2PC (Two Phase Commit) تقيل وبطيء وبيعمل Lock للـ Database، الـ Saga هي المنقذ، الفكرة ببساطة:
لكل فعل ��د فعل مساوٍ له في المقدار ومضاد له في الاتجاه
في الـ Saga، كل خطوة ناجحة لازم يكون ليها Compensating Transaction (عملية عكسية) جاهزة:
لو خطوة إنشاء الأوردر فشلت ⬅️ السيستم أوتوماتيكياً بيبعت أمر للـ Inventory يرجع القطعة اللي نقصت، وأمر للـ Payment يرجع الفلوس للمحفظة.
بتنفذها إزاي؟ عندك طريقين:
- Choreography:
الخدمات بتكلم بعضها عن طريق Events (زي دومينو، كل واحدة بتحدف اللي بعدها).
- Orchestration:
فيه مدير (Orchestrator) هو اللي بيمشي الليلة وبيقول لمين يشتغل ومين يكنسل لو حصل فشل. (وده الأفضل للعمليات المعقدة).
في الـ Distributed Systems، مفيش حاجة اسمها السيستم مش هيقع. الشطارة إنك تصمم السيستم بحيث لو وقع، يعرف يلم الليلة ويرجع الداتا سليمة (Eventual Consistency).
سؤال لمهندسين الـ Systems 🧐
بتفضلوا الـ Choreography (عشان اللامركزية) ولا الـ Orchestration (عشان السيطرة والـ Monitoring)؟ وليه؟ 👇
In TypeScript, generics let you create components that can work with different types, not just one.
And they can help you write reusable and type-safe code.
In this tutorial, @introvertedbot explains how generics work along with some of their use cases.
https://t.co/O2kHdjOWwH