پلتفرم باشگاه مشتریان در مقیاس ۲۵ میلیون کاربر

یک پلتفرم وفاداری و CRM از نوع B2B2C با ۲۵ میلیون مشتری یکتا و ۸۰۰ میلیون رکورد فاکتور — از .NET Framework تا .NET 9 و سپس تفکیک به سرویس‌های دامنه‌محور.

نتیجه

زمان بارگذاری داده‌ی صفحات تا ۳۰ برابر سریع‌تر؛ محصول روی .NET 9 و حدود ۷۰٪ از مسیر مهاجرت معماری طی‌شده.

مسئله

پلتفرمی برای وفاداری مشتری و CRM که سال‌ها روی .NET Framework 4.7 و پایگاه داده‌ای در SQL Server رشد کرده بود که مدت‌ها بود از آن بزرگ‌تر شده بود. پشت صفحه‌ها حدود ۲۵ میلیون مشتری یکتا (نزدیک ۶۰ میلیون رکورد غیریکتا)، ۸۰۰ میلیون رکورد فاکتور و بیش از یک میلیارد رکورد پیامک قرار داشت — و صفحه‌ها آن‌قدر کند باز می‌شدند که کاربران دیگر سراغشان نمی‌رفتند.

محصول را نمی‌شد متوقف کرد و از نو نوشت. هر تغییری باید زیر سیستمی اتفاق می‌افتاد که هر روز توسط کسب‌وکارها و مشتریانشان استفاده می‌شد.

توسعه‌دهنده‌ی اصلی محصول بودم و بخش عمده‌ی تصمیم‌های معماری و شیوه‌ی پیاده‌سازی آن‌ها بر عهده‌ی من بود.

مدرن‌سازی. از .NET Framework 4.7 به .NET 8 و سپس .NET 9. یک بازنویسی واقعی، نه فقط جابه‌جایی: هدف این بود که بعد از آن بشود سیستم را تغییر داد، نه صرفاً اینکه روی یک runtime پشتیبانی‌شده اجرا شود.

کارایی. کار سیستماتیک روی کل برنامه، نه شکار یک نقطه‌ی داغ. زمان بارگذاری داده‌ی صفحات در بدترین موارد تا ۳۰ برابر بهتر شد — عمدتاً با اصلاح آنچه کوئری‌ها و اسکیما از پایگاه داده می‌خواستند، نه با افزودن کش روی آن‌ها.

معماری. در فاز پایانی، محصولات شرکت و پیش از همه باشگاه مشتریان را به یک معماری یکپارچه منتقل کردم: vertical slice روی Clean Architecture، تفکیک‌شده بر اساس دامنه، با RabbitMQ برای پیام‌رسانی و gRPC میان سرویس‌ها. این یک معماری ماژولار دامنه‌محور با پیام‌رسانی است، نه میکروسرویس در مقیاس بزرگ؛ هنگام خروج من حدود ۷۰٪ از مهاجرت انجام شده بود.

قابلیت‌ها. بخش‌بندی مشتریان با چند روش از جمله RFM، multi-tenancy و جریان‌های رویدادمحور زیر هر دو. تست‌ها در سطح unit، integration و UI نوشته شدند.

دو مهندس دیگر بعدتر به محصول اضافه شدند؛ آنبوردینگ و منتورینگشان با من بود.