۷. استراتژی سینک (Weak Signal → Full Resync)

۷.۱ هدف این بخش

هدف استراتژی سینک این است که قیمت، تخفیف، موجودی و وضعیت فعال/غیرفعال بین POS و سامانه فروش آنلاین اسنپ! مارکت تا حد ممکن هم‌تراز بماند. در صنعت گروسری، اختلاف موجودی (Inventory Inaccuracy / Drift) یک واقعیت طبیعی است؛ پس هدف این است که ریسک و اثر Drift را کنترل کنیم تا:

خلاصه اجرایی: Live Sync به تنهایی کافی نیست. شما باید یک مکانیزم “تشخیص سیگنال ضعیف” داشته باشید که در صورت احتمال Drift، یک Resync هدفمند یا Full Resync اجرا کند.

۷.۲ تعریف‌ها (برای پیاده‌سازی مشترک)

اصطلاح تعریف کاربردی برای تیم POS
Live Sync ارسال نزدیک به لحظه تغییرات (Stock/Price/Active/Title) به پلتفرم؛ معمولاً event-based یا queue-based.
Weak Signal نشانه‌هایی که می‌گویند احتمالاً Live Sync درست کار نکرده یا Drift بالا رفته (مثلاً lag زیاد، تعداد خطا بالا، افت نرخ آپدیت، افزایش rejection/NFC).
Partial Resync Resync محدود فقط برای SKUهایی که مشکوک/تغییر یافته‌اند (کم‌هزینه‌تر، سریع‌تر).
Full Resync Resync کامل همه SKUهای فروشگاه در batchهای استاندارد (پرهزینه‌تر، اما لازم در Drift شدید).
Drift اختلاف میان داده ثبت‌شده در POS و داده‌ای که پلتفرم از فروشگاه می‌بیند.

۷.۳ سیاست Batch و ظرفیت عملیاتی

برای درخواست‌های Bulk (price/stock/productDetails/title/active) پیشنهاد می‌شود اندازه Batch را در بازه ۱۰۰ تا ۵۰۰ تنظیم کنید. انتخاب عدد دقیق به کیفیت شبکه، توان POS، و نرخ خطا بستگی دارد.

قاعده پیشنهادی (عملیاتی): اگر نرخ خطا یا timeout بالا رفت، Batch را کوچک‌تر کنید (مثلاً ۱۵۰). اگر پایدار بود و تعداد SKU زیاد است، Batch را بزرگ‌تر کنید (مثلاً ۴۰۰–۵۰۰).

چه چیزهایی را Batch کنید؟

۷.۴ Weak Signal: چه زمانی باید به Drift شک کنید؟

Weak Signal یک “الگوریتم داخلی POS” است، نه یک endpoint در پلتفرم. شما باید مجموعه‌ای از شاخص‌ها را مانیتور کنید و اگر هر کدام از آستانه عبور کرد، Resync را فعال کنید.

سیگنال‌های رایج و پیشنهاد آستانه

سیگنال تعریف پیشنهاد آستانه اقدام
Sync Lag زمان از آخرین آپدیت موفق price/stock > 10 دقیقه (فروشگاه پرتراکنش) Partial Resync SKUهای تغییر یافته
FailedItems Spike افزایش ناگهانی failedItems در bulk > 1% یا > 20 آیتم در یک Batch اصلاح داده + Retry هدفمند
Timeout / 5xx Rate افزایش خطاهای موقت ارتباطی > 3 خطای پشت‌سرهم Retry با Backoff + کاهش Batch
Ops Signals NFC/Reject مرتبط با OOS در مدت کوتاه افزایش غیرعادی نسبت به baseline Full Resync یا Resync روی گروه SKU
هشدار: در Drift شدید، بهترین واکنش “Retry کور” نیست؛ شما باید Resync را به شکل کنترل‌شده اجرا کنید تا سیستم پایدار شود.

۷.۵ طراحی پیشنهادی (Developer-grade) برای سینک

۷.۵.۱ Sync Queue (الزام عملی)

پیشنهاد می‌شود تمام تغییرات در POS ابتدا وارد یک صف (Queue) شوند و ارسال به پلتفرم توسط یک Sync Worker انجام شود. این کار باعث می‌شود قطع شبکه یا restart سرویس، رویدادها را از بین نبرد.

۷.۵.۲ اولویت‌بندی (Business-impact aware)

قانون ساده: اگر مجبورید بین “کامل بودن” و “به‌موقع بودن” یکی را انتخاب کنید، در گروسری آنلاین معمولاً “به‌موقع بودن موجودی” ارزشمندتر است.

۷.۶ اجرای Partial Resync (کم‌هزینه و سریع)

Partial Resync یعنی فقط SKUهایی که احتمال Drift دارند را مجدد Sync کنیم. این روش بهترین گزینه برای شرایطی است که Weak Signal خفیف است.

ورودی Partial Resync از کجا می‌آید؟

الگوی پیشنهادی اجرای Partial Resync

1) candidate_barcodes = changed_recently ∪ failed_items ∪ manual_flags
2) برای هر barcode:
   - قیمت/تخفیف را با productDetails یا price به‌روز کن
   - موجودی را با stock به‌روز کن
   - اگر کالا نباید فروش برود: active=false
3) نتیجه را لاگ کن (success/failedItems) و فقط failها را اصلاح و retry کن
نکته: Partial Resync نباید باعث فشار زیاد به POS یا شبکه شود؛ آن را محدود و مرحله‌ای اجرا کنید.

۷.۷ اجرای Full Resync (کنترل‌شده و مرحله‌ای)

Full Resync زمانی لازم است که Drift شدید است یا Live Sync برای مدتی از کار افتاده، یا نرخ خطا/lag به سطحی رسیده که Partial Resync پاسخ نمی‌دهد.

نکته حیاتی: Full Resync را به شکل “یک عملیات عظیمِ بدون کنترل” اجرا نکنید. آن را batch-by-batch با checkpoint و قابلیت ادامه دادن (resume) پیاده کنید.

گام‌های استاندارد Full Resync

  1. لیست SKUهای فروشگاه را از POS استخراج کنید (source of truth شما)
  2. Batch بندی ۱۰۰ تا ۵۰۰ تایی
  3. برای هر Batch:
    • ارسال price یا productDetails (در صورت نیاز)
    • ارسال stock
    • در صورت نیاز active/title
  4. ثبت نتیجه و جمع‌آوری failedItems
  5. Retry فقط برای failedItems و فقط پس از اصلاح

نمونه Bulk ارسال موجودی (Batch 250)

POST https://api-proxy.snapp.express/va/v1/product/stock
Authorization: Bearer <access_token>
Content-Type: application/json

{
  "vendorCode": "VENDOR_CODE",
  "stocks": [
    { "barcode": "111", "stock": 10 },
    { "barcode": "112", "stock": 0 }
    // ... up to 250 items
  ]
}

نمونه Bulk ارسال قیمت (Batch 250)

POST https://api-proxy.snapp.express/va/v1/product/price
Authorization: Bearer <access_token>
Content-Type: application/json

{
  "vendorCode": "VENDOR_CODE",
  "prices": [
    { "barcode": "111", "price": 35000 },
    { "barcode": "112", "price": 18000 }
    // ... up to 250 items
  ]
}
نکته اجرایی: اگر حجم SKU زیاد است، Full Resync را در زمان‌های کم‌ترافیک اجرا کنید و همزمان Live Sync را قطع نکنید؛ فقط rate را کنترل کنید.

۷.۸ کنترل صحت (Verification) بدون هزینه بالا

برای بررسی اینکه پلتفرم چه داده‌ای از یک SKU ثبت کرده است، می‌توانید در سناریوهای دیباگ از endpoint استعلام استفاده کنید. این مرحله باید محدود و هدفمند باشد (برای چند SKU مشکوک)، نه برای همه SKUها.

استعلام یک یا چند SKU (get-info)

POST https://api-proxy.snapp.express/va/v1/product/get-info
Authorization: Bearer <access_token>
Content-Type: application/json

{
  "vendorCode": "VENDOR_CODE",
  "products": [
    { "barcode": "1234" },
    { "barcode": "5678" }
  ]
}
کاربرد: وقتی یک SKU خاص “مشکوک” است یا اختلاف تکرارشونده دارد، با get-info می‌توانید بفهمید مشکل از ارسال POS است یا از داده ورودی.

۷.۹ Runbook عملیاتی (برای تیم‌های Operations و Vendor)

اگر NFC/Reject به دلیل OOS بالا رفت…

  1. بررسی کنید Live Sync موجودی فعال است (Sync Lag)
  2. failedItems را از آخرین batchها استخراج کنید
  3. Partial Resync روی SKUهای پرتکرار انجام دهید
  4. اگر مشکل ادامه داشت: Full Resync مرحله‌ای
  5. در نهایت، فرآیند داخلی فروشگاه را بازبینی کنید (ورودی بار، ضایعات، فروش خارج از POS)

اگر قیمت‌ها drift دارند…

  1. بررسی کنید قیمت در POS واقعاً به‌روزرسانی شده یا فقط در UI تغییر کرده
  2. price/productDetails را برای SKUهای مشکوک resend کنید
  3. اگر تکرار شد: logging دقیق (barcode, pos_price, sent_price, response)
اشتباه رایج: «ارسال دوباره کل دیتاست» بدون تحلیل، معمولاً مشکل را حل نمی‌کند و فقط سیستم را سنگین می‌کند. Resync باید هدفمند و مرحله‌ای باشد.

۷.۱۰ KPIهای پیشنهادی برای داشبورد (Business + Tech)

KPI تعریف چرایی اهمیت
Sync Lag (Stock/Price) زمان از آخرین ارسال موفق پیش‌بینی NFC/Drift قبل از رخداد
FailedItems Rate failedItems / total_items کیفیت داده و سلامت Sync
Retry Rate retry_count / total_requests نشانه مشکل شبکه یا endpoint
Resync Frequency تعداد Partial/Full Resync در روز اگر بالا باشد یعنی Live Sync پایدار نیست
NFC / OOS Reject Signals سیگنال‌های عملیاتی از سمت سفارش‌ها اثر مستقیم روی SLA و تجربه مشتری
هدف مدیریتی: اگر Resync زیاد اجرا می‌شود، معمولاً مشکل “فرآیند” است نه “API”. باید منبع Drift (ورودی بار، فروش خارج از POS، ضایعات، اصلاح دستی) شناسایی شود.

۷.۱۱ نمونه گزارش اجرای Resync (برای لاگ و Audit)

{
  "vendorCode": "VENDOR_CODE",
  "syncType": "partial",
  "trigger": "weak_signal: failed_items_spike",
  "startedAt": "2025-12-16T08:30:00Z",
  "batchSize": 250,
  "itemsPlanned": 740,
  "itemsSent": 740,
  "failedItems": 12,
  "retries": 1,
  "durationSec": 48,
  "result": "success_with_repair"
}

پیشنهاد می‌شود این گزارش حداقل ۷ تا ۳۰ روز نگهداری شود تا برای تحلیل‌های عملیاتی و رفع ریشه‌ای Drift مفید باشد.

۷.۱۲ نتیجه‌گیری

Weak Signal → Resync یک الگوی استاندارد برای کاهش ریسک در گروسری آنلاین است. Live Sync، Partial Resync و Full Resync باید در کنار هم و با کنترل بار اجرا شوند. اجرای درست این الگو باعث کاهش NFC، کاهش اختلاف‌ها و پایداری سیستم در مقیاس سازمانی می‌شود.

رفتن به بخش ۸: چک‌لیست نهایی