قياس حي · يُحدَّث كل دقيقة
السرعة رقمٌ يُقاس.وهذا رقمنا، مباشرةً.
كل 5 دقائق ينشر مجسّ تغييرًا حقيقيًا عبر المسار نفسه الذي تستخدمه لوحة التحكم، ويقيس زمن وصوله إلى مستمعين على شبكة Cloudflare. كل رقم في هذه الصفحة مأخوذ من تلك العيّنات، بما فيها البطيئة.
222ms
p50، كل مواقع القياس
326ms
p95
378ms
p99
1,418
عيّنة
latency_summary · آخر 24 ساعة · أحدث عيّنة 2026-11-12 10:45 UTC
حسب موقع القياس
من التثبيت حتى المستمع، منطقةً منطقة.
الشريط هو الوسيط، والخط يمتد حتى المئين 95. المواقع هي حيث عمل مستمع المجسّ فعليًا على شبكة Cloudflare، مرتبةً حسب p50.
| موقع القياس | العيّنات | p50 | p95 | p99 | الأسوأ |
|---|---|---|---|---|---|
| KIX أوساكا | 283 | 188 | 280 | 323 | 473 |
| MEL ملبورن | 284 | 194 | 282 | 329 | 475 |
| LHR لندن | 284 | 229 | 318 | 366 | 520 |
| ATL أتلانتا | 284 | 253 | 341 | 386 | 532 |
| DEN دنفر | 282 | 254 | 342 | 385 | 535 |
| كل المواقع | 1,418 | 222 | 326 | 378 | 535 |
ms · 2026-11-12 10:45 UTC
| موقع القياس | العيّنات | p50 | p95 | p99 | الأسوأ |
|---|---|---|---|---|---|
| KIX أوساكا | 494 | 175 | 268 | 314 | 473 |
| MEL ملبورن | 493 | 195 | 284 | 322 | 475 |
| LHR لندن | 482 | 235 | 330 | 364 | 520 |
| DEN دنفر | 492 | 237 | 334 | 375 | 535 |
| ATL أتلانتا | 480 | 243 | 337 | 379 | 532 |
| كل المواقع | 2,443 | 217 | 320 | 371 | 535 |
ms · 2026-11-12 10:45 UTC
تشمل المجاميع 1 عيّنة من مجسّ لم يتمكن من الإبلاغ عن موقعه على Cloudflare.
مسار التسليم
قفزة واحدة من التثبيت إلى الـ SDK.
تدفع معاملةُ النشر النسخةَ الجديدة مباشرةً إلى خدمة النشر، فتوقّعها وتسلّمها إلى Durable Object واحد لكل بيئة، يرسل الحزمة الموقّعة عبر كل اتصال WebSocket مفتوح. ويطبّقها الـ SDK دون طلب ثانٍ.
النشر
Postgres commit · t₀
يُكتب صف النسخة داخل معاملة النشر، ويُدفع فورًا إلى خدمة النشر.
التوقيع
Ed25519 · kid
توقّع خدمة النشر نسخة الخادم ونسخة المتصفح من الحزمة.
التوزيع
Durable Object
كائن واحد لكل بيئة يبث إلى كل اتصال، ثم يحدّث مؤشر KV على الـ edge.
الدفع
WebSocket · hibernating
تحمل الرسالة الحزمة الموقّعة نفسها، والاتصالات الخاملة لا تكلّف شيئًا وهي تنتظر.
الـ SDK
verify → swap
يتحقق الـ SDK من التوقيع، ويستبدل الحزمة دفعة واحدة، ويواصل التقييم محليًا.
دفع لا استطلاع
يعلم الـ SDK المتصل بالنسخة لحظة نشرها، لا عند الاستطلاع التالي. وما دام الاتصال سليمًا ينخفض الاستطلاع إلى مرة كل 5 دقائق.
توقيع عند المصدر
تُوقَّع الحزمة مرة واحدة قبل التوزيع، ويقدّم الـ edge البايتات الموقّعة كما هي، وتتحقق منها حزم الـ SDK افتراضيًا على الـ edge الرسمي (JavaScript من 0.4.0، وPython وGo من 0.1.0).
تقييم محلي
قراءة العلم استدعاء دالة في الذاكرة، بلا أي طلب شبكة في المسار الحرج، فلا يُضاف زمن الانتشار إلى زمن طلباتك.
السلوك عند الأعطال
حين تكون الشبكة هي المشكلة، يبقى تطبيقك سليمًا.
زمن الانتشار هو سرعة وصول التغيير، أما السلوك عند الأعطال فهو ما يحدث حين يتعذّر وصوله. صُمّم الـ SDK بحيث يكلّفك انقطاعُ الاتصال التحديثاتِ فقط، لا الإجابات.
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. تُزامَن الساعتان كلٌّ على حدة، لذا فإن فرقًا ببضعة أجزاء من الألف من الثانية بينهما جزءٌ من كل عيّنة.
ما لا يشمله القياس
- شبكتك وأجهزتك والمتصفحات، والمسافة الأخيرة حتى تطبيقك.
- معالجة الـ SDK بعد استلام الحزمة.
- وسائل النقل البديلة (server-sent events والاستطلاع) المستخدمة حين لا يتوفر اتصال حي.
- النسخ التي لم يستلمها مستمع خلال 15 ثانية: لا تُنتج عيّنة هنا، ويحصيها المجسّ منفصلةً.
- العيّنات الأقل من 0 ms أو الأكثر من 60 ثانية، إذ تُستبعد بوصفها غير صالحة.
المجسّات قليلة وثابتة المواقع، والمئينات على نافذة قصيرة تستند إلى عيّنات قليلة. هذا زمن انتشار مقيس، وليس ضمانًا.
قِسه داخل تطبيقك.
يُبلغ حدث update في الـ SDK عن latencyMs لكل نسخة مدفوعة: الزمن من التثبيت في قاعدة البيانات حتى عمليتك.