Real-Time WebSockets Course | Build a Live Sports Dashboard with Node.js & PostgreSQL 🚀
https://youtu.be/pbOXOY78dNA
———
#web
https://youtu.be/pbOXOY78dNA
———
#web
YouTube
Real-Time WebSockets Course | Build a Live Sports Dashboard with Node.js & PostgreSQL
Master WebSockets in this crash course, moving from core theory to building a high-frequency "Broadcast Engine." Learn how to ingest data from admin sources or APIs to deliver live match scores, commentary, and ball-by-ball updates to 100,000+ simultaneous…
مصطلحات مهمة في عالم الـ System Design 💯 (٩)
.
.
في البوست اللي فات وصلنا لمرحلة إن الـ Client والـ Server بقوا قادرين يتواصلوا بشكل لحظي باستخدام WebSockets.
وده حل مشكلة مهمة جدًا: إزاي السيرفر يبعت تحديث للـ Client في نفس اللحظة من غير ما الـ Client يفضل يسأل كل شوية "فيه حاجة جديدة؟"
لكن لسه عندنا سيناريو تاني.
إيه اللي يحصل لو Service محتاجة تبلغ Service تانية إن حاجة حصلت؟
مثلًا، لو المستخدم دفع أونلاين، نظام الدفع محتاج يبلغ الـ Backend بتاعنا إن عملية الدفع نجحت.
هل هنفضل نعمل Requests كل شوية ونسأل: "الدفع نجح ولا لا؟"
مش أفضل حل.
———
📌 Webhooks
الـ Webhook فكرته بسيطة جدًا.
بدل ما أنت تفضل تسأل Service تانية إذا حصل Event جديد، بتديها URL عندك، وتقول لها: "لما الحدث ده يحصل، ابعتيلي Request هنا."
خلينا ناخد مثال واضح.
لو المستخدم دفع عن طريق Stripe، بدل ما النظام بتاعك يفضل يسأل Stripe كل شوية:
"الدفع نجح؟"
منصة Stripe نفسها تبعتلك HTTP POST Request على الـ Webhook URL بتاعك أول ما عملية الدفع تنجح.
وده بيوفر Requests كتير وبيخلي التواصل بين الأنظمة أكثر كفاءة.
لكن تخيل إن التطبيق بقى كبير جدًا.
بدل ما يكون عندك Service واحدة، بقى عندك مجموعة Services زي الـ Payments و Orders و Inventory Shipping و Notifications...
هل منطقي كل الوظائف دي تفضل داخل نفس التطبيق وتتواصل مع بعض بشكل مباشر؟
———
📌 Microservices
في البداية، ممكن تبني التطبيق كله كـ Monolith.
يعني كل الخدمات اللي فوق دي تبقى موجودة في تطبيق واحد.
وده مش شيء سيئ، بالعكس، الـ Monolith ممكن يكون اختيار ممتاز جدًا لتطبيق صغير أو في بداية المشروع.
لكن مع نمو التطبيق، الكود بيكبر، والـ Dependencies بين الأجزاء بتزيد، وأي تغيير في جزء من النظام ممكن يأثر على أجزاء تانية.
فممكن نبدأ نقسم التطبيق إلى Services أصغر.
مثلًا:
• الـ Payment Service مسؤولة عن الدفع.
• الـ Order Service مسؤولة عن الأوردرات.
• الـ Inventory Service مسؤولة عن المخزون.
• الـ Notification Service مسؤولة عن الإشعارات.
كل Service تبقى مسؤولة عن جزء واضح من النظام، وتقدر تطور فيها وتعمل لها Deploy وتعمل لها Scaling بشكل مستقل.
لكن هنا تظهر مشكلة جديدة.
لو عندي عشرات الـ Services، وكل Service محتاجة تتواصل مع Service تانية، هل كل واحدة هتفضل تبعت HTTP Request للتانية وتستنى الرد؟
ممكن، لكن مش كل العمليات محتاجة Response فوري.
وأحيانًا لو Service واحدة بطيئة أو واقعة، مش منطقي نخلي باقي النظام كله يستناها.
وده بالضبط اللي بيخلينا نحتاج Message Queues.
———
📌 Message Queues
تخيل إن المستخدم عمل Checkout.
دلوقتي فيه كذا حاجة ممكن تحصل:
لازم نعمل Payment، ونحدّث Inventory، ونبعت Notification، وممكن نبدأ تجهيز الـ Shipping.
هل لازم الـ Order Service تستنى كل الخدمات دي تخلص واحدة واحدة قبل ما ترد على المستخدم؟
مش بالضرورة.
ممكن بدل كده تحط Message في Queue وتقول:
"فيه Order جديد محتاج يتعالج."
الـ Queue تحتفظ بالرسالة، والـ Service المسؤولة عن تنفيذ المهمة تاخدها لما تكون جاهزة.
يعني عندنا طرف بيبعت الرسالة اسمه Producer، وطرف بيستقبلها ويعالجها اسمه Consumer.
الميزة هنا إن الـ Services مش لازم تكون مرتبطة ببعض بشكل مباشر.
لو الـ Payment Service مشغولة، الرسائل تفضل في الـ Queue لحد ما تقدر تعالجها.
ولو حصل ضغط كبير، ممكن تزود عدد الـ Consumers علشان تعالج عدد أكبر من الرسائل في نفس الوقت.
وده بيخلي النظام Scalable و Fault Tolerant، وبيفصل الـ Services عن بعض بشكل أفضل.
من أشهر الأدوات اللي بتستخدم للفكرة دي Kafka و RabbitMQ و Amazon SQS.
———
💡 الخلاصة
النهارده عرفنا إزاي الـ Services المختلفة ممكن تتواصل مع بعض من غير ما كل حاجة تبقى مرتبطة بشكل مباشر:
• الـ Webhooks: الـ Service تبعتلك Notification لما Event معين يحصل، بدل ما تفضل تسألها كل شوية.
• الـ Microservices: تقسيم التطبيق الكبير إلى Services أصغر، كل واحدة مسؤولة عن جزء محدد.
• الـ Message Queues: وسيط بيخلي الـ Services تتواصل بشكل Asynchronous، بحيث الـ Producer يحط الرسالة والـ Consumer يعالجها لما يكون جاهز.
———
دلوقتي عندنا نظام فيه Services كتير، والـ Message Queue ساعدتنا نفصل بينهم ونمنع الضغط من الانتقال من Service للتانية.
لكن إيه اللي هيحصل لو Client بدأ يبعت آلاف الـ Requests في الثانية على الـ Public APIs بتاعتنا؟
هل هنسيبه يبعت براحتـه؟
أكيد لا.
وده اللي هنتكلم عنه في البوست الجاي مع Rate Limiting و API Gateway ونتعرف على مصطلح Idempotency.
———
#system_design
.
.
في البوست اللي فات وصلنا لمرحلة إن الـ Client والـ Server بقوا قادرين يتواصلوا بشكل لحظي باستخدام WebSockets.
وده حل مشكلة مهمة جدًا: إزاي السيرفر يبعت تحديث للـ Client في نفس اللحظة من غير ما الـ Client يفضل يسأل كل شوية "فيه حاجة جديدة؟"
لكن لسه عندنا سيناريو تاني.
إيه اللي يحصل لو Service محتاجة تبلغ Service تانية إن حاجة حصلت؟
مثلًا، لو المستخدم دفع أونلاين، نظام الدفع محتاج يبلغ الـ Backend بتاعنا إن عملية الدفع نجحت.
هل هنفضل نعمل Requests كل شوية ونسأل: "الدفع نجح ولا لا؟"
مش أفضل حل.
———
📌 Webhooks
الـ Webhook فكرته بسيطة جدًا.
بدل ما أنت تفضل تسأل Service تانية إذا حصل Event جديد، بتديها URL عندك، وتقول لها: "لما الحدث ده يحصل، ابعتيلي Request هنا."
خلينا ناخد مثال واضح.
لو المستخدم دفع عن طريق Stripe، بدل ما النظام بتاعك يفضل يسأل Stripe كل شوية:
"الدفع نجح؟"
منصة Stripe نفسها تبعتلك HTTP POST Request على الـ Webhook URL بتاعك أول ما عملية الدفع تنجح.
وده بيوفر Requests كتير وبيخلي التواصل بين الأنظمة أكثر كفاءة.
لكن تخيل إن التطبيق بقى كبير جدًا.
بدل ما يكون عندك Service واحدة، بقى عندك مجموعة Services زي الـ Payments و Orders و Inventory Shipping و Notifications...
هل منطقي كل الوظائف دي تفضل داخل نفس التطبيق وتتواصل مع بعض بشكل مباشر؟
———
📌 Microservices
في البداية، ممكن تبني التطبيق كله كـ Monolith.
يعني كل الخدمات اللي فوق دي تبقى موجودة في تطبيق واحد.
وده مش شيء سيئ، بالعكس، الـ Monolith ممكن يكون اختيار ممتاز جدًا لتطبيق صغير أو في بداية المشروع.
لكن مع نمو التطبيق، الكود بيكبر، والـ Dependencies بين الأجزاء بتزيد، وأي تغيير في جزء من النظام ممكن يأثر على أجزاء تانية.
فممكن نبدأ نقسم التطبيق إلى Services أصغر.
مثلًا:
• الـ Payment Service مسؤولة عن الدفع.
• الـ Order Service مسؤولة عن الأوردرات.
• الـ Inventory Service مسؤولة عن المخزون.
• الـ Notification Service مسؤولة عن الإشعارات.
كل Service تبقى مسؤولة عن جزء واضح من النظام، وتقدر تطور فيها وتعمل لها Deploy وتعمل لها Scaling بشكل مستقل.
لكن هنا تظهر مشكلة جديدة.
لو عندي عشرات الـ Services، وكل Service محتاجة تتواصل مع Service تانية، هل كل واحدة هتفضل تبعت HTTP Request للتانية وتستنى الرد؟
ممكن، لكن مش كل العمليات محتاجة Response فوري.
وأحيانًا لو Service واحدة بطيئة أو واقعة، مش منطقي نخلي باقي النظام كله يستناها.
وده بالضبط اللي بيخلينا نحتاج Message Queues.
———
📌 Message Queues
تخيل إن المستخدم عمل Checkout.
دلوقتي فيه كذا حاجة ممكن تحصل:
لازم نعمل Payment، ونحدّث Inventory، ونبعت Notification، وممكن نبدأ تجهيز الـ Shipping.
هل لازم الـ Order Service تستنى كل الخدمات دي تخلص واحدة واحدة قبل ما ترد على المستخدم؟
مش بالضرورة.
ممكن بدل كده تحط Message في Queue وتقول:
"فيه Order جديد محتاج يتعالج."
الـ Queue تحتفظ بالرسالة، والـ Service المسؤولة عن تنفيذ المهمة تاخدها لما تكون جاهزة.
يعني عندنا طرف بيبعت الرسالة اسمه Producer، وطرف بيستقبلها ويعالجها اسمه Consumer.
الميزة هنا إن الـ Services مش لازم تكون مرتبطة ببعض بشكل مباشر.
لو الـ Payment Service مشغولة، الرسائل تفضل في الـ Queue لحد ما تقدر تعالجها.
ولو حصل ضغط كبير، ممكن تزود عدد الـ Consumers علشان تعالج عدد أكبر من الرسائل في نفس الوقت.
وده بيخلي النظام Scalable و Fault Tolerant، وبيفصل الـ Services عن بعض بشكل أفضل.
من أشهر الأدوات اللي بتستخدم للفكرة دي Kafka و RabbitMQ و Amazon SQS.
———
💡 الخلاصة
النهارده عرفنا إزاي الـ Services المختلفة ممكن تتواصل مع بعض من غير ما كل حاجة تبقى مرتبطة بشكل مباشر:
• الـ Webhooks: الـ Service تبعتلك Notification لما Event معين يحصل، بدل ما تفضل تسألها كل شوية.
• الـ Microservices: تقسيم التطبيق الكبير إلى Services أصغر، كل واحدة مسؤولة عن جزء محدد.
• الـ Message Queues: وسيط بيخلي الـ Services تتواصل بشكل Asynchronous، بحيث الـ Producer يحط الرسالة والـ Consumer يعالجها لما يكون جاهز.
———
دلوقتي عندنا نظام فيه Services كتير، والـ Message Queue ساعدتنا نفصل بينهم ونمنع الضغط من الانتقال من Service للتانية.
لكن إيه اللي هيحصل لو Client بدأ يبعت آلاف الـ Requests في الثانية على الـ Public APIs بتاعتنا؟
هل هنسيبه يبعت براحتـه؟
أكيد لا.
وده اللي هنتكلم عنه في البوست الجاي مع Rate Limiting و API Gateway ونتعرف على مصطلح Idempotency.
———
#system_design
❤3
مصطلحات مهمة في عالم الـ System Design 💯 (١٠)
.
.
في البوست اللي فات تكلمنا عن Microservices وإزاي الـ Message Queues بتساعد الـ Services تتواصل مع بعض من غير ما كل Service تستنى التانية.
وده حل مشكلة مهمة داخل النظام.
لكن لسه عندنا مشكلة من ناحية تانية...
إحنا قسمنا النظام، وزودنا الـ Services، وخلينا التواصل بينهم مرن وسهل.
طيب إيه اللي هيحصل لو المستخدم نفسه بدأ يبعت عدد ضخم جدًا من الـ Requests؟
أو Bot قرر يضرب الـ API بتاعنا بآلاف الطلبات في الثانية؟
لو مفيش أي قيود، ممكن عدد بسيط من الـ Clients يستهلك معظم موارد النظام ويأثر على باقي المستخدمين.
———
📌 Rate Limiting
الـ Rate Limiting فكرته ببساطة إننا بنحدد عدد الـ Requests اللي Client معين يقدر يبعتها خلال فترة زمنية.
مثلًا، ممكن نقول إن كل User مسموح له بـ 100 Request في الدقيقة.
لو عدى الحد ده، الـ API يرفض الـ Requests الزيادة مؤقتًا ويرجع غالبًا:
HTTP 429 - Too Many Requests
ليه ده مهم؟
تخيل إن عندك API بتعمل Search، وفجأة User واحد أو Bot بدأ يبعت آلاف الـ Requests كل ثانية.
من غير Rate Limiting، الـ Requests دي ممكن تستهلك الـ CPU والـ Memory والـ Database Connections، وفي النهاية تأثر على كل المستخدمين.
فـ Rate Limiting مش بس وسيلة للحماية من الـ Abuse، لكنه كمان بيساعدنا نحافظ على استقرار النظام ونضمن إن الموارد متوزعة بشكل عادل.
لكن هنا ممكن تسأل...
هل لازم كل Service في النظام تعمل Rate Limiting بنفسها؟
مع وجود عشرات الـ APIs والـ Microservices، الموضوع هيبقى معقد.
———
📌 API Gateway
تخيل إن عندك نظام كبير فيه Services كتير:
- Users Service
- Orders Service
- Payments Service
- Notifications Service
بدل ما الـ Client يعرف كل Service موجودة فين ويتعامل معاها بشكل مباشر، ممكن نخلي فيه نقطة دخول واحدة قدام النظام كله.
النقطة دي اسمها API Gateway.
الـ Client يبعت الـ Request للـ Gateway، والـ Gateway يقرر يعمل إيه.
ممكن يتأكد إن المستخدم authenticated، يطبق Rate Limiting، يسجل الـ Request، وبعدها يوجهه للـ Service المناسبة.
يعني مثلًا:
Client → API Gateway → Orders Service
أو:
Client → API Gateway → Payment Service
وبكده الـ Client مش محتاج يعرف تفاصيل النظام الداخلية كلها.
والـ Gateway كمان بيكون مكان مناسب لتطبيق سياسات مشتركة على كل الـ APIs، زي Authentication وRate Limiting وLogging وRouting.
لكن لسه فيه مشكلة ممكن تحصل حتى مع وجود كل الحماية دي.
تخيل إن المستخدم ضغط زرار Pay، والـ Request وصل فعلًا للـ Payment Service...
لكن حصل Network Error قبل ما المستخدم يستلم الـ Response.
المستخدم مش عارف العملية نجحت ولا لا، فيضغط Pay تاني.
دلوقتي عندنا نفس العملية اتبعتت مرتين.
هل من الطبيعي إن المستخدم يتخصم منه الفلوس مرتين؟
———
📌 Idempotency
الـ Idempotency معناها إن تكرار نفس الـ Request أكتر من مرة ميغيرش النتيجة النهائية عن لو الـ Request اتنفذ مرة واحدة.
وده مهم جدًا في العمليات الحساسة زي الدفع وإنشاء الأوردرات.
خلينا نرجع لمثال الدفع.
المستخدم ضغط Pay، والـ Payment Service بدأت العملية.
لكن الـ Response ضاع بسبب مشكلة في الشبكة.
المستخدم ضغط تاني.
لو الـ System بيتعامل مع الـ Requests كأنهم عمليتين مختلفتين، ممكن يحصل Double Payment.
لكن لو الـ Request الأول كان مرتبط بـ Idempotency Key زي:
payment_12345
لما الـ Request التاني يوصل بنفس الـ Key، النظام يقدر يعرف إن العملية دي اتنفذت قبل كده.
بدل ما ينفذها مرة تانية، يرجع نفس النتيجة السابقة.
وبكده حتى لو حصل Retry أو المستخدم ضغط الزرار أكتر من مرة، العملية نفسها متتنفذش مرتين.
وده سبب إن الـ Idempotency مهمة جدًا في Distributed Systems، لأن الـ Network Failures والـ Retries حاجات طبيعية بتحصل في الأنظمة الموزعة.
———
💡 الخلاصة
النهارده وصلنا لآخر 3 مفاهيم في السلسلة:
• الـ Rate Limiting: تحديد عدد الـ Requests المسموح بيها خلال فترة معينة، علشان نحمي النظام من الـ Abuse والضغط الزائد.
• الـ API Gateway: نقطة دخول واحدة بتتعامل مع Requests قبل ما توصل للـ Microservices، وبتساعد في Authentication وRate Limiting وRouting وغيرها.
• الـ Idempotency: ضمان إن تكرار نفس الـ Request ميكررش تنفيذ العملية أكتر من مرة.
وبكده نكون تكلمنا عن أهم أجزاء الـ System Design، من أول الـ Client والـ Server، لحد الـ Databases والـ Caching والـ Microservices والـ Message Queues، ووصلنا في النهاية لحماية الـ APIs والتعامل مع الـ Retries.
———
#system_design
.
.
في البوست اللي فات تكلمنا عن Microservices وإزاي الـ Message Queues بتساعد الـ Services تتواصل مع بعض من غير ما كل Service تستنى التانية.
وده حل مشكلة مهمة داخل النظام.
لكن لسه عندنا مشكلة من ناحية تانية...
إحنا قسمنا النظام، وزودنا الـ Services، وخلينا التواصل بينهم مرن وسهل.
طيب إيه اللي هيحصل لو المستخدم نفسه بدأ يبعت عدد ضخم جدًا من الـ Requests؟
أو Bot قرر يضرب الـ API بتاعنا بآلاف الطلبات في الثانية؟
لو مفيش أي قيود، ممكن عدد بسيط من الـ Clients يستهلك معظم موارد النظام ويأثر على باقي المستخدمين.
———
📌 Rate Limiting
الـ Rate Limiting فكرته ببساطة إننا بنحدد عدد الـ Requests اللي Client معين يقدر يبعتها خلال فترة زمنية.
مثلًا، ممكن نقول إن كل User مسموح له بـ 100 Request في الدقيقة.
لو عدى الحد ده، الـ API يرفض الـ Requests الزيادة مؤقتًا ويرجع غالبًا:
HTTP 429 - Too Many Requests
ليه ده مهم؟
تخيل إن عندك API بتعمل Search، وفجأة User واحد أو Bot بدأ يبعت آلاف الـ Requests كل ثانية.
من غير Rate Limiting، الـ Requests دي ممكن تستهلك الـ CPU والـ Memory والـ Database Connections، وفي النهاية تأثر على كل المستخدمين.
فـ Rate Limiting مش بس وسيلة للحماية من الـ Abuse، لكنه كمان بيساعدنا نحافظ على استقرار النظام ونضمن إن الموارد متوزعة بشكل عادل.
لكن هنا ممكن تسأل...
هل لازم كل Service في النظام تعمل Rate Limiting بنفسها؟
مع وجود عشرات الـ APIs والـ Microservices، الموضوع هيبقى معقد.
———
📌 API Gateway
تخيل إن عندك نظام كبير فيه Services كتير:
- Users Service
- Orders Service
- Payments Service
- Notifications Service
بدل ما الـ Client يعرف كل Service موجودة فين ويتعامل معاها بشكل مباشر، ممكن نخلي فيه نقطة دخول واحدة قدام النظام كله.
النقطة دي اسمها API Gateway.
الـ Client يبعت الـ Request للـ Gateway، والـ Gateway يقرر يعمل إيه.
ممكن يتأكد إن المستخدم authenticated، يطبق Rate Limiting، يسجل الـ Request، وبعدها يوجهه للـ Service المناسبة.
يعني مثلًا:
Client → API Gateway → Orders Service
أو:
Client → API Gateway → Payment Service
وبكده الـ Client مش محتاج يعرف تفاصيل النظام الداخلية كلها.
والـ Gateway كمان بيكون مكان مناسب لتطبيق سياسات مشتركة على كل الـ APIs، زي Authentication وRate Limiting وLogging وRouting.
لكن لسه فيه مشكلة ممكن تحصل حتى مع وجود كل الحماية دي.
تخيل إن المستخدم ضغط زرار Pay، والـ Request وصل فعلًا للـ Payment Service...
لكن حصل Network Error قبل ما المستخدم يستلم الـ Response.
المستخدم مش عارف العملية نجحت ولا لا، فيضغط Pay تاني.
دلوقتي عندنا نفس العملية اتبعتت مرتين.
هل من الطبيعي إن المستخدم يتخصم منه الفلوس مرتين؟
———
📌 Idempotency
الـ Idempotency معناها إن تكرار نفس الـ Request أكتر من مرة ميغيرش النتيجة النهائية عن لو الـ Request اتنفذ مرة واحدة.
وده مهم جدًا في العمليات الحساسة زي الدفع وإنشاء الأوردرات.
خلينا نرجع لمثال الدفع.
المستخدم ضغط Pay، والـ Payment Service بدأت العملية.
لكن الـ Response ضاع بسبب مشكلة في الشبكة.
المستخدم ضغط تاني.
لو الـ System بيتعامل مع الـ Requests كأنهم عمليتين مختلفتين، ممكن يحصل Double Payment.
لكن لو الـ Request الأول كان مرتبط بـ Idempotency Key زي:
payment_12345
لما الـ Request التاني يوصل بنفس الـ Key، النظام يقدر يعرف إن العملية دي اتنفذت قبل كده.
بدل ما ينفذها مرة تانية، يرجع نفس النتيجة السابقة.
وبكده حتى لو حصل Retry أو المستخدم ضغط الزرار أكتر من مرة، العملية نفسها متتنفذش مرتين.
وده سبب إن الـ Idempotency مهمة جدًا في Distributed Systems، لأن الـ Network Failures والـ Retries حاجات طبيعية بتحصل في الأنظمة الموزعة.
———
💡 الخلاصة
النهارده وصلنا لآخر 3 مفاهيم في السلسلة:
• الـ Rate Limiting: تحديد عدد الـ Requests المسموح بيها خلال فترة معينة، علشان نحمي النظام من الـ Abuse والضغط الزائد.
• الـ API Gateway: نقطة دخول واحدة بتتعامل مع Requests قبل ما توصل للـ Microservices، وبتساعد في Authentication وRate Limiting وRouting وغيرها.
• الـ Idempotency: ضمان إن تكرار نفس الـ Request ميكررش تنفيذ العملية أكتر من مرة.
وبكده نكون تكلمنا عن أهم أجزاء الـ System Design، من أول الـ Client والـ Server، لحد الـ Databases والـ Caching والـ Microservices والـ Message Queues، ووصلنا في النهاية لحماية الـ APIs والتعامل مع الـ Retries.
———
#system_design
❤2
Forwarded from DevJobs
2027 Software Engineering Internship & New Grad Positions 🚀
https://github.com/speedyapply/2027-SWE-College-Jobs
https://github.com/speedyapply/2027-SWE-College-Jobs
GitHub
GitHub - speedyapply/2027-SWE-College-Jobs: 2027 SWE internship & new graduate job list updated daily
2027 SWE internship & new graduate job list updated daily - speedyapply/2027-SWE-College-Jobs