چگونگی طراحی زیرساخت کمپین بازاریابی شخصیسازیشده اسنپ مارکت با ClickHouse
این مقاله ترجمه ای است از مقاله اسنپ مارکت در پلتفرم مدیوم : https://medium.com/@prmbas/clickhouse-in-the-wild-an-odyssey-through-our-data-driven-marketing-campaign-in-q-commerce-93c2a2404a39
در جریان طراحی و اجرای کمپین «سوپرسنج» در اسنپ! مارکت، هدف ما خلق تجربهای متفاوت و هوشمندانه برای میلیونها کاربر بود؛ تجربهای که با تحلیل رفتار خرید واقعی مشتریان و بهرهگیری از الگوریتمهای یادگیری ماشین و هوش مصنوعی، بهشکل شخصی و سرگرمکننده ارائه میشد.
برای رسیدن به این هدف، طراحی یک زیرساخت دادهای مقیاسپذیر و تحلیلی ضروری بود؛ زیرساختی که بتواند حجم بالایی از دادههای سفارش، محصول، رفتار مشتری و تعاملات کمپین را در زمان محدود پردازش کند. ما تصمیم گرفتیم از #ClickHouse بهعنوان موتور پردازش تحلیلی اصلی استفاده کنیم.
کمپین سوپرسنج: شخصیت خرید شما چیست؟
سوپرسنج یک کمپین خلاقانه و دادهمحور بود که با الهام از تستهای #MBTI، پرترهای طنز و شخصیسازیشده از کاربران اسنپ! مارکت ارائه میداد. این پرتره با تحلیل واقعی رفتار خرید مشتریان و بهکمک هوش مصنوعی تولید میشد.
اجزای اصلی کمپین:
پروفایل شخصی: آمارهایی مثل تاریخ اولین سفارش، مجموع کوپنهای استفادهشده و مسافت طیشده توسط پیکها
تست شخصیت خرید: تخصیص تیپهای شخصیتی بر اساس رفتار خرید (مثلاً «تنقلاتی راحتطلب» یا «قهوهدوست اقتصادی»)
محتوای طنز با هوش مصنوعی: تولید دیالوگ و داستان کوتاه بر اساس دادههای مشتری، با استفاده از LLMها
ساختار فنی: معماری چندلایه پردازش داده
برای پشتیبانی از چنین تجربهای، ما لایههای مختلفی از پردازش داده را در نظر گرفتیم:
لایه برنز : دادههای خام شامل سفارشها، اطلاعات کاربران، و متادیتاهای مربوط به محصولات در بازهای چهارساله
لایه نقره: پردازشهای تحلیلی میانی با استفاده از SQL و Python، ذخیرهشده بهشکل فایلهای Parquet
لایه طلا : خروجی نهایی شامل برچسبهای شخصیتی، آمار اختصاصی، و JSONهایی که به مدلهای زبانی برای تولید متن تزریق میشد
چالش فنی: جوینهای سنگین و مصرف بالای حافظه
در مراحل اولیه، از الگوریتم پیشفرض Join در ClickHouse استفاده کردیم. اما با رشد دادهها و افزایش پیچیدگی کوئریها، مصرف حافظه سر به فلک کشید و در مواردی منجر به کرش شد.
برای حل این مشکل، با بررسی دقیق مستندات ClickHouse و رفتارهای کوئری، به الگوریتم partial_merge مهاجرت کردیم.
-- changing join algorithm in the current CLI session
SET join_algortim = 'partial_merge';
-- data easlity stored in a parquet file
-- default path: /var/lib/clickhouse/user_files
INSERT INTO FUNCTION file('temp_data.parquet', Parquet)
SELECT *
FROM [db1].[table1] AS t1
LEFT JOIN [db2].[table2] AS t2 ON t1.[column1] = t2.[column2];
نتیجه:
پایداری بیشتر در کوئریهای سنگین
کاهش چشمگیر استفاده از RAM
حذف نیاز به ایجاد جداول staging برای ترکیب دادهها
قابلیتهای ویژه ClickHouse که بهرهبرداری کردیم:
خواندن مستقیم فایلهای Parquet از مسیرهای محلی و شبکهای
توابع تحلیلی سطح بالا مانند argMax, groupArray, corr, toStartOfInterval
پشتیبانی بومی از JSON و آرایهها برای ذخیره دادههای ساختیافته در فرمت نیمهساختیافته
اتصال Real-time به داشبورد Grafana برای مشاهده نتایج و رفتار کمپین در زمان اجرا