النقاط الأساسية
- تحسب طوابع يونكس الزمنية الثواني المنقضية منذ 1970-01-01T00:00:00Z بالتوقيت العالمي المنسق مع استبعاد الثواني الكبيسة.
- تتضمن معرفات Snowflake الموزعة 41 بت لفارق الميلي ثانية وتتطلب استخدام BigInt لتفادي فقدان دقة الأعداد 64 بت.
- تؤدي مشكلة عام 2038 إلى طفح الأعداد الصحيحة ذات 32 بت لتعود إلى عام 1901؛ الأعداد ذات 64 بت إلزامية.
الأسس الزمنية: حقبة POSIX
في البنى التحتية الموزعة الحديثة، يشكل تتبع الوقت الركيزة الأساسية لاتساق قواعد البيانات (Spanner TrueTime) وخوارزميات الإجماع (Raft و Paxos). يُعرَّف طابع يونكس الزمني (POSIX time) رسمياً بأنه عدد الثواني المنقضية منذ بداية الحقبة: 1970-01-01T00:00:00Z بالتوقيت العالمي المنسق، مع تجاهل الثواني الكبيسة.
لحساب قيم الحقبة وتحويلها داخل المتصفح، استخدم محول الطابع الزمني ليونكس. ولتوليد مفاتيح تشفير عشوائية آمنة، يمكنك مراجعة أداة توليد الرموز وفحص المطالبات عبر أداة فك تشفير JWT.
// الحصول الحتمي على طوابع يونكس الزمنية في بيئات التشغيل
const unixSeconds = Math.floor(Date.now() / 1000); // عدد صحيح قياسي من 10 أرقام
const unixMilliseconds = Date.now(); // طابع زمني من 13 رقماً
const highResTimer = performance.now(); // مؤقت فائق الدقة لا يرجع إلى الوراءبنية المعرفات الموزعة: تفكيك معرفات Snowflake 64 بت
تفشل المفاتيح الأساسية التسلسلية التقليدية في مجموعات قواعد البيانات الموزعة المقسمة لأنها تسبب اختناقات مركزية وتفصح عن حجم المعاملات للمنافسين.
تعتمد الأنظمة الحديثة مثل Twitter و Discord و Bluesky على معرفات Snowflake بسعة 64 بت. هذه المعرفات مرتبة زمنياً، وفريدة عالمياً دون الحاجة لتنسيق مركزي بين الخوادم.
تقسيم البتات
ينقسم معرف Snowflake القياسي ذو 64 بت إلى أربعة أجزاء رئيسية:
- بت الإشارة (1 بت): يضبط دائماً على
0للحفاظ على القيمة الموجبة في لغات مثل Java و Go. - فارق التوقيت (41 بت): الميلي ثواني المنقضية منذ حقبة مخصصة، مما يوفر مدى تشغيلياً يقارب 69.73 عاماً.
- معرف الجهاز أو مركز البيانات (10 بت): يتيح دعم ما يصل إلى 2¹⁰ = 1,024 خادم أو حاوية مستقلة دون أي تضارب.
- رقم التسلسل (12 بت): يولد حتى 2¹² = 4,096 معرفاً فريداً لكل ميلي ثانية لكل خادم (أكثر من 4 ملايين معرف في الثانية).
// استخراج الطابع الزمني باستخدام BigInt لتفادي أخطاء الفاصلة العائمة
function extractSnowflakeTimestamp(snowflakeId, customEpoch = 1420070400000n) {
const id = BigInt(snowflakeId);
const deltaMs = id >> 22n;
const unixMs = deltaMs + customEpoch;
return new Date(Number(unixMs));
}
// مثال: معرف Snowflake في Discord
const discordEpoch = 1420070400000n; // 2015-01-01T00:00:00.000Z
const messageId = "1284567890123456789";
console.log(extractSnowflakeTimestamp(messageId, discordEpoch).toISOString());مشكلة عام 2038 وطفح الأعداد الصحيحة
تنشأ مشكلة عام 2038 في الأنظمة القديمة ذات 32 بت:
- أقصى قيمة يمكن تمثيلها: 2³¹ - 1 = 2,147,483,647 ثانية.
- اللحظة الحرجة:
2038-01-19T03:14:07Z UTC. - النتيجة: ينقلب البت الثنائي إلى سالب، مما يعيد الوقت تلقائياً إلى عام 1901. تضمن البنى الحديثة ذات 64 بت استقرار الأنظمة لمئات المليارات من السنين.
تحويل دفعات الطوابع الزمنية وملفات CSV
في خطوط معالجة البيانات الضخمة وسجلات الخوادم، يتم تخزين ملايين الأحداث بصيغة أرقام الثواني أو الميلي ثانية في جداول CSV موسعة.
باستخدام محول طابع الوقت Unix من DevOmniTools، يمكن للمطورين تحويل دفعات الأرقام وسجلات CSV محلياً في الذاكرة:
- التعرف التلقائي على الوحدات: يميز فورياً بين ثواني POSIX المكونة من 10 أرقام، والميلي ثانية المكونة من 13 رقماً، والميكرو ثانية.
- حماية تامة للبيانات: تتم جميع التحويلات إلى صيغة ISO-8601 محلياً داخل المتصفح دون رفع أي سجلات لخوادم خارجية.
- دعم معرفات Snowflake: تحويل معرفات Discord و Twitter و Mastodon إلى تواريخ مقروءة بنقرة واحدة.
FAQ
ما هي حقبة يونكس (Unix Epoch) ولماذا تبدأ في 1 يناير 1970؟
حقبة يونكس هي نقطة بداية زمنية معيارية محددة في معيار POSIX (IEEE Std 1003.1). تمثل الساعة 00:00:00 بالتوقيت العالمي المنسق في 1 يناير 1970، وتعد المرجع الأساسي لساعات النظام في الحوسبة الحديثة.
كيف يتم استخراج التوقيت من معرفات Snowflake في Discord و Twitter؟
تستخدم معرفات Snowflake حقلاً ثنائياً بسعة 64 بت. تمثل أول 41 بت الفارق الزمني بالميلي ثانية منذ حقبة مخصصة. بإجراء إزاحة لليمين بمقدار 22 بت وإضافة إزاحة الحقبة نحصل على التوقيت العالمي المنسق بدقة.
كيف تحدث مشكلة عام 2038 (Y2K38)؟
الأنظمة التي تخزن وقت يونكس في عدد صحيح ذي إشارة بسعة 32 بت ستتعرض لطفح رقمي في 19 يناير 2038 عند تجاوز 2,147,483,647 ثانية، مما يعيد الوقت إلى عام 1901. تعالج بنى 64 بت هذه المشكلة تماماً.