یکی بود یکی نبود…
مشکل حذف شدن sessionها در رباتها یا وباپها
کاربر وارد ربات خرید بلیت میشه، مبدا و مقصد رو انتخاب میکنه، زمان پرواز رو میزنه... اما بهمحض اینکه میرسه به مرحله پرداخت، ربات دوباره از اول شروع میکنه. انگار همهچی ریست شده. اون فقط چند ثانیه مکث کرده بود. ولی اون چند ثانیه، یه session رو پاک کرد، یه تجربه رو نابود.
کاربر وارد اپ میشه، لاگین میکنه، فرم رو پر میکنه، ولی وقتی دکمه ارسال رو میزنه... ناگهان انگار همهچیز از یاد رفته. اپ رفتار کاربر رو به خاطر نمیاره. ربات جواب نمیده. فرم دوباره باز میشه. و توسعهدهنده، بدون هیچ لاگی، میمونه با یک حس: «چی شد؟!»
این مقاله دربارهی خطای ساکت و خطرناکیه به نام حذف ناگهانی session؛ مشکلی که وقتی سرویس reboot میشه، کش تموم میشه یا چند سرویس session رو بین خودشون پاسکاری میکنن، تبدیل میشه به کابوس پنهان یکی از بدترین نوع خطاها، همینه: چیزی که نه با ارور همراهه، نه با کرش تنها علامتش «رفتار عجیب» اپه کاربری که ناگهان لاگاوت میشه، فرمی که پاک میشه، یا رباتی که انگار حافظهاش پاک شده. این اتفاق معمولاً در شرایط زیر رخ میده:
بعد از ریاستارت سرویس
در حین failover بین سرورها
وقتی زمان نگهداری session روی کش تموم شده
زمانی که session روی حافظه local نگهداری شده، اما اپ multi-instance شده
وقتی session میره، اعتماد هم میره
شاید از دید فنی فقط یک session حذف شده، اما از دید کاربر:
سفارشش لغو شده
پیامش در بات بیپاسخ مونده
یا باید همه فرم رو دوباره پر کنه
تجربهای که با یک تأخیر ساده یا نبود حافظه مشترک، از بین میره. این همون جاییه که «پایداری» از یک ویژگی زیرساختی، تبدیل میشه به «احترام به زمان کاربر».
خیلی از توسعهدهندهها تصور میکنن session فقط برای لاگینه. یا اینکه تا وقتی اروری دیده نمیشه، مشکلی وجود نداره. ولی حقیقت اینه که session میتونه توی middle stepها، فرمهای چندمرحلهای، و حتی تعامل با ربات نقش کلیدی داشته باشه. و وقتی ناپایداره، دقیقاً اون لحظه حساسه که کاربر رو از دست میدی.
کجاها این اتفاق میافته؟
قبل از اینکه نشانهها رو ببینیم، خوبه چند سناریوی آشنا رو مرور کنیم:
کاربر وسط فرآیند احراز هویت دو مرحلهایست، ولی ناگهان دوباره باید رمز عبور وارد کنه.
در یک ربات تلگرام، کاربر چند مرحله از یک فرآیند رو طی کرده، اما بهجای مرحله بعد، بات از اول میپرسه: «شروع کنیم؟»
فرم چندمرحلهای تکمیل شده، ولی بعد از ارسال، صفحه خالی نشون میده یا اپ میگه «دوباره وارد شوید.»
نشانههایی که میگن session شما ناپایداره
کاربرهایی که بهصورت اتفاقی از حساب خارج میشن
ارسال چندباره یک پیام یا فرم
کاربرهایی که وسط یک مرحله، دوباره به مرحله اول منتقل میشن
stateهایی که در UI دیده میشن اما در backend ناپدید شدن
استفاده از زیرساختی که session رو در حافظههای ناپایدار ذخیره نکنه (مثل کش ناپایدار یا local memory)، یکی از کلیدیترین بخشهاست. همچنین، هماهنگی بین سرویسها، بازیابی session در صورت failover، و طراحی رفتاری که در زمان قطع session هم کاربر رو سردرگم نکنه، جزو عواملیه که تجربه کار رو حفظ میکنه.
در زیرساختهایی که هماهنگی بین سرویسها را بهدرستی مدیریت میکنند، احتمال ناپایداری session بهشدت کاهش مییابد. این موضوع زمانی اهمیت بیشتری پیدا میکند که با چندین نسخه از اپ یا ربات سروکار داریم و هرکدام باید دسترسی پایدار و همزمان به sessionها داشته باشند.
در چنین محیطی، ذخیرهسازی ماندگارتر sessionها (بجای cache یا حافظه local)، امکان حفظ وضعیت کاربران حتی در شرایط reboot یا failover را فراهم میکند. در نتیجه، تجربه کاربر دچار اختلال نمیشود و اعتبار تعاملات حفظ میماند.
از طرفی، فراهم بودن زیرساختی که این پایداری را در سطح عمیقتری از برنامه تضمین کند، باعث میشود توسعهدهنده مجبور به طراحیهای پیچیده یا بازنویسی معماری نشود.
در همین راستا، برنت بستری فراهم کرده که از طریق مدیریت هماهنگ سرویسها، نگهداری ایمن نشستها و طراحی رفتار پایدار در شرایط چندسرویسی، میتواند از بروز اینگونه اختلالها جلوگیری کند بدون پیچیدگی اضافه در سمت برنامهنویس.، با امکان توزیع هماهنگ، نگهداری ماندگارتر session و پایداری در محیطهای چندسرویسی، میتونن نقش مهمی در جلوگیری از این مشکل بازی کنن. نه با پیچیدگی فنی، بلکه با طراحیای که توسعهدهنده لازم نیست هر بار چرخ رو از نو اختراع کنه.
اگر زیرساخت حافظه نداشته باشه، اپلیکیشن حافظه نداره
این بخش رو باید بهوضوح گفت. حتی اپهایی که از لحاظ ظاهر قوی و شکیل هستن، اگر نتونن اطلاعات کاربر رو در لحظات حساس نگه دارن، خیلی زود غیرقابل اعتماد به نظر میان.
وقتی کاربر وسط استفاده از یک سرویس، حس کنه که «فراموش شده»، فقط یه session از بین نرفته؛ یه اعتبار از دست رفته. و وقتی میگیم زیرساخت قابل اعتماد، منظور فقط uptime نیست. منظور اینه که اپلیکیشن شما حافظه داشته باشه، حتی در لحظاتی که همهچیز از نو شروع میشه در همین مسیر، استفاده از زیرساختی مثل برنت که بهصورت مشخص پایداری نشستها، هماهنگی بین سرویسها و حفظ تجربه کاربر در شرایط چندسرویسی را هدف قرار داده، میتواند به شکل مستقیم از بروز چنین مشکلاتی جلوگیری کند. برنت این بستر را فراهم کرده تا توسعهدهنده بدون دغدغه از دست رفتن session یا ناپایداری رفتار اپلیکیشن، روی منطق کسبوکار تمرکز کند. که هماهنگی بین سرویسها، نگهداری ایمن نشستها و پایداری رفتاری رو فراهم میکنه، میتونه یکی از کلیدیترین تفاوتهای بین یک اپ ناپایدار و یک تجربه قابل اعتماد باشه بدون نیاز به پیچیدگیهای اضافی سمت توسعهدهنده.
وقتی کاربر وسط استفاده از یک سرویس، حس کنه که «فراموش شده»، فقط یه session از بین نرفته؛ یه اعتبار از دست رفته. و وقتی میگیم زیرساخت قابل اعتماد، منظور فقط uptime نیست. منظور اینه که اپلیکیشن شما حافظه داشته باشه، حتی در لحظاتی که همهچیز از نو شروع میشه دیدن زنجیرهی session مثل زنجیرهی تعاملات انسانی، کمهزینهترین راه برای ساخت اپلیکیشن قابل اعتماد و انسانیتره مثل مهمونیای که از شما دعوت کرده، ولی وقتی رسیدین یادش رفته دعوتنامه فرستاده نه به خاطر بیاحترامی فقط چون یادش رفته ولی شما دیگه برنمیگردین.