وقتی شبکه قطع میشود، گیتوی باید چه کند
لینک قطع خواهد شد. اینکه این قطعی یک دردسر کوچک باشد یا حفرهای در سوابق، به نحوه بافر کردن گیتوی، ترتیب دور ریختن داده و ادب آن هنگام تخلیه پس از بازگشت اتصال بستگی دارد.

گیتویای که هرگز قطع نشده، آزمایش نشده است. لینک قطع خواهد شد — مودمی راهاندازی مجدد میشود، اپراتور مخابراتی سلولی را بازپیکربندی میکند، سوییچی در بالادست هنگام تعویض شیفت عوض میشود، یا بیلی فیبر را پیدا میکند. آنچه در آن چند دقیقه بر سر داده میآید تعیین میکند که این قطعی یک دردسر کوچک باشد یا حفرهای در سوابق که شش ماه بعد در یک ممیزی دربارهاش پرسیده شود.
سه رفتار پیشفرض رایجاند و هر سه نادرستاند. نخست دور ریختن: انتشار داده شکست میخورد، خطا ثبت میشود و نمونهها از بین میروند. دوم مسدود شدن: حلقه جمعآوری داده منتظر فراخوان شبکه میماند و حالا یک مشکل شبکه به مشکل نرخ پویش تبدیل شده است و گیتوی از خواندن همان تجهیزاتی که برای خواندنشان وجود دارد عقب میافتد. سوم بافر کردن بدون محدودیت، که در آزمون دهدقیقهای عالی کار میکند و روز قطعی هشتساعته فرایند را از پا درمیآورد، معمولا با تمام کردن حافظه به شکلی که هرچه بافر شده بود را هم از دست میدهد.
رفتار درست، ملالآور است: بافر کردن روی حافظه پایدار، با سقف مشخص، و تخلیه مودبانه هنگام بازگشت لینک. باقی همه جزئیات است — اما شکست این پیادهسازیها دقیقا در همین جزئیات رخ میدهد.
اندازه بافر را از نرخ داده و یک بدترین حالت قطعی اعلامشده حساب کنید و هر دو عدد را بنویسید. دویست تگ با نرخ یک هرتز و بیست بایت برای هر نمونه به همراه شناسه تگ و برچسب زمانی، یعنی چهار کیلوبایت در ثانیه: حدود چهارده مگابایت در ساعت، یا سیصد و چهل مگابایت برای یک شبانهروز کامل آفلاین. این مقدار روی دستگاهی با یک گیگابایت حافظه فلش هیچ است و روی پارتیشنی شصت و چهار مگابایتی مرگبار، و تفاوت این دو وضعیت تصمیمی است که باید آگاهانه گرفته شود نه اینکه کشف شود.
جای بافر به اندازه حجم آن اهمیت دارد. حافظه اصلی سریع است و در همان قطع برقی که اغلب همراه قطع شبکه میآید از بین میرود — این دو خرابی علتهای مشترک دارند. فلش دوام میآورد، اما کارتهای حافظه صنعتی و eMMC تحمل نوشتن محدودی دارند و پیادهسازی سادهای که هر نمونه را الحاق کند و برای هرکدام نمایه را بازنویسی کند، کارت را ظرف یک سال فرسوده میکند. نوشتنها را دستهای کنید، از قالب فقطالحاقی استفاده کنید و بازه تخلیه بافر را به جای ثابتی که در میانافزار کامپایل شده، پارامتری قابل تنظیم بگذارید.
تصمیم بگیرید وقتی بافر با همه اینها پر شد چه رخ میدهد، چون بالاخره پر میشود. دور ریختن تازهترین داده تقریبا همیشه غلط است: تازهترین داده وضعیتی را توصیف میکند که اپراتور همین حالا در آن است. پاسخ معمول، دور ریختن قدیمیترین است. بهتر از آن، هرجا ماهیت داده اجازه میدهد، افت تدریجی کیفیت است — با عبور بافر از یک آستانه، رکوردهای قدیمیتر را به بازهای درشتتر تُنُک کنید و هر هشدار، تغییر وضعیت و خروج از محدوده را با تفکیک کامل نگه دارید. یک ساعت داده یکثانیهای که به میانگینهای یکدقیقهای رقیق شده باشد باز هم به بیشتر پرسشها پاسخ میدهد؛ یک ساعت هیچ، به هیچکدام.
اتصال مجدد کمترین آزمون را پس میدهد و بیشترین آسیب را میزند. گیتویای که هشت ساعت داده در صف دارد و لحظه بازگشت لینک آن را با تمام سرعت خط میفرستد، پهنای باند بالارو را اشباع میکند، داده زنده را پشت انبوه داده انباشته گرسنه نگه میدارد و نقطه دریافت را با هجومی میکوبد که برای آن اندازهگذاری نشده بود. حالا این را در دویست سایتی ضرب کنید که همان اپراتور مخابراتی منطقهای را از دست دادهاند و در همان یک دقیقه دوباره وصل میشوند. نرخ تخلیه را محدود کنید، داده زنده را بر انباشته اولویت دهید و پیش از اتصال مجدد تاخیری تصادفی بگذارید تا کل ناوگان همزمان از راه نرسد.
دادهای که با تاخیر پر میشود باید قابل تشخیص باشد. هر رکورد زمان برداشت نمونه را حمل میکند نه زمان ارسال را، و سامانه گیرنده باید رسیدن خارج از ترتیب را بپذیرد نه اینکه زمان را یکنواخت فرض کند — فرضی که هر انبارهای را که بر اساس زمان ورود پارتیشنبندی شده بیسروصدا خراب میکند. رکوردها به هویت پایدار هم نیاز دارند، چون تلاش مجدد پس از خطای مبهم حالت عادی است: یک شماره ترتیب برای هر دستگاه، یا درهمسازی روی دستگاه و تگ و زمان نمونه، به سمت دیگر اجازه میدهد نسخههای تکراری را دور بریزد به جای آنکه تولید را دوبار بشمارد.
اگر بستر انتقال MQTT باشد، بخشی از این امکانات موجود است و هیچکدام خودکار نیست. نشستهای پایدار با کیفیت سرویس یک و پرچم شروع تمیز نادرست باعث میشود کارگزار پیامها را برای مشترک قطعشده نگه دارد، اما صفهای سمت کارگزار سقفهایی دارند که معمولا پایینتر از تصور شماست، و قطعی طولانی در عمل در صف خروجی خود کلاینت جا خوش میکند. پیش از تکیه بر هرکدام، هر دو سقف را بخوانید.
فرمانها رفتاری وارونه تلهمتری میخواهند. تلهمتری گذشته همچنان درست است؛ اما تغییر نقطه تنظیم مربوط به شش ساعت پیش یک پیام نیست، یک خطر است. هر چیزی که به سمت تجهیزات میرود به انقضا نیاز دارد و گیتوی باید فرمانی را که پنجره اعتبارش گذشته دور بریزد نه اینکه اعمال کند. بر همین اساس، هر چیزی که باید در طول قطعی کار کند — اینترلاکها، هشدار محلی، گذار به وضعیت امن — به خود دستگاه تعلق دارد نه به آن سوی لینک. گیتوی پیک داده است و هیچ چیز ایمنیمحوری نباید منتظر پیک بماند.
در پایان، بافر را قابل مشاهده کنید. عمق آن، قدیمیترین رکوردش و شمار دادههای دورریخته را مثل تلهمتری معمولی منتشر کنید و برای عبور عمق از آستانه هشدار بگذارید. گیتویای که بیصدا داده دور میریزد دقیقا شبیه گیتویای است که چیزی برای گزارش ندارد و تفاوتشان تنها وقتی آشکار میشود که کسی دنبال شیفتی بگردد که در سوابق نیست. سپس تنها آزمونی را اجرا کنید که چیزی را ثابت میکند: کابل را یک ساعت با خط در حال کار بکشید، پر شدن بافر را تماشا کنید، دوباره وصل کنید و مطمئن شوید سوابق پس از آن کامل است، مرتب است و هر رکورد یک بار شمرده شده است.