توجيه التنفيذ متعدد المصادر 2026 — توجيه الطلبات عبر الموردين
لا يمكن لتنفيذ السلع الرقمية الإنتاجي B2B أن يعتمد على مورّد واحد. المورّد الحصري نقطة فشل وحيدة — انقطاع واحد وكل طلب يفشل. النمط المعماري الصحيح هو التوجيه متعدد المصادر مع اختيار تلقائي لأفضل خيار لكل طلب.
يغطي هذا الدليل منطق التوجيه في نظامك الخاص. عندما تكون FoxReload أحد مورّديك، تستدعي POST /api/orders بعد أن تختارها طبقة التوجيه لديك. واسترجع النتائج بسؤال GET /api/orders/{order_id} — لا تُرسل FoxReload استدعاءات webhook، لذا صمّم طبقة التوجيه لديك لاستطلاع الاكتمال.
1. التوجيه الموزون بالكمون
أبسط نسخة هي اختيار المورّد ذي أدنى كمون تسليم عند p95. خزّن المقاييس التاريخية في نافذة Redis المنزلقة:
type SupplierStats = { p95Ms: number; failureRate: number; stock: number };
async function pickSupplier(productId: string): Promise<string> {
const candidates = await getSuppliersForProduct(productId);
const stats = await Promise.all(
candidates.map(s => redis.hgetall(`sup:${s.id}:stats`))
);
const scored = candidates.map((s, i) => ({
id: s.id,
score: 1 / (parseFloat(stats[i].p95Ms) + 1),
}));
return scored.sort((a, b) => b.score - a.score)[0].id;
}
يغطي هذا 80% من السيناريوهات. تتحدّث مقاييس الكمون كل 30 ثانية من أوقات اكتمال الطلبات الفعلية المسجّلة في طبقة التتبّع لديك.
2. التوجيه الواعي بالمخزون
إذا كان مخزون المورّد دون الاحتياطي (مثلاً <50 كوداً لمنتج رائج)، تجنّب استخدامه كأساسي حتى مع كمون جيد. يمنع احتياطي المخزون حالة التسابق "4 طلبات متزامنة على 3 أكواد".
function isViableSupplier(s: SupplierStats, qty: number): boolean {
const buffer = Math.max(50, qty * 3); // 3x safety margin
return s.stock >= buffer && s.failureRate < 0.05;
}
بالنسبة لـ FoxReload تحديداً، تحقّق من GET /api/products/{id_or_slug} للتأكد من أن المنتج لا يزال مدرجاً ونشطاً قبل توجيه الطلبات إليه.
3. التوجيه المُحسَّن للتكلفة
إذا سمحت اتفاقية مستوى الخدمة (مثلاً التنفيذ خلال 5 دقائق طبيعي في B2B)، حسّن على تكلفة الجملة. الصيغة:
score = (1 / wholesale_cost) * sla_multiplier
where sla_multiplier = 1 if p95 < target else 0
يمنح هذا ضماناً صارماً لاتفاقية مستوى الخدمة مع حد أدنى للتكلفة. عند الحجم الكبير (>10 آلاف طلب/يوم) يوفّر 1.5–3% من التكلفة الحدّية.
4. التجاوز الاحتياطي وقاطع الدائرة
نمط فحص السلامة:
| الإشارة | العتبة | الإجراء |
|---|---|---|
| معدل 5xx خلال 5 دقائق | >5% | وسم DEGRADED |
| معدل انتهاء المهلة | >2% | وسم DEGRADED |
| فشل النبضة | 3 على التوالي | وسم DOWN |
| التعافي | 5 ناجحة | وسم HEALTHY |
نمط قاطع الدائرة (بأسلوب Polly/resilience4j):
import CircuitBreaker from 'opossum';
const breaker = new CircuitBreaker(callSupplier, {
timeout: 8000,
errorThresholdPercentage: 50,
resetTimeout: 120000, // 2 min
});
breaker.fallback(() => fallbackSupplier());
في الحالة المفتوحة تنتقل 100% من الحركة إلى البديل — فترة تهدئة دقيقتين، ثم فحص canary نصف مفتوح، ثم التعافي.
5. الاستطلاع بعد تقديم الطلب
عندما تكون FoxReload هي المورّد المختار، بعد استدعاء POST /api/orders يجب على طبقة التوجيه لديك استطلاع الاكتمال:
async function placeAndWait(items: OrderItem[], apiKey: string): Promise<string[]> {
const res = await fetch('https://public-api.foxreload.com/api/orders', {
method: 'POST',
headers: { 'X-API-Key': apiKey, 'Content-Type': 'application/json' },
body: JSON.stringify({ items }),
});
const order = await res.json();
// Poll until terminal state
let delay = 5_000;
while (true) {
await sleep(delay);
const statusRes = await fetch(
`https://public-api.foxreload.com/api/orders/${order.id}`,
{ headers: { 'X-API-Key': apiKey } },
);
const latest = await statusRes.json();
if (latest.status === 'completed') {
return latest.items.flatMap((i: any) => i.externalData ?? []);
}
if (['cancelled', 'failed'].includes(latest.status)) {
throw new Error(`Order ${order.id} ended with status ${latest.status}`);
}
delay = Math.min(delay * 1.5, 30_000);
}
}
CTA
تقدّم FoxReload واجهة REST واحدة بكتالوج منتجات ضخم. احصل على الوصول وأدخِلها في طبقة التوجيه متعددة المصادر لديك.
