MAISON CODE .
/ Inventory · Redis · Backend

ظروف السباق: حل مزامنة المخزون في الوقت الحقيقي

منع الإفراط في البيع خلال قطرات الحرارة العالية. استخدام Redis وOptimistic Locking لإدارة المخزون عبر 5 قنوات.

AB
Alex B.
ظروف السباق: حل مزامنة المخزون في الوقت الحقيقي

تخيل أن لديك وحدة واحدة من حذاء رياضي محدود. المستخدم أ موجود على موقع الويب الخاص بك. المستخدم ب موجود على تطبيقك. كلاهما ينقران على “شراء” في نفس المللي ثانية (12:00:00.001). Shopify يتلقى طلبين. إذا لم يتم التعامل معه بشكل صحيح، فإنه يبيع الحذاء الرياضي مرتين. يجب عليك الآن إرسال بريد إلكتروني إلى أحد العملاء وإلغاء طلبه. هذه كارثة علاقات عامة.

6. الاتساق النهائي (قاعدة الثانيتين)

يقول مسؤول Shopify الخاص بك “المخزون: 10”. ERP (NetSuite) الخاص بك يقول “المخزون: 8”. المستودع الخاص بك (WMS) يقول “المخزون: 9”. من هو على حق؟ ** ولا أحد منهم **. في النظام الموزع، يكون الاتساق نهائيًا. نحن بحاجة إلى مصدر واحد للحقيقة للمخزون “المخصص”. نحن نستخدم Redis باعتباره “جدول التخصيص” الرسمي. فقط بعد شحن الطلب، نقوم بتقليل نظام تخطيط موارد المؤسسات (ERP).

7. المخازن المؤقتة للمخزون الآمن

“إذا كان المخزون أقل من 5، ضع علامة على أنه غير متوفر.” هذه استراتيجية بدائية ولكنها فعالة للعناصر عالية الإنتاجية. إذا كنت تبيع 100 عنصر في الثانية، فإن زمن الوصول للمزامنة (200 مللي ثانية) يعني أنك قد تبيع أكثر من اللازم بمقدار 20 عنصرًا. الحل: مخزون الأمان الديناميكي. إذا كانت سرعة المبيعات أكبر من 10/دقيقة، قم بزيادة مخزون السلامة إلى 10. إذا كانت سرعة المبيعات <1/دقيقة، قم بتقليل المخزن المؤقت للسلامة إلى 0. يؤدي ذلك إلى زيادة عمليات البيع إلى الحد الأقصى مع حمايتك من المخزون السلبي.

9. المتاجر المظلمة والشحن من المتجر

المخزون ليس فقط في المستودع. انها في متاجر البيع بالتجزئة. نقوم بتنفيذ ** مزامنة القناة الشاملة **. “المتجر الرئيسي” الموجود في الجادة الخامسة هو أيضًا “المستودع رقم 2”. إذا كان المستودع الرئيسي هو OOS، فسيقوم النظام بفحص مخزون المتجر. يقوم بتوجيه الطلب إلى متجر iPad. يقوم موظف المتجر بالاختيار والتعبئة والشحن. يؤدي هذا إلى فتح مخزون إضافي بنسبة 20% كان “محتجزًا” على الرفوف سابقًا.

10. إرجاع المزامنة اللوجستية

عند بدء عملية الإرجاع (/returns)، يكون العنصر من الناحية الفنية “قيد النقل”. إنها ليست “متاحة للبيع”. لكننا نعلم أنه سيعود. بالنسبة للسلع ذات الطلب المرتفع، يمكننا تمكين الطلبات المتأخرة. “متوفر خلال 5 أيام” (الوصول المتوقع للعودة). نقوم بمزامنة أحداث الناقل اللوجستي المرتجع (FedEx Scan) لتحديث الحالة في Shopify. وهذا يسترد الإيرادات من المبيعات المفقودة.

11. الاستنتاج: القفل المتفائل وRedis

لا يمكننا الاعتماد على قاعدة البيانات التي تشير ببساطة إلى “المخزون = 1”. نحن بحاجة إلى قفل موزع.

مخطط تسلسل
    المستخدم المشارك أ
    المستخدم المشارك ب
    المشارك ريديس
    مشارك Shopify

    المستخدم أ->>Redis: قفل SETNX:sku_123 1
    Redis-->>المستخدم س: موافق (تم الحصول على القفل)
    المستخدم ب->>Redis: قفل SETNX:sku_123 1
    Redis-->>المستخدم ب: فشل (مقفل)
    
    المستخدم أ->>Shopify: إنشاء الخروج
    Shopify-->>المستخدم أ: نجاح الطلب
    المستخدم أ->>Redis: قفل DEL:sku_123
    
    المستخدم->>واجهة المستخدم: إظهار خطأ "نفاد المخزون".

1. نظام الحجز

عندما يضيف مستخدم عنصرًا عالي الحرارة إلى سلة التسوق، فإننا نحتفظ به في Redis لمدة 10 دقائق. حجز المجموعة: sku_123:user_abc EX 600 يؤدي هذا إلى تقليل المخزون المتوفر على الفور، حتى قبل حدوث عملية الشراء. إذا لم يشتروا خلال 10 دقائق، تنتهي صلاحية المفتاح، ويتدفق المخزون مرة أخرى إلى المجمع.

خطافات الويب للمزامنة

عند حدوث طلب، يجب علينا إخبار Amazon وTikTok على الفور. إن خطاف الويب الخاص بـ Shopify INVENTORY_LEVEL_UPDATE هو المحفز لدينا. ننقل هذا الحدث إلى حافلة الأحداث (Amazon EventBridge). تعمل وظائف لامدا المتشعبة على تحديث الأسواق الخارجية بالتوازي. (زمن الوصول: <200 مللي ثانية).

12. التعامل مع “القطيع الهادر”

عندما يصل 50.000 مستخدم إلى الموقع في الساعة 10 صباحًا، ستتوقف قاعدة البيانات الخاصة بك. يعد الاتصال بـ Postgres لكل عملية فحص للمخزون بمثابة انتحار. يعالج Redis 100000 عملية في الثانية. نحن نستخدم ** التخزين المؤقت للقراءة **.

  1. يسأل التطبيق Redis: “مخزون SKU-123؟”
  2. يقول ريديس: “ملكة جمال”.
  3. يسأل التطبيق DB: “المخزون 100”.
  4. يخبر التطبيق Redis: “SET SKU-123 100 TTL 10sec”. وهذا يقلل من تحميل قاعدة البيانات بنسبة 99%. ولكن ماذا لو فات 1000 طلب في نفس الوقت بالضبط؟ لقد ضربوا جميعا قاعدة البيانات. نحن نستخدم انتهاء الصلاحية المبكر الاحتمالي أو طلب الدمج (SingleFlight) لضمان وصول طلب واحد فقط إلى قاعدة البيانات لتدفئة ذاكرة التخزين المؤقت.

لماذا يناقش Maison Code هذا الأمر

في Maison Code، نقوم بتصميم أنظمة إطلاق عالية الحرارة. لقد نجونا من حركة الجمعة السوداء لأفضل العلامات التجارية لأزياء الشارع. نحن نعلم أن “البيع الزائد” ليس “مسبار العمليات”؛ إنه “فشل معماري”. نحن نبني آليات قفل موزعة تضمن اتساقًا قويًا حتى على نطاق واسع. نحن نقدر سمعتك. الطلب الملغى هو عميل ضائع إلى الأبد.

14. الاستنتاج

تعد مزامنة المخزون أصعب مشكلة في التجارة الإلكترونية. إنه يحارب الفيزياء (الكمون) والاحتمال (ظروف السباق). لا يمكنك الفوز بـ “الاستعلامات البسيطة”. أنت بحاجة إلى التخزين المؤقت، والقفل، وقائمة الانتظار. أنت بحاجة إلى التصميم من أجل الفشل.


هل تبالغ في البيع أثناء الانخفاضات؟

نحن نطبق مزامنة المخزون عالية الأداء المستندة إلى Redis لضمان نسبة 0% من المبيعات الزائدة.

قم بتعيين مهندسينا المعماريين.