Forwarded from DataBase قواعد بيانات (Pro. Anwar Al-saiary)
الدكتور أحمد بالخير... المدير العام و القائد العزيز لشركتنا 🤍
https://youtu.be/ioJQ1qp3Bmk?si=3PbwcwXvTEc0k6cH
https://youtu.be/ioJQ1qp3Bmk?si=3PbwcwXvTEc0k6cH
YouTube
ثورة الإدارة الصحية: كيف تُعيد أنظمة (HMS) تشكيل مستقبل الرعاية؟
يسعدنا في هذه الحلقة أن نستضيف أحد أبرز القيادات الوطنية في مجال التحول الرقمي الصحي،
الدكتور أحمد بن محمد بلخير، هو طبيب اطفال ومتخصص في المعلوماتية الصحية، متميز في الإبداع والابتكار التقني،
رائد في بناء وتطوير منظومة الصحة الرقمية في المملكة العربية السعودية،…
الدكتور أحمد بن محمد بلخير، هو طبيب اطفال ومتخصص في المعلوماتية الصحية، متميز في الإبداع والابتكار التقني،
رائد في بناء وتطوير منظومة الصحة الرقمية في المملكة العربية السعودية،…
https://pub.dev/packages/smart_pagination
- smart_pagination مكتبة Flutter جاهزة للـ pagination مع إدارة حالة مدمجة بنمط BLoC.
- تدعم أكثر من 6 أنواع عرض: ListView, GridView, PageView, StaggeredGrid, ReorderableListView وغيرها مع نفس الـ API.
- توفر معالجة أخطاء متقدمة مع 6 ستايلات Widgets جاهزة، وحالات منفصلة لأول صفحة ولتحميل المزيد، مع دعم إعادة المحاولة اليدوية والتلقائية.
- تدعم REST APIs وStreams (real-time) مع استراتيجيات مختلفة للـ pagination (offset, cursor, lazy loading, smart preloading) وتحسينات أداء للذاكرة.
- قابلة للتخصيص بدرجة كبيرة في الـ UI، مع دعم أنواع Generics، وفلاترة server/client side، وأكثر من 60 اختبار لضمان الاستقرار.
- smart_pagination مكتبة Flutter جاهزة للـ pagination مع إدارة حالة مدمجة بنمط BLoC.
- تدعم أكثر من 6 أنواع عرض: ListView, GridView, PageView, StaggeredGrid, ReorderableListView وغيرها مع نفس الـ API.
- توفر معالجة أخطاء متقدمة مع 6 ستايلات Widgets جاهزة، وحالات منفصلة لأول صفحة ولتحميل المزيد، مع دعم إعادة المحاولة اليدوية والتلقائية.
- تدعم REST APIs وStreams (real-time) مع استراتيجيات مختلفة للـ pagination (offset, cursor, lazy loading, smart preloading) وتحسينات أداء للذاكرة.
- قابلة للتخصيص بدرجة كبيرة في الـ UI، مع دعم أنواع Generics، وفلاترة server/client side، وأكثر من 60 اختبار لضمان الاستقرار.
Dart packages
smart_pagination | Flutter package
Powerful Flutter pagination library with built-in BLoC state management, 6+ view types (ListView, GridView, PageView, StaggeredGrid, ReorderableListView, Column, Row, Custom), advanced error handling [...]
هذه قائمة مختصرة بأشهر مكتبات Flutter مع وصف قصير + رابط الباكج + التوثيق الخاص بها:
🧠 إدارة الحالة (State Management)
1. provider – أبسط حل شهير لإدارة الحالة يعتمد على InheritedWidget ويوفّر Dependency Injection بشكل أنيق.
Package: https://pub.dev/packages/provider
Docs: https://pub.dev/documentation/provider/latest
2. flutter_riverpod – إطار حديث لإدارة الحالة، Reactive، يدعم async بسهولة، وقوي جدًا للمشاريع المتوسطة والكبيرة.
Package: https://pub.dev/packages/flutter_riverpod
Docs: https://riverpod.dev/docs
3. flutter_bloc – Widgets جاهزة لتطبيق نمط BLoC مع فصل واضح بين الـ UI والـ Business Logic.
Package: https://pub.dev/packages/flutter_bloc
Docs: https://bloclibrary.dev
🌐 الشبكات (Networking / APIs)
4. dio – HTTP Client قوي يدعم Interceptors, FormData, Upload/Download, Timeout، وإلغاء الطلبات.
Package: https://pub.dev/packages/dio
Docs: https://pub.dev/documentation/dio/latest
5. http – مكتبة رسمية بسيطة لاستهلاك REST APIs، مناسبة للحالات الخفيفة أو عند رغبتك في شيء minimal.
Package: https://pub.dev/packages/http
Docs: https://pub.dev/documentation/http/latest
🧭 التوجيه (Routing & Navigation)
6. go_router – Router declarative مبني على Navigation 2.0 مع دعم deep links وURL-based navigation.
Package: https://pub.dev/packages/go_router
Docs: https://pub.dev/documentation/go_router/latest
💾 التخزين المحلي (Local Storage / Persistence)
7. shared_preferences – لتخزين بيانات بسيطة (key-value) مثل الإعدادات وحالة تسجيل الدخول.
Package: https://pub.dev/packages/shared_preferences
Docs: https://pub.dev/documentation/shared_preferences/latest
8. hive – NoSQL key-value DB خفيف وسريع بدون الحاجة لـ SQL، مع تشفير AES-256.
Package: https://pub.dev/packages/hive
Docs: https://pub.dev/documentation/hive/latest
9. sqflite – أشهر Plugin لـ SQLite في Flutter، يدعم transactions وbatches وإدارة نسخ قاعدة البيانات.
Package: https://pub.dev/packages/sqflite
Docs: https://pub.dev/documentation/sqflite/latest
10. drift – مكتبة Persistence Reactive فوق SQLite، توفر type-safe SQL + stream queries + دعم isolates.
Package: https://pub.dev/packages/drift
Docs: https://drift.simonbinder.eu/docs
🛠 أدوات عامة وواجهات (Utilities & UI Helpers)
11. url_launcher – لفتح الروابط في المتصفح، الاتصال الهاتفي، إرسال SMS أو بريد من داخل التطبيق.
Package: https://pub.dev/packages/url_launcher
Docs: https://pub.dev/documentation/url_launcher/latest
12. cached_network_image – تحميل صور من الإنترنت مع كاش تلقائي + Placeholder وError Widget.
Package: https://pub.dev/packages/cached_network_image
Docs: https://pub.dev/documentation/cached_network_image/latest
13. intl – تنسيقات التاريخ والأرقام والـ localization (ترجمة الرسائل، plurals، إلخ).
Package: https://pub.dev/packages/intl
Docs: https://pub.dev/documentation/intl/latest
🔥 Firebase Integration
14. firebase_core – الأساس لربط تطبيقك بـ Firebase، يجب تهيئته قبل استخدام أي Firebase plugin آخر.
Package: https://pub.dev/packages/firebase_core
Docs: https://firebase.google.com/docs/flutter/setup
15. cloud_firestore – Plugin للتعامل مع Cloud Firestore (NoSQL Realtime DB مع offline support).
Package: https://pub.dev/packages/cloud_firestore
Docs: https://firebase.flutter.dev/docs/firestore/overview
🧠 إدارة الحالة (State Management)
1. provider – أبسط حل شهير لإدارة الحالة يعتمد على InheritedWidget ويوفّر Dependency Injection بشكل أنيق.
Package: https://pub.dev/packages/provider
Docs: https://pub.dev/documentation/provider/latest
2. flutter_riverpod – إطار حديث لإدارة الحالة، Reactive، يدعم async بسهولة، وقوي جدًا للمشاريع المتوسطة والكبيرة.
Package: https://pub.dev/packages/flutter_riverpod
Docs: https://riverpod.dev/docs
3. flutter_bloc – Widgets جاهزة لتطبيق نمط BLoC مع فصل واضح بين الـ UI والـ Business Logic.
Package: https://pub.dev/packages/flutter_bloc
Docs: https://bloclibrary.dev
🌐 الشبكات (Networking / APIs)
4. dio – HTTP Client قوي يدعم Interceptors, FormData, Upload/Download, Timeout، وإلغاء الطلبات.
Package: https://pub.dev/packages/dio
Docs: https://pub.dev/documentation/dio/latest
5. http – مكتبة رسمية بسيطة لاستهلاك REST APIs، مناسبة للحالات الخفيفة أو عند رغبتك في شيء minimal.
Package: https://pub.dev/packages/http
Docs: https://pub.dev/documentation/http/latest
🧭 التوجيه (Routing & Navigation)
6. go_router – Router declarative مبني على Navigation 2.0 مع دعم deep links وURL-based navigation.
Package: https://pub.dev/packages/go_router
Docs: https://pub.dev/documentation/go_router/latest
💾 التخزين المحلي (Local Storage / Persistence)
7. shared_preferences – لتخزين بيانات بسيطة (key-value) مثل الإعدادات وحالة تسجيل الدخول.
Package: https://pub.dev/packages/shared_preferences
Docs: https://pub.dev/documentation/shared_preferences/latest
8. hive – NoSQL key-value DB خفيف وسريع بدون الحاجة لـ SQL، مع تشفير AES-256.
Package: https://pub.dev/packages/hive
Docs: https://pub.dev/documentation/hive/latest
9. sqflite – أشهر Plugin لـ SQLite في Flutter، يدعم transactions وbatches وإدارة نسخ قاعدة البيانات.
Package: https://pub.dev/packages/sqflite
Docs: https://pub.dev/documentation/sqflite/latest
10. drift – مكتبة Persistence Reactive فوق SQLite، توفر type-safe SQL + stream queries + دعم isolates.
Package: https://pub.dev/packages/drift
Docs: https://drift.simonbinder.eu/docs
🛠 أدوات عامة وواجهات (Utilities & UI Helpers)
11. url_launcher – لفتح الروابط في المتصفح، الاتصال الهاتفي، إرسال SMS أو بريد من داخل التطبيق.
Package: https://pub.dev/packages/url_launcher
Docs: https://pub.dev/documentation/url_launcher/latest
12. cached_network_image – تحميل صور من الإنترنت مع كاش تلقائي + Placeholder وError Widget.
Package: https://pub.dev/packages/cached_network_image
Docs: https://pub.dev/documentation/cached_network_image/latest
13. intl – تنسيقات التاريخ والأرقام والـ localization (ترجمة الرسائل، plurals، إلخ).
Package: https://pub.dev/packages/intl
Docs: https://pub.dev/documentation/intl/latest
🔥 Firebase Integration
14. firebase_core – الأساس لربط تطبيقك بـ Firebase، يجب تهيئته قبل استخدام أي Firebase plugin آخر.
Package: https://pub.dev/packages/firebase_core
Docs: https://firebase.google.com/docs/flutter/setup
15. cloud_firestore – Plugin للتعامل مع Cloud Firestore (NoSQL Realtime DB مع offline support).
Package: https://pub.dev/packages/cloud_firestore
Docs: https://firebase.flutter.dev/docs/firestore/overview
Dart packages
provider | Flutter package
A wrapper around InheritedWidget to make them easier to use and more reusable.
هذه مكتبة اخرى.. اليوم سربنا عمل اشهر.
يمكنك الاطلاع على مثال حي عن المكتبة على الرابط:
https://geniussystems24.github.io/smart_pagination/
🚀 إذا عندك قوائم بيانات كبيرة في Flutter وتريد Pagination نظيف وسريع بدون وجع رأس…
جرّب مكتبة smart_pagination — حل جاهز للإنتاج ويختصر عليك وقت كثير.
✅ Zero Boilerplate: شغّل الـ Pagination بأقل كود.
🧩 7 Widget Classes جاهزة: ListView / GridView / PageView / StaggeredGrid / ReorderableList / Column / Row.
⚡️ Smart Preloading: تحميل تلقائي قبل ما المستخدم يوصل لآخر القائمة.
🔴 تدعم Futures + Streams + دمج Streams للـ Real-time.
⚠️ Error Handling متقدم: 6 ستايلات جاهزة للأخطاء مع فصل حالة أول صفحة عن “Load More”.
🎛 Built-in BLoC/Cubit + عمليات بيانات برمجية (add/remove/update/clear) بسهولة.
⏰ Data Age & Expiration: تحديث تلقائي للبيانات (مفيد للـ Global Cubits).
🔍 SmartSearchBox: Overlay ذكي + تموضع تلقائي + تنقّل بالكيبورد.
✨ تخصيص كامل للتصميم + Type-safe Generics + ThemeExtension للـ Light/Dark.
🔗 https://pub.dev/packages/smart_pagination
يمكنك الاطلاع على مثال حي عن المكتبة على الرابط:
https://geniussystems24.github.io/smart_pagination/
🚀 إذا عندك قوائم بيانات كبيرة في Flutter وتريد Pagination نظيف وسريع بدون وجع رأس…
جرّب مكتبة smart_pagination — حل جاهز للإنتاج ويختصر عليك وقت كثير.
✅ Zero Boilerplate: شغّل الـ Pagination بأقل كود.
🧩 7 Widget Classes جاهزة: ListView / GridView / PageView / StaggeredGrid / ReorderableList / Column / Row.
⚡️ Smart Preloading: تحميل تلقائي قبل ما المستخدم يوصل لآخر القائمة.
🔴 تدعم Futures + Streams + دمج Streams للـ Real-time.
⚠️ Error Handling متقدم: 6 ستايلات جاهزة للأخطاء مع فصل حالة أول صفحة عن “Load More”.
🎛 Built-in BLoC/Cubit + عمليات بيانات برمجية (add/remove/update/clear) بسهولة.
⏰ Data Age & Expiration: تحديث تلقائي للبيانات (مفيد للـ Global Cubits).
🔍 SmartSearchBox: Overlay ذكي + تموضع تلقائي + تنقّل بالكيبورد.
✨ تخصيص كامل للتصميم + Type-safe Generics + ThemeExtension للـ Light/Dark.
🔗 https://pub.dev/packages/smart_pagination
👍2
هذه مكتبة اخرى..
يمكنك الاطلاع على مثال حي عن المكتبة على الرابط:
https://geniussystems24.github.io/super_dialog
✨ مكتبة super_dialog لـ Flutter — لو تبغى Dialogs “فخمة” بحركات سلسة وجاهزة للاستخدام.
🎬 توفر 6 أنماط أنيميشن جاهزة: Slide من كل الاتجاهات + Scale + Fade (مع دعم RTL).
📍 تدعم Positioned Dialogs: تفتح الديالوج في 9 مواقع بالشاشة (شبكة 3×3) مع تحكم ببداية/نهاية الحركة.
🧩 فيها 7 أنواع انتقالات (Slide / Fade / Scale / Mix) لنتائج شكلها احترافي.
⚙️ إعدادات مرنة: مدة الحركة، Curves، لون الـ Barrier، Blur، قيود الحجم، SafeArea… إلخ.
🧠 API بسيط ومريح للمطور + Generics + Callbacks لدورة حياة الديالوج + بدون Dependencies إضافية.
📱 فيها Dialog تكيفي حسب المنصة (مثل iOS ستايل Bottom Sheet).
🧪 مرفق Demo و Example لتجربة السيناريوهات المختلفة مباشرة.
🌍 شغالة على Android / iOS / Web / Windows / macOS / Linux.
🔗 جرّبها من هنا: https://pub.dev/packages/super_dialog
يمكنك الاطلاع على مثال حي عن المكتبة على الرابط:
https://geniussystems24.github.io/super_dialog
✨ مكتبة super_dialog لـ Flutter — لو تبغى Dialogs “فخمة” بحركات سلسة وجاهزة للاستخدام.
🎬 توفر 6 أنماط أنيميشن جاهزة: Slide من كل الاتجاهات + Scale + Fade (مع دعم RTL).
📍 تدعم Positioned Dialogs: تفتح الديالوج في 9 مواقع بالشاشة (شبكة 3×3) مع تحكم ببداية/نهاية الحركة.
🧩 فيها 7 أنواع انتقالات (Slide / Fade / Scale / Mix) لنتائج شكلها احترافي.
⚙️ إعدادات مرنة: مدة الحركة، Curves، لون الـ Barrier، Blur، قيود الحجم، SafeArea… إلخ.
🧠 API بسيط ومريح للمطور + Generics + Callbacks لدورة حياة الديالوج + بدون Dependencies إضافية.
📱 فيها Dialog تكيفي حسب المنصة (مثل iOS ستايل Bottom Sheet).
🧪 مرفق Demo و Example لتجربة السيناريوهات المختلفة مباشرة.
🌍 شغالة على Android / iOS / Web / Windows / macOS / Linux.
🔗 جرّبها من هنا: https://pub.dev/packages/super_dialog
👍1
🚀 مكتبة Flutter رهيبة اسمها super_interactive_text 👇
تخلي أي نص في تطبيقك “ذكي” ويتحوّل تلقائيًا لعناصر قابلة للنقر ✅
🔗 روابط (URL)
📧 إيميلات
📞 أرقام هاتف
#️⃣ هاشتاقات
@️⃣ منشن (username)
🌐 وحتى روابط منصّات التواصل + دعم روابط داخلية للتنقّل داخل التطبيق
مفيدة جدًا لتطبيقات الدردشة، التعليقات، الوصف، أو أي مكان فيه نصوص كثيرة 💬✨
🌐 رابط المثال التجريبي: https://geniussystems24.github.io/super_interactive_text/
📦 رابط المكتبة: https://pub.dev/packages/super_interactive_text
#Flutter #Dart #OpenSource #MobileDev #UI #DeveloperTools
تخلي أي نص في تطبيقك “ذكي” ويتحوّل تلقائيًا لعناصر قابلة للنقر ✅
🔗 روابط (URL)
📧 إيميلات
📞 أرقام هاتف
#️⃣ هاشتاقات
@️⃣ منشن (username)
🌐 وحتى روابط منصّات التواصل + دعم روابط داخلية للتنقّل داخل التطبيق
مفيدة جدًا لتطبيقات الدردشة، التعليقات، الوصف، أو أي مكان فيه نصوص كثيرة 💬✨
🌐 رابط المثال التجريبي: https://geniussystems24.github.io/super_interactive_text/
📦 رابط المكتبة: https://pub.dev/packages/super_interactive_text
#Flutter #Dart #OpenSource #MobileDev #UI #DeveloperTools
https://geniussystems24.github.io/tooltip_card/#/animations
احدى مكاتب الـ Flutter التي استغرق بناءه وتطويرها وقت ليس بالقليل.. وكان سبب بناءها تسهيل واجهات المستخدم في نظام شركتنا #GeniusLink.
🔥 مكتبة tooltip_card لـ Flutter: Tooltip/Popover احترافية مستوحاة من Fluent TeachingTip وتدعم Material 3 و RTL.
✅ مناسبة لشرح العناصر داخل التطبيق بشكل جميل وواضح.
🧠 تموضع ذكي حول العنصر (12 اتجاه) لتفادي خروجها من الشاشة.
➡️ تدعم سهم/Beak قابل للتخصيص لتحديد الهدف بدقة.
👆 تريجرات متعددة: Tap / Hover / Double-tap حسب تجربة المستخدم.
🎛 تحكم كامل عبر Controller (فتح/إغلاق برمجياً بسهولة).
✨ تخصيص عالي للشكل: ألوان، حواف، ظل، ومسافات.
📦 جرّبها : <https://pub.dev/packages/tooltip_card>
احدى مكاتب الـ Flutter التي استغرق بناءه وتطويرها وقت ليس بالقليل.. وكان سبب بناءها تسهيل واجهات المستخدم في نظام شركتنا #GeniusLink.
🔥 مكتبة tooltip_card لـ Flutter: Tooltip/Popover احترافية مستوحاة من Fluent TeachingTip وتدعم Material 3 و RTL.
✅ مناسبة لشرح العناصر داخل التطبيق بشكل جميل وواضح.
🧠 تموضع ذكي حول العنصر (12 اتجاه) لتفادي خروجها من الشاشة.
➡️ تدعم سهم/Beak قابل للتخصيص لتحديد الهدف بدقة.
👆 تريجرات متعددة: Tap / Hover / Double-tap حسب تجربة المستخدم.
🎛 تحكم كامل عبر Controller (فتح/إغلاق برمجياً بسهولة).
✨ تخصيص عالي للشكل: ألوان، حواف، ظل، ومسافات.
📦 جرّبها : <https://pub.dev/packages/tooltip_card>
هل صادفت شاشة منتجات “تفلاش” بيانات ناقصة… ثم تبدأ الطلبات تتكرر على الـ API بدون سبب؟
في MyApp واجهنا سيناريو شائع في Local-First داخل الـ SDK:
عند عرض Product List، كل منتج يحتاج Reference Data: Section / Unit / Manufacturer.
لكن عند انتهاء TTL تصبح البيانات Stale.
⚠️ المشكلة (The Blind Spot)
بدون سياق مزامنة مثل since أو lastSentAt، الـ SDK لا يعرف ما تغيّر فعلاً → يلجأ إلى Blind Full Fetch (Get All).
🔥 النتيجة
Redundant API Calls + High Server Load + Poor UX + نفس الداتا تُرسل مراراً.
✅ الحل
Delta/Incremental Sync + إرسال since = lastSentAt عند إعادة الطلب،
مع نافذة منع تكرار (10 دقائق) + (اختياري) Stale-While-Revalidate،
ومع ضغط UI العالي: Single-Flight / In-Flight Deduplication.
هل تستخدمون updatedSince / ETag / lastSyncAt في مشاريعكم؟
شرح الحل في المنشورات القادمة
#API #MobileArchitecture #DistributedSystems
في MyApp واجهنا سيناريو شائع في Local-First داخل الـ SDK:
عند عرض Product List، كل منتج يحتاج Reference Data: Section / Unit / Manufacturer.
لكن عند انتهاء TTL تصبح البيانات Stale.
⚠️ المشكلة (The Blind Spot)
بدون سياق مزامنة مثل since أو lastSentAt، الـ SDK لا يعرف ما تغيّر فعلاً → يلجأ إلى Blind Full Fetch (Get All).
🔥 النتيجة
Redundant API Calls + High Server Load + Poor UX + نفس الداتا تُرسل مراراً.
✅ الحل
Delta/Incremental Sync + إرسال since = lastSentAt عند إعادة الطلب،
مع نافذة منع تكرار (10 دقائق) + (اختياري) Stale-While-Revalidate،
ومع ضغط UI العالي: Single-Flight / In-Flight Deduplication.
هل تستخدمون updatedSince / ETag / lastSyncAt في مشاريعكم؟
شرح الحل في المنشورات القادمة
#API #MobileArchitecture #DistributedSystems
حل مشكلة “الطلبات المكررة” في Reference Data بطريقة أبسط وأذكى داخل MyApp ✅
بدل ما الـ SDK يعيد جلب كل شيء عند انتهاء TTL أو عند تكرار فتح الشاشة، طبقنا 3 أفكار مع بعض:
1) Delta Sync (Incremental Updates)
كل مرة نطلب فقط التغييرات عبر:
?since=lastSentAt
يعني: “أعطني ما تغيّر منذ آخر مزامنة ناجحة” بدل Full Fetch.
2) Throttle Window (مثلاً 10 دقائق)
لو المستخدم أعاد فتح الشاشة أو كرر نفس الطلب خلال 10 دقائق:
لا نرسل API Call جديد → نكتفي بالمحلي.
وبعد انتهاء النافذة نسمح بطلب Delta جديد.
3) Stale-While-Revalidate (SWR)
نعرض البيانات المحلية فوراً (حتى لو قديمة قليلاً) ونحدّث بصمت في الخلفية.
النتيجة: تجربة أسرع بدون “فلاش” بيانات ناقصة.
📌 النتيجة النهائية:
Optimized Network ✅
Low Server Load ✅
Fast & Fluid UX ✅
Tiny Delta Payload بدل Massive Payload ✅
هل تستخدمون lastSyncAt / lastSentAt أو Delta Sync في مشاريعكم؟
#API #MobileArchitecture #DistributedSystems
بدل ما الـ SDK يعيد جلب كل شيء عند انتهاء TTL أو عند تكرار فتح الشاشة، طبقنا 3 أفكار مع بعض:
1) Delta Sync (Incremental Updates)
كل مرة نطلب فقط التغييرات عبر:
?since=lastSentAt
يعني: “أعطني ما تغيّر منذ آخر مزامنة ناجحة” بدل Full Fetch.
2) Throttle Window (مثلاً 10 دقائق)
لو المستخدم أعاد فتح الشاشة أو كرر نفس الطلب خلال 10 دقائق:
لا نرسل API Call جديد → نكتفي بالمحلي.
وبعد انتهاء النافذة نسمح بطلب Delta جديد.
3) Stale-While-Revalidate (SWR)
نعرض البيانات المحلية فوراً (حتى لو قديمة قليلاً) ونحدّث بصمت في الخلفية.
النتيجة: تجربة أسرع بدون “فلاش” بيانات ناقصة.
📌 النتيجة النهائية:
Optimized Network ✅
Low Server Load ✅
Fast & Fluid UX ✅
Tiny Delta Payload بدل Massive Payload ✅
هل تستخدمون lastSyncAt / lastSentAt أو Delta Sync في مشاريعكم؟
#API #MobileArchitecture #DistributedSystems
مشكلة شائعة في Local-First: “Race Condition” تسبّب رحلات API مكررة 🚨
تخيّل شاشة Product List تُرندر عدة عناصر في نفس اللحظة (Product A / B / C…).
كل منتج يحتاج نفس الـ Reference Data مثل: Section #4.
الـ SDK يعمل Local-First → يفحص Local DB (Cache) أولاً.
⚠️ أين المشكلة؟
لأن الطلبات متزامنة، الجميع يصلون للكاش قبل أن يكتب أول طلب النتيجة:
Local DB = MISS (Not Found Yet)
فيقوم كل منتج بإطلاق طلب شبكة مستقل لنفس البيانات…
فتتحول العملية إلى 20+ طلب متطابق قبل أن يكتمل الأول.
🔥 الأثر على الخلفية (Backend)
- High Concurrency Load
- Wasted Bandwidth
- Risk of Rate Limiting
- UX أبطأ بسبب ازدحام الشبكة
🧠 المصطلحات الشائعة
- Cache Stampede / Thundering Herd
- Race Condition (In Local-First Cache)
- Redundant API Calls (وأحياناً تُرى كـ N+1 / Over-fetching حسب السياق)
✅ كيف نعالجها عادة؟
- Single-Flight / In-Flight Deduplication: “طلب واحد لكل مفتاح” والبقية تنتظر نفس الـ Future/Promise
- Request Coalescing: تجميع الطلبات المتطابقة
- (اختياري) Prefetch/Batch للـ Reference Data عند تحميل المنتجات
هل واجهت هذا السيناريو في تطبيقك؟ وكيف تعاملت معه؟
الحل في المنشورات القادمة
#API #MobileArchitecture #DistributedSystems
تخيّل شاشة Product List تُرندر عدة عناصر في نفس اللحظة (Product A / B / C…).
كل منتج يحتاج نفس الـ Reference Data مثل: Section #4.
الـ SDK يعمل Local-First → يفحص Local DB (Cache) أولاً.
⚠️ أين المشكلة؟
لأن الطلبات متزامنة، الجميع يصلون للكاش قبل أن يكتب أول طلب النتيجة:
Local DB = MISS (Not Found Yet)
فيقوم كل منتج بإطلاق طلب شبكة مستقل لنفس البيانات…
فتتحول العملية إلى 20+ طلب متطابق قبل أن يكتمل الأول.
🔥 الأثر على الخلفية (Backend)
- High Concurrency Load
- Wasted Bandwidth
- Risk of Rate Limiting
- UX أبطأ بسبب ازدحام الشبكة
🧠 المصطلحات الشائعة
- Cache Stampede / Thundering Herd
- Race Condition (In Local-First Cache)
- Redundant API Calls (وأحياناً تُرى كـ N+1 / Over-fetching حسب السياق)
✅ كيف نعالجها عادة؟
- Single-Flight / In-Flight Deduplication: “طلب واحد لكل مفتاح” والبقية تنتظر نفس الـ Future/Promise
- Request Coalescing: تجميع الطلبات المتطابقة
- (اختياري) Prefetch/Batch للـ Reference Data عند تحميل المنتجات
هل واجهت هذا السيناريو في تطبيقك؟ وكيف تعاملت معه؟
الحل في المنشورات القادمة
#API #MobileArchitecture #DistributedSystems
حل “الطلبات المتزامنة المكررة” في Local-First: Request Coalescing (Single-flight) ✅
المشهد معروف:
شاشة Product List تُرندر عدة منتجات في نفس اللحظة (Product A / B / C…)
وكلهم يحتاجون نفس الـ Reference Data مثل: Get Section #4.
بدون حل، كلهم يطلقون API Calls متطابقة قبل ما يكتمل أول طلب ويكتب للكاش.
🧠 الحل: SDK Request Coordinator (In-flight Map)
نضيف طبقة داخل الـ SDK تعمل كـ “مُنسّق طلبات”:
- تحتفظ بخريطة: Map<Key, Future>
- المفتاح = (Section#4)
- القيمة = Shared Future (طلب جاري)
كيف يعمل؟
1) أول طلب (Product A):
- لا يجد المفتاح في الـ In-flight Map
- ينشئ Shared Future
- ويرسل 1x API Request فقط
2) الطلبات التالية (Product B / C…):
- تجد Shared Future موجودة
- لا تُنشئ طلبات جديدة
- فقط “تنتظر” نفس الطلب الجاري (Await existing in-flight request)
📦 عند وصول النتيجة
- يتم كتابة البيانات إلى Local DB (Cache) ✔️
- يتم توزيع نفس النتيجة فوراً لكل عناصر UI المنتظرة (Fan-out) ✔️
📌 النتيجة
- 1x Optimized API Request بدل 20x Duplicate Requests
- Minimal Backend Load
- Fast & Consistent UX
- Cache يُملأ مرة واحدة ويُستخدم للجميع
🔎 مصطلحات مرتبطة
- Request Coalescing
- Single-flight Mechanism
- In-flight Deduplication
- Shared Future / Promise
- (وأحياناً يُستخدم كـ Lock per Key)
هل تطبّقون Single-flight في الـ SDK أو على مستوى Repository Layer؟
#API #MobileArchitecture #DistributedSystems
المشهد معروف:
شاشة Product List تُرندر عدة منتجات في نفس اللحظة (Product A / B / C…)
وكلهم يحتاجون نفس الـ Reference Data مثل: Get Section #4.
بدون حل، كلهم يطلقون API Calls متطابقة قبل ما يكتمل أول طلب ويكتب للكاش.
🧠 الحل: SDK Request Coordinator (In-flight Map)
نضيف طبقة داخل الـ SDK تعمل كـ “مُنسّق طلبات”:
- تحتفظ بخريطة: Map<Key, Future>
- المفتاح = (Section#4)
- القيمة = Shared Future (طلب جاري)
كيف يعمل؟
1) أول طلب (Product A):
- لا يجد المفتاح في الـ In-flight Map
- ينشئ Shared Future
- ويرسل 1x API Request فقط
2) الطلبات التالية (Product B / C…):
- تجد Shared Future موجودة
- لا تُنشئ طلبات جديدة
- فقط “تنتظر” نفس الطلب الجاري (Await existing in-flight request)
📦 عند وصول النتيجة
- يتم كتابة البيانات إلى Local DB (Cache) ✔️
- يتم توزيع نفس النتيجة فوراً لكل عناصر UI المنتظرة (Fan-out) ✔️
📌 النتيجة
- 1x Optimized API Request بدل 20x Duplicate Requests
- Minimal Backend Load
- Fast & Consistent UX
- Cache يُملأ مرة واحدة ويُستخدم للجميع
🔎 مصطلحات مرتبطة
- Request Coalescing
- Single-flight Mechanism
- In-flight Deduplication
- Shared Future / Promise
- (وأحياناً يُستخدم كـ Lock per Key)
هل تطبّقون Single-flight في الـ SDK أو على مستوى Repository Layer؟
#API #MobileArchitecture #DistributedSystems
👍1