هدف الـ 200ms على شبكات سيّئة
شو فيك تضمن على 2G، شو ما فيك، وليش معظم performance budgets تمنيات.
جاري تحميل المقال…
شو فيك تضمن على 2G، شو ما فيك، وليش معظم performance budgets تمنيات.
جاري تحميل المقال…
«إجراءات المستخدم تشعر فوريّة حين تكتمل في أقلّ من ٢٠٠ مللي ثانية». هذا الرقم يُقتبَس في كلّ كتابة عن الأداء. ما لا يخبرك به أحد هو أنّه على الشبكات الاستهلاكيّة الحقيقيّة، الـ ٢٠٠ مللي ثانية تختفي قبل أن يعمل كودك. هذا ما يمكنك ضمانه، ما لا يمكنك، ولماذا معظم ميزانيّات الأداء تفكير رغبويّ.
أقلِع هاتف 4G بإشارة خلويّة نموذجيّة (ليست أفضل حالة)، أصدر طلباً إلى خادم في بلد مختلف، قِس أين يعيش الوقت:
TLS handshake (cold) ١٨٠ مللي ثانية
DNS lookup (cold) ٧٠ مللي ثانية
TCP three-way ٤٠ مللي ثانية (خلويّ ريفيّ)
HTTP request body ~٥ مللي ثانية
معالجة الخادم يتفاوت
Response body ~١٠ مللي ثانية (صغيرة)
رسم Render parse + paint ~١٦ مللي ثانية (إطار واحد)
هذا ~٣١٥ مللي ثانية قبل أن يفعل كودك أيّ شيء، على اتّصال بارد. حتّى اتّصال دافئ (TLS resumption، DNS مُخزَّن، TCP مفتوح) يكلّف ٦٠-٩٠ مللي ثانية من الذهاب والعودة على خلويّ حقيقيّ. ميزانيّة الـ ٢٠٠ مللي ثانية تختفي قبل وصول الطلب إلى خادمك.
هذه ليست حكاية حزن. هي شرط مسبق. عمل الأداء على الإجراءات الشبكيّة في معظمه عن تجنّب الذهاب والعودة، لا تسريعها.
ثلاثة أنماط تنتج إجراءات بإحساس فوريّ على الشبكات السيّئة. لا أحد منها يتضمّن جعل الشبكة أسرع.
الإجراء يأخذ أثره مرئيّاً قبل الذهاب والعودة. المستخدم يضغط «أرسل»؛ الرسالة تظهر في الدردشة مع مؤشّر «جاري الإرسال»؛ الذهاب والعودة يحلّها إلى «أُرسلت» أو «فشلت».
هذا يعمل لأنّ النموذج العقليّ للمستخدم هو أنّه أرسل الرسالة. الحقيقة (الخادم لم يقرّ بعد) تفصيل تنفيذ. مؤشّر «جاري الإرسال» هو الجزء الصادق: نخبره أنّها في الطريق؛ يثق بالنظام لحلّها.
البيانات على الشاشة تُقرأ من قاعدة بيانات محلّيّة، لا الشبكة. الشبكة تُستخدم فقط لإبقاء قاعدة البيانات المحلّيّة طازجة، في الخلفيّة، حين يكون مناسباً. غطّينا هذا النمط في مقال Flutter offline-first؛ هو السبب البنيويّ لماذا تستطيع التطبيقات أن تشعر سريعة على الشبكات السيّئة.
إن كنت تعرف أنّ المستخدم على وشك الحاجة إلى بيانات X (لأنّه على الشاشة التي تسرد X والنقرة الواضحة التالية هي «افتح واحدة»)، اجلبها مسبقاً. زمن الاستجابة المخفيّ خلف نقرة لم تحدث بعد هو زمن استجابة ليس في المسار الحرج.
الشكل الخطر لهذا النمط هو «اجلب كلّ شيء مسبقاً». يكلّف خطّة بيانات المستخدم والبطّاريّة. كن محدّداً: اجلب مسبقاً فقط العناصر التي لها معدّل نقر > ٣٠٪ من الشاشة الحاليّة.
ثلاثة SLOs نقدّمها:
| المقياس | 4G نموذجيّ | 2G | ملاحظات |
|---|---|---|---|
| النقر-إلى-الإقرار | < ٥٠ مللي ثانية | < ٥٠ مللي ثانية | تحديث محلّيّ متفائل |
| النقر-إلى-تأكيد-الخادم | < ١٫٢ ث | < ٥ ث | ذهاب وعودة |
| المزامنة-بعد-إعادة-الاتّصال | < ٨ ث | < ٣٠ ث | نافذة لحاق |
| أوّل رسم ذي معنى | < ٨٠٠ مللي ثانية | < ١٫٥ ث | إقلاع تطبيق بارد |
| أوّل رسم بعد bg→fg | < ٢٠٠ مللي ثانية | < ٢٠٠ مللي ثانية | بيانات محلّيّة، بدون ذهاب وعودة |
صفّ «النقر-إلى-الإقرار» هو الوحيد حيث ينطبق الـ ٢٠٠ مللي ثانية، وذلك لأنّه محلّيّ. صفّ «النقر-إلى-تأكيد-الخادم» واقعيّ لذهاب وعودة شبكة ولا نتظاهر بغير ذلك.
التأطير الصادق للمستخدمين: الإجراءات تشعر فوريّة؛ المزامنة في الخلفيّة؛ إن فشل شيء، نخبرك، مع طريقة لإعادة المحاولة.
بعض الأشياء بطيئة على الشبكات السيّئة فقط. كن صادقاً عنها بدلاً من تغطيتها.
بحث عبر مجموعة بيانات المستأجر الكاملة. تقرير. «ما هو إجماليّ الفاتورة الحاليّ». كلفة الذهاب والعودة لا يمكن تجنّبها. اعرض هيكلاً، لا تتوقّف على spinner.
الخرائط. مزوّدو المصادقة الخارجيّون. الفيديو المُضمَّن. كلّ منها دورته الخاصّة DNS + TLS + طلب، وتتراكم. إن استطعت تجنّب الطرف الثالث، افعل؛ إن لم تستطع، حمّله بشكل كسول تحت الطيّ واعرض بقيّة الصفحة.
websockets، SSE، إشعارات push، كلّها تتدهور حين تكون الشبكة مزدحمة. البديل ليس «اجعلها تعمل أصعب»؛ البديل هو polling على فاصل أطول وقبول زمن الاستجابة.
مكانان:
كلّ إجراء مفتاحيّ يُصدر حدثاً واحداً مع طوابع زمن البداية/النهاية ونوع الشبكة وقتها. نجمّع إلى p50 / p95 / p99 لكلّ نوع شبكة. المثيرة للاهتمام هي p95 على الخلويّ؛ p50 على الـ wifi يجامل الأرقام.
كلّ PR يشغّل اختباراً اصطناعيّاً ضدّ خادم staging مع الشبكة مُخفَّضة إلى «3G بطيء» عبر ملفّ DevTools. أيّ إجراء يستغرق أطول من ميزانيّته على 3G البطيء يحجب الـ PR. هذا يلتقط الانحدارات التي تبدو جيّدة على شبكة منزل سريعة.
الشبكات السيّئة تجعل هدف الـ ٢٠٠ مللي ثانية غير قابل للوصول لأيّ إجراء يتضمّن الشبكة. المسار الصادق إلى الأمام هو تصميم إجراءات لا تتضمّن الشبكة على المسار الحرج: كتابات محلّيّة متفائلة، قراءات local-first، جلب مسبق تنبّؤيّ. ثمّ صرّح بوضوح ما هي ميزانيّة الذهاب والعودة الفعليّة، والوفاء بها.
معظم التطبيقات غير صادقة عن ميزانيّات الأداء لأنّها كُتبت لـ wifi المنزل لفريق الهندسة. أوّل مرّة تشحن لعميل في قبو على 3G، تكتشف أيّ ميزانيّة كانت حقيقيّة.
المنشور التالي عن استراتيجيّات الـ indexing للاستعلامات التحليليّة. أو تصفّح فهرس الكتابة لاتّجاهات أخرى.