- بواسطة x32x01 ||
مشكلة غريبة في أنظمة التحويل: لما الـ Notification تسبق الفلوس! 💸
تخيل السيناريو ده 👇
يوصل للعميل إشعار إن الفلوس اتحولت…
بس في الحقيقة:
واحد شايف نفسه بعت… والتاني شايف نفسه متبعتلوش!
المشكلة دي مش نادرة، وبتحصل بسبب تصميم سيستم غلط مش Bug بسيط.
في السيستم ده، لما يحصل Transaction (تحويل فلوس)
الـ Service بتعمل Publish Event
بعد كده يحصل حاجة اسمها Fan-out
يعني الحدث (Event) بيتوزع على كذا Service في نفس الوقت:
UserService → NotificationService → EmailService → Analytics
📌 كله Sequential (واحدة بعد التانية)
مثال بـ Fan-out: كل Service تشتغل في نفس الوقت 🚀
لازم تفرق بين:
اعمل Service مسؤولة عن التحكم في الـ Flow:
خطوات التحويل:
مثال بسيط (Pseudo Code):
📌 كده ضمنت الترتيب + النجاح
👈 لو في فشل = Rollback أو Retry
📌 ده اسمه Fan-in
استخدمه في:
ومتستخدموش في:
💡 افتكر: أي سيستم بيتعامل مع فلوس = لازم يكون Predictable مش Parallel
تخيل السيناريو ده 👇
يوصل للعميل إشعار إن الفلوس اتحولت…
بس في الحقيقة:
- الرصيد لسه متخصمش
- والفلوس موصلتش للطرف التاني
واحد شايف نفسه بعت… والتاني شايف نفسه متبعتلوش!
المشكلة دي مش نادرة، وبتحصل بسبب تصميم سيستم غلط مش Bug بسيط.
السبب الحقيقي: استخدام Fan-out بشكل خاطئ ⚠️
خلينا نبسّط الفكرة 👇في السيستم ده، لما يحصل Transaction (تحويل فلوس)
الـ Service بتعمل Publish Event
بعد كده يحصل حاجة اسمها Fan-out
يعني الحدث (Event) بيتوزع على كذا Service في نفس الوقت:
- Service تبعت Notification 📩
- Service تخصم الرصيد 💰
- Service تزود رصيد الطرف التاني 🔁
ليه Fan-out فكرة قوية؟ 💡
الـ Fan-out Design Pattern له مميزات قوية جدًا:- Performance عالي (كل حاجة بتحصل في نفس الوقت)
- Decoupling (كل Service مستقلة)
- سهل تزود Consumers جديدة
- مناسب جدًا للـ Systems الكبيرة (Scalable)
UserService → NotificationService → EmailService → Analytics
📌 كله Sequential (واحدة بعد التانية)
مثال بـ Fan-out: كل Service تشتغل في نفس الوقت 🚀
طيب فين المشكلة؟ 🤔
المشكلة مش في Fan-out نفسه… المشكلة في استخدامه في مكان غلط1. مفيش Ordering واضح
مفيش ضمان إن:- خصم الرصيد يحصل الأول
- وبعده إضافة الرصيد
- وبعده Notification
❌ ممكن Notification توصل الأول
❌ والفلوس توصل بعد 10 دقايق!
❌ والفلوس توصل بعد 10 دقايق!
2. Debugging بقى كابوس 😵
الـ Flow مش Linear يعني بدل ما تمشي خطوة خطوة:- كل حاجة شغالة في نفس الوقت
- Logs متوزعة في كذا Service
3. مشكلة Duplication
ممكن نفس الـ Event يتبعت مرتين و Consumer يعالجه مرتين❌ يخصم 10,000 مرتين
❌ أو يكرر العملية
❌ أو يكرر العملية
الخطأ الأكبر: استخدام Fan-out في Core Business ❌
التحويلات المالية محتاجة:- Strong Consistency
- ترتيب واضح (Ordering)
- تنفيذ مرة واحدة بس (Exactly Once Execution)
Fan-out مكانه الصح فين؟ ✅
Fan-out ممتاز في الحاجات دي:- Notifications 📩
- Analytics 📊
- Logging 🧾
الحل بدون ما تهد السيستم كله 🔥
مش لازم ترجع لكل حاجة من الأول… تقدر تصلّح التصميم بشكل ذكي 👇1. فصل أنواع الـ Events (Event Separation)
مش كل Event ينفع يتعامل بنفس الطريقةلازم تفرق بين:
- TransactionProcessing → Event داخلي
- TransactionCompleted → Event نهائي
2. استخدام Orchestrator أو Saga Pattern 🎯
بدل العشوائية… خليك منظماعمل Service مسؤولة عن التحكم في الـ Flow:
خطوات التحويل:
- خصم الرصيد
- إضافة الرصيد
- تأكيد العملية
مثال بسيط (Pseudo Code):
JavaScript:
async function transferMoney(sender, receiver, amount) {
await deductBalance(sender, amount);
await creditBalance(receiver, amount);
publishEvent("TransactionCompleted", {
sender,
receiver,
amount
});
} 3. استخدام Fan-in لتجميع النتائج 🧠
بعد ما كل Service تخلص شغلها:- كل واحدة ترجع Status
- الـ Orchestrator يجمع النتائج
👈 لو في فشل = Rollback أو Retry
📌 ده اسمه Fan-in
الخلاصة المهمة جدًا 🎯
لو بتشتغل على سيستم فيه Transactions:❌ متستخدمش Fan-out بشكل مباشر
❌ متسيبش الـ Flow عشوائي
❌ متسيبش الـ Flow عشوائي
✅ استخدم Orchestrator
✅ افصل بين Events
✅ خلّي Notification بعد النجاح فقط
✅ افصل بين Events
✅ خلّي Notification بعد النجاح فقط
قاعدة لازم تتحفظ 🔥
Fan-out ممتاز… بس مش للفلوس!استخدمه في:
✔️ Analytics
✔️ Notifications
✔️ Logging
✔️ Notifications
✔️ Logging
ومتستخدموش في:
❌ Transactions
❌ Payments
❌ أي حاجة محتاجة Consistency عالي
❌ Payments
❌ أي حاجة محتاجة Consistency عالي
النهاية 👇
التصميم الصح مش بس بيحل المشكلة… ده بيمنع مشاكل أكبر بكتير في المستقبل💡 افتكر: أي سيستم بيتعامل مع فلوس = لازم يكون Predictable مش Parallel