Posts

الـ At-Least-Once Delivery في الـ Outbox Pattern وكيفية التعامل معاه

Image
ليه الـ Outbox Pattern ممكن يبعت الرسالة مرتين؟ بالبلدي كده: ليه الـ Outbox Pattern ممكن يبعت الرسالة مرتين؟ 🚚📬 تخيل إنك صاحب محل، وعندك كشكول وتسجل فيه الأوردرات (ده الـ Outbox Table)، وعندك دليفري مهمته ياخد الأوردر من الكشكول ويروح يسلمه للزبون (ده الـ Message Relay / Background Worker). لما حد بيطلب أوردر، أنت بتكتب الأوردر في الكشكول وفي نفس اللحظة بتخصم البضاعة من المخزن في Database Transaction واحدة. ✍️✨ الأوردر كده اتسجل صح ومش هيضيع إطلاقاً. ⚠️ إيه بقى سيناريو المشكلة اللي بيخليها At-Least-Once؟ الدليفري بيمشي بالخطوات دي بالضبط: يشوف الكشكول: يلاقي أوردر مكتوب عليه Pending أو "جديد". 📖 يروح يوصل الأوردر: للزبون (يبعت الرسالة للـ Broker زي RabbitMQ أو Kafka). الزبون استلم الأوردر خلاص! 📦💨 يرجع للمحل يشيّر على الكشكول: إنه تم التوصيل ( Mark as Processed / Published ). 📝✅ السؤال بقى: إيه اللي يحصل لو الدليفري اتعطل بين خطوة 2 وخطوة 3؟ 💥 ...

Optimistic Concurrency vs Locks في SQL Server

  🔒⚡ Optimistic Concurrency vs Locks في SQL Server لما اتنين يعدّلوا نفس الـ Order في نفس الوقت… مين فيهم يكسب؟ 😄 تخيّل معايا إن عندنا متجر إلكتروني اسمه SuperShop 🛒 وعندنا Order بالشكل ده: Order #1001 Status: Pending Total: 1500 SAR وفي نفس اللحظة حصل السيناريو ده: 👨‍💼 أحمد من فريق خدمة العملاء فتح الـ Order. 👩‍💼 منى من فريق العمليات فتحت نفس الـ Order. الاتنين شايفين: Status = Pending أحمد قال: العميل أكد الطلب، خليني أعمله Approved ✅ وفي نفس الوقت منى قالت: العميل طلب إلغاء الطلب، خليني أعمله Cancelled ❌ أحمد ضغط Save الأول. بقت الداتا: Status = Approved بعدها بثانيتين منى ضغطت Save. بقت الداتا: Status = Cancelled وهنا السؤال الخطير 😅: طب تعديل أحمد راح فين؟ 🤨 اتمسح. مش بس اتمسح… ده اتمسح من غير ما أحمد أو منى يعرفوا إن حصل Conflict أصلاً . وده واحد من أشهر مشاكل الـ Concurrency واسمه: 💥 Lost Update ومن هنا تبدأ حكايتنا مع: SQL Server Locks 🔒 Pessimistic Concurrency Optimistic Concurrency ⚡ rowversion EF Core Concurrency Tokens ...

Competing Consumers

🚀 Competing Consumers Pattern باستخدام Redis Streams و .NET Core لما Worker واحد يقولك: «يا جماعة الطلبات كتير عليّا!» 😅 تخيل إن عندك E-Commerce System ، والعميل بيعمل Order جديد. الـ API تعمل شغلها الطبيعي: POST /orders تحفظ الـ Order في الـ Database، وبعد كده محتاج تعمل شوية عمليات تقيلة في الخلفية: 💳 تجهيز عملية الدفع. 📦 تجهيز الـ Order للشحن. 🧾 إنشاء Invoice. 📧 إرسال Confirmation Email. 📊 تحديث Analytics. طبعًا مش منطقي تخلي العميل واقف مستني كل ده يحصل قبل ما الـ API ترجع Response. فأول فكرة ممكن تيجي في دماغنا: Task.Run(async () => { await ProcessOrderAsync(order); }); خلصنا يا باشا 😎 للأسف… لأ. 😄 لأن أول ما السيستم يكبر، وتبدأ تشغل أكتر من Server، وتحصل Restart أو Deployment أو Crash، هتكتشف إننا محتاجين حاجة أقوى بكتير. وهنا بيدخل معانا: ⚡ Competing Consumers Pattern ومعاه: 🔴 Redis Streams + Consumer Groups 🎯 الأول: يعني إيه Competing Consume...
BMC Helix AI Agents — Interview Guide 🤖 BMC Helix AI Agents شرح شامل بالمصري للتحضير للـ Interview 🚀 من أول يعني إيه AI Agent لحد ServiceOps وAIOps والـ11 AI Agents والـEnd-to-End Incident Resolution. 🧠 Agentic AI ⚙️ ServiceOps 📊 AIOps 🎫 ITSM 🚀 DevOps 🧠 أول حاجة: يعني إيه AI Agent؟ أهم نقطة تبدأ بيها إنك ما تخلطش بين Chatbot و AI Agent . 🤖 الـChatbot التقليدي 👤 User يسأل ← 🤖 AI يرد يعني الموضوع غالبًا: Question → Answer 🧠 أما الـAI Agent 👤 User / System ← 🧠 Understand ← 🔍 Analyze ← ...