Amirali Yaghoutiمهندس ارشد نرم‌افزار

مطالعه موردی مهندسی

محصولات مشابه با DNA سبک

ویجت‌های «محصولات مرتبط» معمولاً هر چیزی را که در یک دسته باشد پیشنهاد می‌دهند. من می‌خواستم فروشگاه ساعت‌هایی را نشان بدهد که واقعاً شبیه هم باشند، پس موتوری نوشتم که ویژگی‌های هر محصول را مثل یک امضای سبک می‌خواند و بقیه را بر اساس همان امضا امتیاز می‌دهد.

مسئله تجاری

مقایسه‌ی یک محصول با کل کاتالوگ برای دیتابیس سنگین است؛ هر نامزد یعنی یک دور جست‌وجوی ترم‌های ویژگی. روی صفحات محصول پروداکشن، بلوک پیشنهاد حدود ۱٫۹ ثانیه طول می‌کشید. بلوکی به این کندی یا بد کش می‌شود یا آخرش حذف می‌شود، و هیچ‌کدام به فروش کمکی نمی‌کند.

آنچه تحویل دادم

  • موتور به‌شکل یک MU-plugin به نام a2-style-dna-similar.php، با شورت‌کد a2_similar_dna که تا هشت ساعت مشابه را روی هر صفحه‌ی محصول نشان می‌دهد.
  • یک امضای DNA برای هر محصول در متای _a2_dna_sig_json، ساخته‌شده از برند، اندازه‌ی قاب، مکانیزم، رنگ صفحه، بند، مقاومت آب، جنسیت، سبک و کشور سازنده.
  • یک backfill پس‌زمینه که کاتالوگ را دسته‌های ۲۰۰تایی و روی کرون یک‌دقیقه‌ای امضا می‌کند، با سقف ۱۸ امضای تنبل در هر درخواست تا محصول تازه پیش از رسیدن backfill هم رندر شود.
  • بازآوری هوشمند: وقتی نتیجه‌ی کش‌شده منقضی می‌شود، اگر اثرانگشت نامزدها عوض نشده باشد همان اسنپ‌شات دوباره به کار می‌آید و فقط نامزدهای تغییرکرده از نو امتیاز می‌گیرند.
  • سقف ۶۰ درصدی سهم هر برند، تا فهرست پیشنهاد هیچ‌وقت به یک برند واحد نرسد.

رویکرد فنی

  • استخر نامزدها در هر مرحله سقف دارد — ۶۰۰ هم‌برند، ۱۲۰۰ منطبق با OR، ۸۰۰ منطبق با AND، ۱۸۰ فالبک و سقف سخت ۲۶۰۰ — چون موتور شباهتِ بی‌سقف بالاخره به محصولی می‌رسد که از پا درش می‌آورد.
  • شناسه‌های نامزد و امتیاز هر نامزد در دو ترنزینت جدا با طول عمر جدا می‌نشینند (۲۴ و ۷۲ ساعت)، تا انقضای فهرست، امتیازهایی را که هنوز معتبرند دور نریزد.
  • داده‌های بالای ۲ کیلوبایت با gzip و پیشوند a2gz1: فشرده می‌شوند، و یک هوک پاک‌سازی روزانه ردیف‌های _transient_a2_dna_* را دسته‌دسته هرس می‌کند تا خود کش به یک مسئله‌ی ذخیره‌سازی تبدیل نشود.
  • یک قفل ساخت ۱۲۰ثانیه‌ای جلوی هجوم را می‌گیرد وقتی کش یک صفحه‌ی پربازدید منقضی می‌شود، و save_post_product همان لحظه ورودی‌های مربوط را باطل می‌کند.

نتیجه و شواهد

روی صفحات محصول پروداکشن اندازه گرفتم: بعد از جا افتادن کش‌های لایه‌ای و سقف‌گذاری روی استخرها، رندر محصولات مشابه از ۱٫۹ ثانیه به ۰٫۴۲ ثانیه رسید. بلوک از آن موقع روی همه‌ی صفحات محصول فعال مانده.

اهمیت برای کارفرما

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

خلاصه-اجرایی-پروژه

خلاصه اجرایی خوانا

خلاصه_اجرایی {
  پروژه: "Style DNA Similar Products"
  فایل: "mu-plugins/a2-style-dna-similar.php (v1.0.34)"
  امضا: "JSON به‌ازای هر محصول در متای _a2_dna_sig_json"
  استخرها: { برند: ۶۰۰، or: ۱۲۰۰، and: ۸۰۰، فالبک: ۱۸۰، سقف: ۲۶۰۰ }
  کش: { نتیجه: "۱۲ساعت + ۷۲ساعت کهنه"، شناسه‌ها: "۲۴ساعت"،
        امتیازها: "۷۲ساعت"، فشرده‌سازی: "gzip بالای ۲KB" }
  backfill: "۲۰۰ در هر دسته، کرون یک‌دقیقه‌ای، بودجه‌ی ۶ثانیه"
  رندر: "۸ قلم، حداقل امتیاز ۵۵، سهم برند ≤ ۶۰٪"
  اندازه‌گیری: "رندر صفحه‌ی محصول ۱٫۹ ثانیه ← ۰٫۴۲ ثانیه"
}

ارزش حرفه‌ای این پروژه

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

سقف سهم برند هم تصمیم محصولی است، نه فنی. فهرست پیشنهادی که همه‌اش یک برند باشد، چیزی به خریدار نشان نمی‌دهد.