بازگشت به پروژه‌ها
توسعه وب۱۲۷ تست Vitestکشینگ Write-Behindالگوریتم Feistel + Sqidsپشتیبانی دوزبانه (FA/EN)

شورتش‌کن (Shortesh Kon)

کوتاه‌کننده لینک سریع، سبک و امن با کش Write-Behind و ۱۲۷ تست Vitest

نقش من

توسعه‌دهنده فول‌استک

بازه زمانی

۱۴۰۴ – ۱۴۰۵

دسته‌بندی

توسعه وب

پروژه‌ها و کارهای من

9 فناوری استفاده‌شده

پیش‌نمایش و دمو

جریان کوتاه کردن، تست ریدایرکت و بررسی آمار

می‌تونید یک لینک طولانی بدید، زمان انقضا براش تعیین کنید، کد QR اون رو بگیرید و سرعت ریدایرکت و ثبت آمار در داشبورد رو از نزدیک تست کنید.

demo.local/shortesh-kon
پیش‌نمایش ویدیویی زنده: کوتاه‌سازی آنی، تست سرعت ریدایرکت، تولید بارکد QR و رصد لحظه‌ای آمار بازدیدها.
HD 720p • 30fps

راهنمای تست و بررسی

  1. 1لینک طولانی خودتون رو در کادر ورودی پیست کنید.
  2. 2در صورت تمایل زمان انقضا (مثلاً ۱ روزه، ۱ هفته یا دائمی) انتخاب کنید.
  3. 3کد کوتاه اختصاصی و تصویر بارکد QR رو تحویل بگیرید.
  4. 4با کلیک روی لینک کوتاه، سرعت ریدایرکت ردیس رو امتحان کنید.
  5. 5در داشبورد، بالا رفتن لحظه‌ای آمار بازدیدها رو مشاهده کنید.
قابلیت‌های بررسی‌شده:۱۲۷ تست خودکار و یکپارچه موفق با Vitestمعماری Write-Behind برای تحمل بار ترافیکی بالاتولید شناسه O(1) با الگوریتم Feistel و Sqidsسپر محافظتی در برابر حملات SSRF و محدودیت درخواستسازگاری کامل با تقویم شمسی و زبان فارسی
این پروژه با Docker Compose به سادگی در محیط لوکال بالا میاد.

درباره این پروژه

یه وب‌اپلیکیشن کاربردی و سریع برای کوتاه کردن لینک‌ها که به جای یک پروژه آزمایشی ساده، با دید سیستم‌های با ترافیک بالا مهندسی شده. با Next.js 16، React 19 و TypeScript ساخته شده و با ترکیب Upstash Redis و PostgreSQL 16 کار می‌کنه. ویژگی‌های باحالی مثل ریدایرکت زیر یک میلی‌ثانیه، شمارش اتمیک کلیک‌ها در رم بدون فشار به دیتابیس، کدهای کوتاه بدون تداخل با الگوریتم Feistel + Sqids، پشتیبانی دوزبانه (فارسی و انگلیسی با تقویم جلالی)، و محافظت در برابر حملات SSRF داره.

ویژگی‌ها و امکانات

ویژگی‌ها و امکانات

ریدایرکت برق‌آسا و کشینگ Write-Behind

بازهدایت لینک‌ها مستقیماً از رم ردیس انجام می‌شه تا تاخیر به صفر نزدیک بشه. کلیک‌ها به صورت اتمیک در رم بالا می‌رن و بعداً در دسته‌های مجزا به دیتابیس منتقل می‌شن.

تولید کدهای کوتاه یکتا و بدون تصادم (Feistel + Sqids)

با استفاده از جایگشت ریاضی فیستل، شناسه‌ها بدون نیاز به چک کردن مداوم دیتابیس یا تولید خطای تکراری، به رشته‌های کوتاه و غیرقابل حدس تبدیل می‌شن.

پشتیبانی کامل و صمیمی از زبان فارسی و انگلیسی

چیدمان کاملاً هماهنگ راست‌چین و چپ‌چین (RTL/LTR)، تاریخ‌های شمسی و نمایش اعداد فارسی برای راحتی کاربر ایرانی.

امنیت لایه‌ای و سپر دفاعی SSRF

جلوگیری هوشمند از سوءاستفاده‌های شبکه‌ای و درخواست به آی‌پی‌های خصوصی یا متادیتای کلود، همراه با اعمال Rate Limit روی ردیس و سنجش دقیق با Zod.

حالت کاربری مهمان و ثبت‌نام

بدون نیاز به ثبت‌نام می‌تونید لینک‌ها رو کوتاه کنید و در حافظه مرورگر داشته باشید، یا حساب بسازید و لینک‌هاتون رو مدیریت کنید.

داشبورد آمار کلیک‌ها و تولید خودکار کد QR

نمودارهای تعاملی برای بررسی روند بازدیدها و کشورهای ارجاع‌دهنده، همراه با امکان دانلود فوری تصویر باکیفیت QR Code.

پشت‌صحنه فنی و معماری

پشت‌صحنه فنی و معماری

شورتش‌کن روی معماری مدرن Next.js 16 App Router و React 19 با TypeScript پیاده شده. برای دستیابی به حداکثر سرعت، مسیرهای ریدایرکت اصلاً به دیتابیس سر نمی‌زنن و مستقیماً از Upstash Redis خوانده می‌شن. کلیک‌ها با دستور اتمیک HINCRBY در حافظه موقت ردیس ثبت می‌شن و سپس با یک کران‌جابِ دارای قفل توزیع‌شده، در دسته‌های منظم در PostgreSQL ذخیره می‌شن. لایه‌بندی پروژه بر اساس Data Access Layer و پترن Result انجام شده تا کد تمیز و خوانا بمونه.

نکات برجسته فنی

  • بهره‌گیری از Next.js 16 App Router و Server/Client Components
  • الگوی Write-Behind Caching با ترکیب رم پرسرعت ردیس و پایداری PostgreSQL
  • ردیابی اتمیک بازدیدها بدون تحمیل بار سنگین و همزمان به دیتابیس
  • الگوریتم جایگشت ۳۲ بیتی فیستل برای تولید اسلاگ‌های بدون برخورد در زمان O(1)
  • تفکیک شفاف لایه‌ها با Data Access Layer (DAL) و استفاده از Result Pattern
  • پوشش گسترده با ۱۲۷ تست واحد و یکپارچه Vitest برای تضمین کیفیت و رفتارها

فرانت‌اند و رابط کاربری

Next.js 16React 19Tailwind CSS v4Framer MotionTypeScript

بک‌اند و لایه داده

Next.js Route HandlersPostgreSQL 16Drizzle ORMUpstash Redis

امنیت و اعتبارسنجی

ZodSSRF ProtectionRedis Rate LimiterDistributed Locks

تست و ابزارهای توسعه

Vitest (127 Tests)Docker ComposeESLintSqids
چالش‌ها و راه‌حل‌های مهندسی

چالش‌ها و راه‌حل‌های مهندسی

چالش مهندسی

پاسخگویی به درخواست‌های پرشمار ریدایرکت و ثبت همزمان آمار کلیک بدون مسدودسازی مخزن کانکشن‌های دیتابیس رابطه‌ای.

راه‌حل و تصمیم معماری

پیاده‌سازی معماری کشینگ Write-Behind؛ ریدایرکت‌ها بدون درنگ از حافظه Upstash Redis خوانده شده و شمارش کلیک‌ها با HINCRBY اتمیک ذخیره می‌شوند، سپس یک کران‌جاب با قفل توزیع‌شده تغییرات را در قالب تراکنش‌های دسته‌ای به PostgreSQL منتقل می‌کند.

چالش مهندسی

جلوگیری از اسکرپ ترتیبی شناسه‌ها و تضمین عدم وقوع تصادم در کدهای کوتاه بدون نیاز به کوئری‌های مکرر پایگاه داده.

راه‌حل و تصمیم معماری

پیاده‌سازی یک شبکه جایگشت ۳۲ بیتی فیستل (Feistel Cipher) که شناسه‌های ترتیبی را بدون نیاز به ذخیره جداگانه به اعداد شبه‌تصادفی تبدیل کرده و سپس با Sqids کدگذاری می‌کند؛ در نتیجه هر کد کاملاً یکتا و در زمان ثابت O(1) تولید می‌شود.

چالش مهندسی

خنثی‌سازی حملات جعل درخواست سمت سرور (SSRF) و مقابله با سوءاستفاده از سرویس در بستر اینترنت عمومی.

راه‌حل و تصمیم معماری

ایجاد دفاع چندلایه شامل فیلتر کردن رکوردهای DNS برای مسدودسازی بازه‌های IP خصوصی، لوپ‌بک و متادیتای سرویس‌های ابری به همراه اعمال Rate Limit با Redis و ارزیابی عمیق با Zod.

Deep Dive

بررسی فنی عمیق: معماری کشینگ Write-Behind

وقتی درخواستی برای بازهدایت یک لینک کوتاه به مسیر /{slug} می‌رسد، هر میلی‌ثانیه برای تجربه کاربر حیاتی است. در کوتاه‌کننده‌های سنتی، هر بازهدایت شامل یک پرس‌وجوی سنگین از دیتابیس و به‌روزرسانی بلافاصله شمارنده بازدید است که زیر بار ترافیک شدید منجر به اشباع استخر اتصالات دیتابیس (Connection Pool Exhaustion) می‌شود.

راه‌حل پیاده‌سازی شده در شورتش‌کن

  • خوانش بدون وقفه از Redis: اسلاگ کوتاه بلافاصله از کش این‌مموری با دستور GET link:{slug} خوانده شده و پاسخ HTTP 307 در کمتر از چند میلی‌ثانیه ارسال می‌گردد.
  • شمارش اتمیک در رم: به جای تراکنش سنگین دیتابیس، شمارش کلیک‌ها به صورت اتمیک با HINCRBY link:clicks {id} 1 ثبت می‌شود.
  • تخلیه امن دسته‌ای (Batch Flush): کران‌جاب زمان‌بندی‌شده داده‌های جمع‌آوری شده را به صورت دوره‌ای و تحت قفل توزیع‌شده (Distributed Lock) در PostgreSQL ذخیره می‌کند.