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 गुणवत्ता से समझौता किए बिना अधिकतम प्रदर्शन देता है और जनरेशन के दौरान CPU तथा मेमोरी का यथासंभव कुशल उपयोग करता है। इससे हमारी सर्वर लागत में भारी कमी आती है।

हमारा काम पिक्सेल प्रोसेसिंग तक जाता है। हमारे लिखे 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 %

चारों स्थानीय परीक्षण AMD Ryzen 9 9950X पर 60 सेकंड तक चले। इनमें सामान्य रंगों या चित्रों वाली 100 हल्की पृष्ठभूमियाँ उपयोग की गईं, जिनका फ़ाइल आकार लगभग 100 से 300 KB और सामान्यतः करीब 200 KB था। Liquid Layer बंद रहा और फ़ॉन्ट स्थिर था; कार्डों के बीच केवल टेक्स्ट और सर्कल के रंग तथा उनके शेडर की स्थिति बदली गई।

रेंडर समय में चित्र निर्माण के साथ 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 %

ये चारों स्थानीय परीक्षण उसी AMD Ryzen 9 9950X पर 60 सेकंड तक चले। हर अनुरोध ने 800 KB से 2.4 MB आकार वाली 1,000 अधिक जटिल पृष्ठभूमियों और 237 फ़ॉन्ट में से चयन किया। टेक्स्ट, पारदर्शिता, फ़ॉन्ट व अवतार आकार, आउटलाइन, टेक्स्ट व सर्कल रंग तथा शेडर का कोण, शक्ति और तीव्रता बदली गई। लगभग आधे कार्डों में रैंडम रंग, अपारदर्शिता और ब्लर के साथ Liquid Layer भी सक्रिय था।

लोड जनरेटर ने बंद लूप में 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 · बिना बदलाव

प्रोग्रामिंग भाषा

TypeScript

TypeScript

सार्वजनिक वेबसाइट के इंटरैक्टिव पेज हम TypeScript में लिखते हैं। टाइप जाँच से कंपोनेंट और उनकी स्थिति एक जैसी बनी रहती है।

TypeScript का आधिकारिक लोगो। TypeScript ब्रांड दिशानिर्देशों के अनुसार उपयोग किया गया है।

वेब फ्रेमवर्क

Vue

Vue

Vue सार्वजनिक वेबसाइट के नेविगेशन, दस्तावेज़ और अन्य इंटरैक्टिव हिस्सों के कंपोनेंट बनाता है, ताकि इंटरफ़ेस को संभालना और बढ़ाना आसान रहे।

लोगो © Evan You. CC BY-NC-SA 4.0 · बिना बदलाव

Discord के लिए लाइब्रेरी

Twilight

Twilight

Discord से जुड़ने के लिए हम Twilight का उपयोग करते हैं। यह लाइब्रेरी Rust में लिखे हमारे बॉट को Discord से जोड़ती है।

Fezhoof का लोगो. CC BY-SA 4.0 · बिना बदलाव

डेटाबेस

Dragonfly Discord इवेंट, शार्ड और अनेक गेटवे कनेक्शन के समन्वय, AutoMod और गतिविधि लॉग के लिए हमारा साझा अस्थायी डेटा स्टोर है।

सॉफ़्टवेयर अतिरिक्त उपयोग अनुमति सहित BSL 1.1 के अंतर्गत।

रिलेशनल डेटाबेस

PostgreSQL संबंधपरक डेटा और संरचनाओं के लिए हमारी डेटा लेयर को पूरा करता है। यह ScyllaDB के साथ हमारी इंफ्रास्ट्रक्चर के एक अलग हिस्से के रूप में चलता है।

डेटाबेस

ScyllaDB

ScyllaDB

ScyllaDB, PostgreSQL के साथ हमारी डेटा लेयर का हिस्सा है। Fjord के भीतर दोनों प्रणालियों का उपयोग अलग-अलग कामों के लिए किया जाता है।

लोगो का उपयोग ScyllaDB Media Kit के अनुसार

ऑब्जेक्ट स्टोरेज

हम S3-संगत ऑब्जेक्ट स्टोरेज के लिए RustFS का उपयोग करते हैं। यह PostgreSQL और ScyllaDB के साथ एक अलग स्टोरेज लेयर जोड़ता है।

सॉफ़्टवेयर लाइसेंस Apache 2.0. RustFS, RustFS, Inc. का ट्रेडमार्क है।