دوران کودکی من در رویای گرفتن نامه از دریا سپری شد. ما در اصفهان شانس داشتن دریا را نداشتیم و من در سفرها، در کنار دریا ساعتها مینشستم و غرق میشدم در رویای رسیدن بطری. نامهای که در آن غریبهای کمک خواسته یا نقشهی گنجی مخفی را گذاشته و من وارد یک ماجرای هیجانانگیز میشوم.
خب، نزدیکترین تجربهی من به رویایم پیدا کردن بطریها رها شده در آب بود. زبالههایی که تا قرنها در طبیعت باقی میمانند؛ بدون هیچ نامهای در آنها.
مدتی پیش، در شبی طولانی و در حالی که با بیخوابی دست و پنجه نرم میکردن یک بات تلگرامی خندهدار نوشتم برای تجربهی این رویا.
قصد هزینه نداشتم و میخواستم کل پروژه در دو سه تمام شود. پس به Cloudflare Workers فکر کردم و برای دیتابیس هم به Cloudflare KV.
سرویس Workers یک سرویس بر پایهی معماری Serverless هست؛ یعنی شما نیاز به تنظیم سرور ندارید؛ همچنین یک سرور ۲۴ ساعته در اختیار شما نیست و فقط زمانی که نیاز است منابع به شما اختصاص داده میشود.
کلاود فلیر تا ۱۰۰ هزار ریکوئست در روز را به صورت رایگان پاسخ میدهد و بیش از این باید هزینهی اندکی بپردازید.
همچنین Cloudflare KV یک دیتابیس غیررابطهی و key/value هست که به صورت رایگان در ورکرها قابل استفاده هستند.
منطق بات ساده بود. آیدی هر یوزر با استارت بات به دیتابیس افزوده میشود و هر زمان کسی نامهای بنویسد یک آیدی به صورت رندوم انتخاب میشود و نامه به آن فرد ارسال میشود.
هردوی دیتابیس و ورکرها برای بات کافی بودند. پروژه بعد از دو ساعت منتشر شد. برای چند نفر از دوستانم فرستادم و خوابیدم.
روز بعد بات ۹۰ کاربر داشت و من هیجانزده شدم. احساس میکردم آدمهایی هستیم با رویاهای کودکی مشترک که در اینجا خودمان را ارضا میکنیم.
دیتابیس KV برای چنین چیزی بهینه نبود. امکان کوئری نداشت و هر بار باید کل دیتابیس خوانده میشد و بعد رندوم یکی انتخاب میشد. چون امکان کوئری زدن وجود نداشت. ضمن اینکه بعضیها واقعا بدشانسند. و در زمانی که شانس گرفتن نامه برای هر کس ۱ به ۸۹ است و ممکن است افزایش هم بیابد، هیچوقت نامه نگیرند.
تصمیم گرفتم یک روز اضافهتر را بر روی رویای کودکی بمانم. به دنبال دیتابیسهای رابطهای، serverless و رایگان گشتم و CockroachDB نجاتدهنده بود. سازندگان البته این دیتابیس را برای اسکیلهای بسیار بالا طراحی کردهاند و نسخهی رایگان برای یک بات تلگرام بیش از اندازه سخاوتمندانه است. تمام نیازهای فعلی و آیندهی پروژه را نیز میتوان با یک دیتابیس رابطهای سازگار با Postgres رفع کرد.
تصمیم دوم استفاده از یک کتابخانهی مخصوص بات تلگرام بود. بهجای کار مستقیم با APIهای تلگرام. چون به خاطر ساختار ورکرها کار با APIها پروژه را ناخوانا کرده بود.
اینجا Grammy ناجی بود. یک کتابخانهی قوی با داکیومنتهای خوب برای دیپلوی روی اکثر ارائهدهندههای سرویس serverless. به جز کلاود فلیر.
تصمیم گرفتم اول بات را با Grammy بنویسم و بعد به فکر دیپلوی بیفتم. تبدیل بات از صدا زدن خام ایپیآیها به یک پروژه با معماری بهتر و Grammy یک روز به طول انجامید؛
امکان ارسال ویس اضافه شد و گرافیک بات هم زیباتر شد. (کیبوردها و منوها) همچنین حالا یک دیتابیس کامل هم داشتم. امکان ریپورت نامههای نامناسب اضافه شد و تحویل نامه از حالت کاملا رندوم خارج شد. حالا کاربرها بر اساس آخرین زمان دریافت نامه نامه دریافت میکنند و به این ترتیب هیچکس بدون نامه نمیماند. البته همچنان ارسالکننده و دریافتکننده نامهها ناشناسند. چون رویا روی همین بنا شده.
نوبت به دیپلوی رسید و بعد از امتحان کردن Deno تا Azure Function و ور رفتن با Workers به Vercel رسیدم.
مشکل Deno ویسرور داخلی خود Deno بود که نامههای طولانی را دریافت نمیکرد و Azure Functions و ورکرها Cloudflare هم سر سازگاری نداشتند.
ورسل یک پلتفرم از تیم توسعهدهندهی NextJS است که اول برای میزبانی پروژههای serverless بر پایهی Next ساخته شده بود اما حالا تقریبا هر پروژه JS بر پایهی serverless قابلیت اجرا دارند.
به عنوان یک توسعهدهنده به زبان Go و کسی که بخش زیادی از عمرش را به کار با زبانهای کامپایلری گذرانده تجربهی نوشتن یک پروژه با JS عجیب و گاهی دردناک بود. البته همچنان پروژه را با تایپ اسکریپت نوشتم تا کمی از مزایای زبانهای کامپایلری بهرهمند باشم.
مهمترین مشکل البته وصل کردن بات به دیتابیس در پروداکشن بود که به دلیل جدید بودن CockroachDB و اتصال SSL، مجبور شدم نهایتا مستقیما از پکیج node-postgres استفاده کنم به جای orm های رایج.
فکر میکنم این موهبت دنیای ماست، با حجم زیاد ابزارها، راحت و ارزان (رایگان) برای تبدیل سریع ایدهها و رویاها به چیزی واقعی. فکر میکنم توسعهدهندگان بیشتری باید با معماری Serverless محصول تولید کنند و پروژههای کوچک دوستداشتنی بیشتری ببینیم.

Member discussion: