Fjord

خلف كواليس Fjord

التقنيات التي تدعم Fjord.

بوت مكتوب بلغة Rust، ومحرك رسوميات نطوره داخليًا، إلى جانب الأطر والمكتبات وقواعد البيانات التي يعتمد عليها Fjord.

نوضح هنا ما نطوره بأنفسنا والتقنيات التي تجتمع في Fjord.

01 الروبوتيحافظ Fjord على ترتيب أحداث كل خادم ويعالج المهام المستقلة بالتوازي.

Fjord

معالجة الأحداث بالترتيب.

يعالج Fjord أحداث Discord بالترتيب وينفّذ المهام المستقلة بالتوازي. يربط Twilight البوت بـ Discord ويُبقي بيانات الخوادم متاحة محليًا. يخزّن Dragonfly الأحداث المعلّقة ويدعم تنسيق اتصالات البوابة.

01

READY يفصل بين حالتين.

ينتظر READY الجديد اكتمال المهام السابقة قبل تحديث حالة الخوادم. تبدأ الأحداث التالية بعد ذلك، فلا تستطيع المهام القديمة الكتابة فوق الحالة الجديدة.

02

FIFO لكل خادم.

تبدأ أحداث الخادم نفسه حسب ترتيب وصولها. وينتظر كل حدث انتهاء سابقه حتى لا تتجاوز تغييرات الخادم بعضها بعضًا.

03

الخوادم تعمل بالتوازي.

يميّز موزّع المهام بينها بواسطة مفاتيح. يمكن لخوادم مختلفة العمل معًا، ولا تنتظر إلا المهام التي تحمل المفتاح نفسه.

04

حدث واحد ومهام مناسبة.

تصل الرسالة نفسها إلى AutoMod وسجل النشاط في الوقت نفسه. ويعالجها كل منهما بشكل منفصل لأداء مهمته.

05

البيانات المؤقتة في Dragonfly.

تُخزّن أحداث Discord المعلّقة وبياناتها في Dragonfly. ويستخدم AutoMod وسجلات النشاط هذا المخزن المشترك للحالات المؤقتة أيضًا. ويظل البوت مسؤولًا عن تنفيذ المهام.

06

تطابق واحد واستجابة واحدة.

عندما يتطابق مرشح AutoMod مفعّل، يتوقف فحص الرسالة. ولا تُطلق المرشحات الأخرى إجراء إشراف ثانيًا للحدث نفسه.

07

بيانات الخوادم مع Twilight.

يُبقي Twilight بيانات الخوادم والأعضاء والأدوار والقنوات والرموز التعبيرية وحالات الحضور والصوت محدّثة في الذاكرة. ولا تُخزّن الرسائل في هذه الذاكرة المؤقتة.

08

التفاعلات مستقلة.

تُجدول التفاعلات بشكل مستقل عن أحداث الخوادم. ويحدّد READY حدود الحالة داخل كل اتصال بالبوابة.

09

مسؤولية الشاردات.

ينسّق Dragonfly مسؤولية كل شارد، أي كل اتصال بالبوابة. وبعد انتقال المسؤولية، لا يمكن للمالك السابق استلام أحداث أخرى أو إكمالها.

02 محرك الرسومات Fjellمعالجة الصور بلغة Rust وSIMD والأداء المقاس.

01 / تطويرنا الخاص

صورنا تحمل بصمتنا.

Fjell هو محرك الرسومات الخاص بنا والمكتوب بلغة Rust. يجمع الخلفيات والصور الرمزية والنصوص في بطاقات ترحيب شخصية.

أردنا التحكم في كيفية إنشاء هذه الصور. لذلك طورنا حلاً يناسب احتياجات Fjord ويمنحنا حرية التصميم.

ولا تقل كفاءة التكلفة أهمية عن ذلك. يقدم Fjell أعلى أداء من دون التضحية بالجودة، مع استخدام المعالج والذاكرة بأكبر قدر ممكن من الكفاءة أثناء التوليد. وهذا يخفض تكاليف الخوادم لدينا بشكل كبير.

يمتد تطويرنا إلى معالجة البكسلات. تستخدم حلقات SIMD التي كتبناها تقنيات AVX2 وFMA وBMI1/BMI2 لحساب عدة بكسلات بالتوازي.

معاينة محرر بطاقات Fjord مع بطاقة ترحيب مصممة
تصميم في Fjord. وتصْيير باستخدام Fjell.

قياس الأداء

اختبار أداء مضبوط*

أربعة مستويات للحمل مع تغييرات مضبوطة للبطاقات وإعداد اختبار واحد.

التوازيبطاقة/ثبطاقة/دمتوسط التصييرالتصيير P50التصيير P95التصيير P99المتوسط الكليالإجمالي P50الإجمالي P95الإجمالي P99متوسط CPUمتوسط RAM
1797,4847.8491,062 ms1,061 ms1,226 ms1,242 ms1,253 ms1,251 ms1,428 ms1,473 ms88,3 %381,2 MiB
21.577,9594.6771,038 ms1,004 ms1,225 ms1,421 ms1,266 ms1,236 ms1,470 ms1,715 ms173,5 %360,1 MiB
43.173,00190.3801,023 ms1,011 ms1,188 ms1,230 ms1,259 ms1,243 ms1,448 ms1,557 ms344,9 %375,3 MiB
85.850,25351.0151,050 ms1,026 ms1,194 ms1,290 ms1,366 ms1,349 ms1,578 ms1,803 ms647,0 %385,8 MiB

توسع معدل المعالجة

معدل المعالجة المقاس مقارنة بالتوسع الخطي المثالي.

المقاسالخطي المثالي
1248العمّال المتوازيونبطاقة/ث
العمّالالمقاسالخطي المثاليالتوسعالكفاءة
1797,48797,481,00×100,0 %
21.577,951.594,961,98×98,9 %
43.173,003.189,923,98×99,5 %
85.850,256.379,847,34×91,7 %

استمرت الاختبارات المحلية الأربعة 60 ثانية لكل منها على AMD Ryzen 9 9950X. استُخدمت 100 خلفية خفيفة بألوان عادية أو رسومات توضيحية وبأحجام ملفات من نحو 100 إلى 300 كيلوبايت، وعادة قرابة 200 كيلوبايت. بقيت الطبقة السائلة معطلة والخط ثابتًا؛ وتغيرت بين البطاقات ألوان النص والدائرة ومواضع المظللات الخاصة بهما.

يشمل زمن التصيير إنشاء الصورة وترميز PNG وضغطها حتى اكتمال ملف PNG النهائي. لا يشمل نقل الشبكة أو زمن التنزيل.

استخدم مولد الحمل 1 أو 2 أو 4 أو 8 طلبات متوازية حسب الاختبار. لم يبدأ طلب جديد إلا بعد استلام ملف PNG السابق كاملًا والتحقق منه. نشأ استخدام CPU المعروض تحت هذا الحمل تحديدًا. استطاع محرك الرسومات توزيع العمل على عدة أنوية.

* قياسات داخلية غير متحقق منها بصورة مستقلة ضمن الظروف الموضحة. لا تمثل خاصية مضمونة أو ضمانًا أو التزامًا بالأداء. قد يختلف الأداء الفعلي حسب النظام والحمل والبيئة.

اختبار عشوائي مكثف

اختبار الأداء ببطاقات عشوائية*

إعداد أكثر تنوعًا بكثير يضم 1,000 خلفية و237 خطًا وتأثيرات عشوائية لكل طلب.

التوازيبطاقة/ثبطاقة/دمتوسط التصييرالتصيير P50التصيير P95التصيير P99المتوسط الكليالإجمالي P50الإجمالي P95الإجمالي P99متوسط CPUمتوسط RAM
192,655.5599,775 ms10,478 ms12,781 ms13,401 ms10,788 ms11,553 ms14,006 ms14,784 ms93,6 %1.205,6 MiB
2184,5311.0729,944 ms10,621 ms12,858 ms13,550 ms10,832 ms11,576 ms13,938 ms14,698 ms189,1 %1.278,8 MiB
4358,8221.52910,209 ms10,855 ms13,240 ms13,997 ms11,138 ms11,857 ms14,363 ms15,212 ms377,7 %1.300,9 MiB
8660,5239.63110,897 ms11,610 ms14,343 ms15,336 ms12,101 ms12,889 ms15,838 ms16,880 ms744,8 %1.308,6 MiB

توسع معدل المعالجة

معدل المعالجة المقاس مقارنة بالتوسع الخطي المثالي.

المقاسالخطي المثالي
1248العمّال المتوازيونبطاقة/ث
العمّالالمقاسالخطي المثاليالتوسعالكفاءة
192,6592,651,00×100,0 %
2184,53185,301,99×99,6 %
4358,82370,603,87×96,8 %
8660,52741,207,13×89,1 %

استمرت هذه الاختبارات المحلية الأربعة 60 ثانية لكل منها على جهاز AMD Ryzen 9 9950X نفسه. اختار كل طلب من 1,000 خلفية أكثر تعقيدًا بأحجام من 800 كيلوبايت إلى 2.4 ميغابايت ومن 237 خطًا. وتغيرت النصوص والشفافية وأحجام الخط والصورة الرمزية والإطار وألوان النص والدائرة وزاوية المظللات وقوتها وكثافتها. وفُعّلت الطبقة السائلة في نحو نصف البطاقات أيضًا مع لون وشفافية وتمويه عشوائي.

استخدم مولد الحمل 1 أو 2 أو 4 أو 8 عمال متوازيين في حلقة مغلقة. لم يبدأ كل عامل طلبه التالي إلا بعد استلام ملف PNG السابق كاملًا والتحقق منه. انتهت جميع اختبارات الـ60 ثانية دون أخطاء أو انتهاء مهلة أو ملفات PNG غير صالحة.

يشمل زمن التصيير إنشاء الصورة وترميز PNG وضغطها حتى اكتمال ملف PNG النهائي. لا يشمل نقل الشبكة أو زمن التنزيل.

* قياسات داخلية غير متحقق منها بصورة مستقلة ضمن الظروف الموضحة. لا تمثل خاصية مضمونة أو ضمانًا أو التزامًا بالأداء. قد يختلف الأداء الفعلي حسب النظام والحمل والبيئة.

03 التقنيات المستخدمةاللغات والأطر والمكتبات وقواعد البيانات وتخزين الكائنات.

02 / أساسنا التقني

الأدوات التي نطور بها.

إلى جانب محركنا الخاص نستخدم Rust وLeptos وTypeScript وVue وTwilight وDragonfly وPostgreSQL وScyllaDB وRustFS. لكل تقنية دور واضح داخل النظام.

لغة البرمجة

Rust

Rust

تشكّل Rust أساس بوت Discord والواجهة الخلفية ومحرر البطاقات ومحرك الرسوميات Fjell لدينا.

الشعار © Rust Foundation. CC BY 4.0 · دون تعديل

إطار ويب

Leptos

Leptos

نستخدم Leptos في أجزاء من واجهة الويب. يتيح لنا الإطار استخدام Rust في المتصفح ويتكامل بصورة طبيعية مع بقية تقنياتنا.

الشعار من القائمين على صيانة Leptos. MIT · دون تعديل

إطار ويب

Vue

Vue

يشكّل Vue مكونات الموقع العام، من التنقل والتوثيق إلى الأجزاء التفاعلية الأخرى، لتبقى الواجهة سهلة الصيانة والتطوير.

الشعار © Evan You. CC BY-NC-SA 4.0 · دون تعديل

مكتبة لمنصة Discord

Twilight

Twilight

نستخدم Twilight للاتصال بمنصة Discord. تربط هذه المكتبة البوت المكتوب بلغة Rust بمنصة Discord.

الشعار من Fezhoof. CC BY-SA 4.0 · دون تعديل

قاعدة البيانات

Dragonfly هو مخزننا المشترك للبيانات المؤقتة لأحداث Discord وتنسيق الشاردات واتصالات البوابة المتعددة وAutoMod وسجلات النشاط.

البرنامج بترخيص BSL 1.1 مع منح إضافي للاستخدام.

قاعدة بيانات علائقية

يكمل PostgreSQL طبقة البيانات لدينا للبيانات والبنى العلائقية. ويعمل إلى جانب ScyllaDB كجزء مستقل من البنية التحتية.

تخزين الكائنات

نستخدم RustFS لتخزين الكائنات المتوافق مع S3. وهو يضيف طبقة تخزين مستقلة إلى جانب PostgreSQL وScyllaDB.

البرنامج مرخص بموجب Apache 2.0. RustFS علامة تجارية لشركة RustFS, Inc.