إبقاء المحادثة حية عندما ينام الهاتف
يمكن أن يعمل وكيل Mythex لدقائق على طلب واحد، وقد تكون تراقبه من هاتفك، فيقفل الهاتف ويبدّل التطبيقات ويغيّر الشبكة أثناء العمل. خطآن جعلا ذلك يسوء. في الأول، كانت المحادثة تعامل كل إشارة «الصفحة مرئية مجدداً» على أنها دليل على انقطاع الاتصال، فتدور في حلقة حتى تبقى عالقة عند «جارٍ الاتصال…». وفي الثاني، كان الهاتف الذي نام أثناء أول رد لمحادثة جديدة يعود بالأجزاء الأولى القليلة فقط من الرد، حتى تُحدَّث الصفحة يدوياً. وكلاهما أُصلح.
كيف تتابع المحادثة جولة قيد التنفيذ
أثناء عمل الوكيل، تحتفظ المحادثة بتدفق مفتوح من خوادمنا: تصل كل خطوة، من تفكير أو استدعاء أداة أو جزء من الرد، كحدث. وإذا انقطع التدفق، تعيد المحادثة الاتصال، ويعيد الخادم تشغيل الأحداث الحديثة من مخزن مؤقت يحتفظ بآخر 120 ثانية. وعند انتهاء الجولة، تطلب المحادثة من الخادم أيضاً السجل المحفوظ، وتوفّق بين ما عرضته وما خُزّن. هذه الخطوة الأخيرة تلتقط أي شيء فاتَ التدفق.
ولمعرفة ما إذا كان الاتصال الحي ميتاً عندما لا يحدث شيء، يرسل الخادم «نبضة» صغيرة كل 15 ثانية.
الخطأ الأول: الاستيقاظ قتل تدفقاً سليماً
تخبر المتصفحات الصفحة عندما تصبح مرئية مجدداً: بعد تبديل علامة التبويب، أو بعد فتح قفل الشاشة. كنا نستخدم ذلك كإشارة لفحص الاتصال، وفي الواقع لإيقاف التدفق وإعادة الاتصال، على افتراض أنه مات أثناء الإخفاء.
على الهواتف والمتصفحات المضمّنة، تُطلق هذه الأحداث أكثر بكثير من مرات موت التدفقات: مع كل تبديل تبويب، ومع كل فتح للقفل، وفي بعض المتصفحات المضمّنة كل بضع ثوانٍ تقريباً. وكان كل حدث منها يُجهض تدفقاً سليماً تماماً. كانت المحادثة تعيد الاتصال، وتعيد التشغيل، وتُجهض من جديد، وتنتهي عالقة عند «جارٍ الاتصال…». ثم تقول إن الجولة انتهت بينما الوكيل ما زال يعمل.
الحل: احكم على التدفق من خلال ما إذا كان يتكلم
تسجّل المحادثة الآن متى تلقّى تدفق كل مشروع أي شيء آخر، أي الأحداث والنبضات كل 15 ثانية معاً. ولا تُجهض إشارة «مرئية مجدداً» إلا التدفق الذي كان صامتاً لمدة 25 ثانية: أطول من فاصل النبضات مضافاً إليه قفزة شبكة بطيئة، فلا يقع التدفق الحي أبداً تحت هذا الشرط. وتتحقق الاختبارات من أن النبضة تُحسب علامة على الحياة، وأن التدفق الذي نبض للتو لا يُعامل كأنه ميت.
القاعدة التي استخلصناها: رؤية الصفحة تقول شيئاً عن الصفحة، لا عن اتصال الشبكة. اسأل الاتصال نفسه.
الخطأ الثاني: نصف رد بعد أن استيقظ الهاتف
هذا الخطأ استطعنا إعادة إنتاجه في كل مرة على محاكي iOS:
- ابدأ محادثة جديدة وأرسل طلباً يستغرق وقتاً.
- دع الهاتف ينام أثناء البناء.
- عُد بعد انتهاء الجولة وانتهاء مدة المخزن المؤقت للإعادة (دقيقتان).
عرضت المحادثة الأجزاء الأولى القليلة من الرد، وعلامتها منتهية، وبقيت كذلك حتى تحدّث الصفحة.
السبب
المحادثة الجديدة لا تملك سلسلة (أي السجل المحفوظ للمحادثة) إلا بعد أن تنشئها الرسالة الأولى. وذلك يحدث داخل دالة الإرسال، بعد أن كان الإرسال قد التقط خطوة المطابقة، التي ما زالت تعتقد أنه لا توجد سلسلة. لذلك، في نهاية الجولة الأولى في محادثة جديدة، لم تجد المطابقة سلسلة، فعادت بهدوء دون أن تطلب شيئاً.
ولم يلاحظ أحد ذلك عادةً، لأن التدفق كان قد سلّم الجولة كاملة على أي حال. لكن الهاتف الذي نام أثناء الجولة وعاد بعد انتهاء المخزن المؤقت للإعادة، وهو 120 ثانية، لم يستطع الحصول على الأحداث الناقصة من التدفق، والمطابقة التي كان يفترض أن تسدّ الفجوة لم تعمل أبداً.
الحل
- يُخبر الإرسال المطابقةَ بالسلسلة التي تنتمي إليها الجولة، فتُطابق الجولة الأولى لمحادثة جديدة كأي جولة أخرى. وإذا فتحت محادثة مختلفة بحلول وصول الرد، يُتجاهل الرد بدلاً من عرضه في المكان الخطأ.
- تُعاد محاولة المطابقة الفاشلة. قد يستيقظ الهاتف على اتصال سيئ، فيجد أن الجولة انتهت ثم يفشل في جلب السجل. هذا يُحفظ الآن، وتعيد المحادثة الطلب عندما تُعرض علامة التبويب من جديد أو تعود الشبكة.
- «عمل لمدة» صادقة. يعرض كل رد المدة التي عمل فيها الوكيل. وإذا لم تر علامة التبويب رسالة نهاية الجولة من الخادم، كانت تملأ الرقم من ساعتها الخاصة، التي تبدأ من لحظة الإرسال حتى استيقاظ الهاتف، بما فيها وقت الغياب. أصبح ذلك الرقم معلَّماً كتقدير، ويُستبدل بالمدة المخزنة بمجرد وصول السجل.
ما استخلصناه
- اختبر على الجهاز الذي يستخدمه الناس فعلاً، بالطريقة التي يستخدمونه بها. عاش الخطآن في المساحة بين «تدفق يعمل» و«هاتف في الجيب».
- احتياطٌ لا يعمل أبداً ليس احتياطاً. وُجدت خطوة المطابقة لالتقاط هذه الحالة بالضبط، وكانت تتخطاها بصمت.
- أعد محاولة الاسترداد نفسه أيضاً. لحظة استيقاظ الهاتف غالباً ما تكون اللحظة التي يكون فيها اتصاله في أسوأ حالاته.
- لا تعرض التخمين كحقيقة. مدة من ساعة خاطئة أسوأ من لا شيء؛ اجعلها معلَّمة أو استبدلها.
عمل العمل نفسه أيضاً على تنظيف بعض الأشياء التي ستراها أثناء تشغيل الجولة: تُعنون خطوات الصدفة بالأمر الذي ينفّذ العمل فعلاً بدلاً من cd، وتحتفظ لقطات الشاشة في المحادثة بالجزء العلوي الأيسر من الصفحة وتتسع في العمود، ويلتقط المشروع الجديد اسمه المولّد دون تحديث الصفحة.
إذا كنت تبني تطبيقك الخاص للهواتف، فإن أدلتنا عن بناء تطبيق ويب يناسب الهاتف والتطبيقات الأصلية مقابل تطبيقات الويب التقدمية تغطي الأساسيات. ولمزيد عن المحادثة نفسها، راجع وثائق المحادثة.