انتقل إلى المحتوى
NanoFlags
ابدأ مجانًا

قياس حي · يُحدَّث كل دقيقة

السرعة رقمٌ يُقاس.وهذا رقمنا، مباشرةً.

كل 5 دقائق ينشر مجسّ تغييرًا حقيقيًا عبر المسار نفسه الذي تستخدمه لوحة التحكم، ويقيس زمن وصوله إلى مستمعين على شبكة Cloudflare. كل رقم في هذه الصفحة مأخوذ من تلك العيّنات، بما فيها البطيئة.

222ms

p50، كل مواقع القياس

326ms

p95

378ms

p99

1,418

عيّنة

latency_summary · آخر 24 ساعة · أحدث عيّنة 2026-11-12 10:45 UTC

حسب موقع القياس

من التثبيت حتى المستمع، منطقةً منطقة.

الشريط هو الوسيط، والخط يمتد حتى المئين 95. المواقع هي حيث عمل مستمع المجسّ فعليًا على شبكة Cloudflare، مرتبةً حسب p50.

آخر 24 ساعة · 1,418
موقع القياسالعيّناتp50p95p99الأسوأ
KIX أوساكا283188280323473
MEL ملبورن284194282329475
LHR لندن284229318366520
ATL أتلانتا284253341386532
DEN دنفر282254342385535
كل المواقع1,418222326378535

ms · 2026-11-12 10:45 UTC

آخر 30 يومًا · 2,443
موقع القياسالعيّناتp50p95p99الأسوأ
KIX أوساكا494175268314473
MEL ملبورن493195284322475
LHR لندن482235330364520
DEN دنفر492237334375535
ATL أتلانتا480243337379532
كل المواقع2,443217320371535

ms · 2026-11-12 10:45 UTC

تشمل المجاميع 1 عيّنة من مجسّ لم يتمكن من الإبلاغ عن موقعه على Cloudflare.

مسار التسليم

قفزة واحدة من التثبيت إلى الـ SDK.

تدفع معاملةُ النشر النسخةَ الجديدة مباشرةً إلى خدمة النشر، فتوقّعها وتسلّمها إلى Durable Object واحد لكل بيئة، يرسل الحزمة الموقّعة عبر كل اتصال WebSocket مفتوح. ويطبّقها الـ SDK دون طلب ثانٍ.

  1. النشر

    Postgres commit · t₀

    يُكتب صف النسخة داخل معاملة النشر، ويُدفع فورًا إلى خدمة النشر.

  2. التوقيع

    Ed25519 · kid

    توقّع خدمة النشر نسخة الخادم ونسخة المتصفح من الحزمة.

  3. التوزيع

    Durable Object

    كائن واحد لكل بيئة يبث إلى كل اتصال، ثم يحدّث مؤشر KV على الـ edge.

  4. الدفع

    WebSocket · hibernating

    تحمل الرسالة الحزمة الموقّعة نفسها، والاتصالات الخاملة لا تكلّف شيئًا وهي تنتظر.

  5. الـ SDK

    verify → swap

    يتحقق الـ SDK من التوقيع، ويستبدل الحزمة دفعة واحدة، ويواصل التقييم محليًا.

عندما يتعذّر فتح اتصال. يلجأ الـ SDK إلى إشعار عبر server-sent events مع جلب مشروط من KV على الـ edge، ويستطلع دوريًا كشبكة أمان. وسائل النقل البديلة هذه أبطأ، وليست ضمن القياس.
  • دفع لا استطلاع

    يعلم الـ SDK المتصل بالنسخة لحظة نشرها، لا عند الاستطلاع التالي. وما دام الاتصال سليمًا ينخفض الاستطلاع إلى مرة كل 5 دقائق.

  • توقيع عند المصدر

    تُوقَّع الحزمة مرة واحدة قبل التوزيع، ويقدّم الـ edge البايتات الموقّعة كما هي، وتتحقق منها حزم الـ SDK افتراضيًا على الـ edge الرسمي (JavaScript من 0.4.0، وPython وGo من 0.1.0).

  • تقييم محلي

    قراءة العلم استدعاء دالة في الذاكرة، بلا أي طلب شبكة في المسار الحرج، فلا يُضاف زمن الانتشار إلى زمن طلباتك.

السلوك عند الأعطال

حين تكون الشبكة هي المشكلة، يبقى تطبيقك سليمًا.

زمن الانتشار هو سرعة وصول التغيير، أما السلوك عند الأعطال فهو ما يحدث حين يتعذّر وصوله. صُمّم الـ SDK بحيث يكلّفك انقطاعُ الاتصال التحديثاتِ فقط، لا الإجابات.

flags.ts
import { createClient } from "@nanoflags/sdk";

const flags = createClient({
  sdkKey: process.env.NANOFLAGS_SDK_KEY!,
  baseUrl: "https://edge.nanoflags.io",
  bootstrap: bundleFromServer,   // answers before the network does
});

await flags.ready();             // never rejects
flags.status;                    // "ready" | "stale" | "not-ready"

flags.on("update", (u) => {
  // u.transport: "live" | "stream" | "poll"
  // u.latencyMs: database commit → this process (pushed revisions)
  console.log(u.revision, u.transport, u.latencyMs);
});

// Local and synchronous. Offline, it keeps answering from the last verified bundle.
const on = flags.boolean("checkout-v2", false, { key: user.id });
آخر إعدادات سليمةstatus: stale
إذا انقطع الاتصال أو أخطأ الـ edge، يواصل الـ SDK التقييم بآخر حزمة تحقّق منها، ويُبلغ بالحالة "stale"، ويعيد المحاولة بفواصل متزايدة. لا يتخلّى عن حزمة عاملة بسبب خطأ، ولا يعود إلى نسخة أقدم من نسخة دُفعت إليه.
Bootstrapbootstrap: Bundle
مرّر حزمة عند بدء التشغيل (مثل الحزمة التي قيّمت بها على الخادم)، فيجيب الـ SDK منها قبل أن تصل أي استجابة من الشبكة، ويتطابق العرض على الخادم والعميل.
ready() لا يُرفض أبدًاawait flags.ready()
ينتظر بدء التشغيل حزمة صالحة من الشبكة أو من التخزين أو من bootstrap، أو انتهاء المحاولة الأولى دونها. لا يرمي استثناءً أبدًا؛ تحقّق من status بدلًا من ذلك. وإلى أن تتوفر حزمة، يُرجع كل استدعاء القيمة الاحتياطية التي مررتها.
احتياط الـ edgeX-NanoFlags-Stale: true
إذا تعذّر الوصول إلى قاعدة البيانات، يواصل الـ edge تقديم آخر نسخة موقّعة لديه ويصفها بأنها قديمة. يتوقف النشر، ولا تتوقف قراءة الأعلام.
مفتاح ملغى≈ 1 min at the edge
يُرفض المفتاح الملغى عادةً على الـ edge خلال دقيقة تقريبًا. أما الـ SDK الذي يحمل إعدادات بالفعل فيواصل تقييمها، بحالة stale، حتى إعادة تشغيله.

طريقة القياس

كيف تُصنع هذه الأرقام.

كل 5 دقائق ينشر مجسّ تغييرًا صغيرًا في بيئة مخصّصة للقياس عبر المسار نفسه الذي تستخدمه لوحة التحكم: تعديل في المسودة ثم نشر. ويحتفظ مستمعون يعملون على Cloudflare في المواقع المذكورة أعلاه، كلٌّ منهم، باتصال WebSocket حي واحد مع الـ edge باستخدام مفتاح خادم لتلك البيئة.

العيّنة هي الزمن من الطابع الزمني لتثبيت النسخة المنشورة في قاعدة البيانات حتى لحظة استلام الحزمة الموقّعة عبر الاتصال الحي. يأخذ Postgres طابع التثبيت عند بدء معاملة النشر، أي قبيل التثبيت نفسه بقليل، لذا تشمل العيّنات زمن معاملة النشر.

الساعات: وقت التثبيت مأخوذ من ساعة خادم قاعدة البيانات، ووقت الوصول من ساعة Cloudflare Workers. تُزامَن الساعتان كلٌّ على حدة، لذا فإن فرقًا ببضعة أجزاء من الألف من الثانية بينهما جزءٌ من كل عيّنة.

شاهد البيانات نفسها في /status

ما لا يشمله القياس

  • شبكتك وأجهزتك والمتصفحات، والمسافة الأخيرة حتى تطبيقك.
  • معالجة الـ SDK بعد استلام الحزمة.
  • وسائل النقل البديلة (server-sent events والاستطلاع) المستخدمة حين لا يتوفر اتصال حي.
  • النسخ التي لم يستلمها مستمع خلال 15 ثانية: لا تُنتج عيّنة هنا، ويحصيها المجسّ منفصلةً.
  • العيّنات الأقل من 0 ms أو الأكثر من 60 ثانية، إذ تُستبعد بوصفها غير صالحة.

المجسّات قليلة وثابتة المواقع، والمئينات على نافذة قصيرة تستند إلى عيّنات قليلة. هذا زمن انتشار مقيس، وليس ضمانًا.

قِسه داخل تطبيقك.

يُبلغ حدث update في الـ SDK عن latencyMs لكل نسخة مدفوعة: الزمن من التثبيت في قاعدة البيانات حتى عمليتك.