01
READY स्थिति की सीमा तय करता है।
नया READY सर्वरों की स्थिति बदलने से पहले पुराने कार्यों के पूरा होने की प्रतीक्षा करता है। बाद के इवेंट उसके बाद शुरू होते हैं, इसलिए पुराने कार्य नई स्थिति को नहीं मिटाते।
Fjord के पर्दे के पीछे
Rust में बना बॉट, हमारी अपनी ग्राफ़िक्स इंजन, और वे फ्रेमवर्क, लाइब्रेरी व डेटाबेस जिन पर Fjord आधारित है।
यहाँ जानें कि हम खुद क्या विकसित करते हैं और Fjord में कौन सी तकनीकें साथ काम करती हैं।
Fjord
Fjord Discord इवेंट को क्रम से संसाधित करता है और स्वतंत्र कार्य समानांतर चलाता है। Twilight बॉट को Discord से जोड़ता है और सर्वर डेटा स्थानीय रूप से उपलब्ध रखता है। Dragonfly लंबित इवेंट रखता है और गेटवे कनेक्शन के समन्वय में मदद करता है।
01
नया READY सर्वरों की स्थिति बदलने से पहले पुराने कार्यों के पूरा होने की प्रतीक्षा करता है। बाद के इवेंट उसके बाद शुरू होते हैं, इसलिए पुराने कार्य नई स्थिति को नहीं मिटाते।
02
एक ही सर्वर के इवेंट आने के क्रम में शुरू होते हैं। अगला इवेंट पिछले कार्य के पूरा होने तक प्रतीक्षा करता है ताकि स्थिति के बदलाव एक-दूसरे से आगे न निकलें।
03
डिस्पैचर कार्यों को उनकी कुंजी से अलग करता है। अलग सर्वर साथ चल सकते हैं; केवल एक ही कुंजी वाले कार्य एक-दूसरे की प्रतीक्षा करते हैं।
04
वही संदेश AutoMod और गतिविधि लॉग दोनों तक एक साथ पहुँचता है। दोनों अपना काम अलग-अलग करते हैं।
05
लंबित Discord इवेंट और उनका डेटा Dragonfly में रहता है। AutoMod और गतिविधि लॉग भी अस्थायी स्थिति के लिए इस साझा स्टोर का उपयोग करते हैं। कार्यों का निष्पादन अभी भी बॉट नियंत्रित करता है।
06
सक्रिय AutoMod फ़िल्टर के मेल खाते ही उस संदेश की जाँच समाप्त हो जाती है। बाकी फ़िल्टर उसी इवेंट पर दूसरी मॉडरेशन कार्रवाई नहीं करते।
07
Twilight सर्वर, सदस्य, रोल, चैनल, इमोजी, उपस्थिति और वॉइस स्थिति को मेमोरी में अद्यतन रखता है। संदेश इस कैश का हिस्सा नहीं हैं।
08
इंटरैक्शन सर्वर इवेंट से स्वतंत्र रूप से निर्धारित होते हैं। READY प्रत्येक गेटवे कनेक्शन के भीतर स्थिति की सीमा तय करता है।
09
Dragonfly अलग-अलग शार्ड, यानी गेटवे कनेक्शन की जिम्मेदारी का समन्वय करता है। जिम्मेदारी सौंपे जाने के बाद पुराना स्वामी आगे के इवेंट न ले सकता है, न पूरा कर सकता है।
01 / हमारा अपना विकास
Fjell हमारा अपना ग्राफ़िक्स इंजन है, जिसे Rust में लिखा गया है। यह पृष्ठभूमि, अवतार और टेक्स्ट को मिलाकर व्यक्तिगत स्वागत कार्ड बनाता है।
हम चाहते थे कि ये तस्वीरें कैसे बनती हैं, इस पर हमारा नियंत्रण हो। इसलिए हमने Fjord की ज़रूरतों के अनुसार समाधान विकसित किया, जो हमें डिज़ाइन की स्वतंत्रता देता है।
लागत दक्षता भी उतनी ही महत्वपूर्ण है। Fjell गुणवत्ता से समझौता किए बिना अधिकतम प्रदर्शन देता है और जनरेशन के दौरान CPU तथा मेमोरी का यथासंभव कुशल उपयोग करता है। इससे हमारी सर्वर लागत में भारी कमी आती है।
हमारा काम पिक्सेल प्रोसेसिंग तक जाता है। हमारे लिखे SIMD लूप AVX2, FMA और BMI1/BMI2 का उपयोग करके कई पिक्सेल की गणना समानांतर रूप से करते हैं।
प्रदर्शन माप
चार लोड स्तर, नियंत्रित कार्ड बदलाव और एक जैसी परीक्षण व्यवस्था।
| समानांतर | कार्ड/सेकंड | कार्ड/मिनट | औसत रेंडर | रेंडर P50 | रेंडर P95 | रेंडर P99 | कुल औसत | कुल P50 | कुल P95 | कुल P99 | औसत CPU | औसत RAM |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 797,48 | 47.849 | 1,062 ms | 1,061 ms | 1,226 ms | 1,242 ms | 1,253 ms | 1,251 ms | 1,428 ms | 1,473 ms | 88,3 % | 381,2 MiB |
| 2 | 1.577,95 | 94.677 | 1,038 ms | 1,004 ms | 1,225 ms | 1,421 ms | 1,266 ms | 1,236 ms | 1,470 ms | 1,715 ms | 173,5 % | 360,1 MiB |
| 4 | 3.173,00 | 190.380 | 1,023 ms | 1,011 ms | 1,188 ms | 1,230 ms | 1,259 ms | 1,243 ms | 1,448 ms | 1,557 ms | 344,9 % | 375,3 MiB |
| 8 | 5.850,25 | 351.015 | 1,050 ms | 1,026 ms | 1,194 ms | 1,290 ms | 1,366 ms | 1,349 ms | 1,578 ms | 1,803 ms | 647,0 % | 385,8 MiB |
मापे गए थ्रूपुट की आदर्श रैखिक स्केलिंग से तुलना।
| वर्कर | मापा गया | आदर्श रैखिक | स्केलिंग | दक्षता |
|---|---|---|---|---|
| 1 | 797,48 | 797,48 | 1,00× | 100,0 % |
| 2 | 1.577,95 | 1.594,96 | 1,98× | 98,9 % |
| 4 | 3.173,00 | 3.189,92 | 3,98× | 99,5 % |
| 8 | 5.850,25 | 6.379,84 | 7,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 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 92,65 | 5.559 | 9,775 ms | 10,478 ms | 12,781 ms | 13,401 ms | 10,788 ms | 11,553 ms | 14,006 ms | 14,784 ms | 93,6 % | 1.205,6 MiB |
| 2 | 184,53 | 11.072 | 9,944 ms | 10,621 ms | 12,858 ms | 13,550 ms | 10,832 ms | 11,576 ms | 13,938 ms | 14,698 ms | 189,1 % | 1.278,8 MiB |
| 4 | 358,82 | 21.529 | 10,209 ms | 10,855 ms | 13,240 ms | 13,997 ms | 11,138 ms | 11,857 ms | 14,363 ms | 15,212 ms | 377,7 % | 1.300,9 MiB |
| 8 | 660,52 | 39.631 | 10,897 ms | 11,610 ms | 14,343 ms | 15,336 ms | 12,101 ms | 12,889 ms | 15,838 ms | 16,880 ms | 744,8 % | 1.308,6 MiB |
मापे गए थ्रूपुट की आदर्श रैखिक स्केलिंग से तुलना।
| वर्कर | मापा गया | आदर्श रैखिक | स्केलिंग | दक्षता |
|---|---|---|---|---|
| 1 | 92,65 | 92,65 | 1,00× | 100,0 % |
| 2 | 184,53 | 185,30 | 1,99× | 99,6 % |
| 4 | 358,82 | 370,60 | 3,87× | 96,8 % |
| 8 | 660,52 | 741,20 | 7,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 मिलने तक मापा गया है। नेटवर्क स्थानांतरण और डाउनलोड समय इसमें शामिल नहीं हैं।
* वर्णित परिस्थितियों में किए गए आंतरिक माप, जिनका स्वतंत्र सत्यापन नहीं हुआ है। ये किसी सुनिश्चित विशेषता, गारंटी या प्रदर्शन प्रतिबद्धता का गठन नहीं करते। वास्तविक प्रदर्शन सिस्टम, लोड और वातावरण के अनुसार बदल सकता है।
02 / हमारा तकनीकी आधार
अपने इंजन के साथ हम Rust, Leptos, TypeScript, Vue, Twilight, Dragonfly, PostgreSQL, ScyllaDB और RustFS का उपयोग करते हैं। सिस्टम में हर तकनीक की स्पष्ट भूमिका है।
प्रोग्रामिंग भाषा
Rust हमारे Discord बॉट, बैकएंड, कार्ड एडिटर और Fjell ग्राफ़िक्स इंजन की नींव है।
लोगो © Rust Foundation. CC BY 4.0 · बिना बदलाव
वेब फ्रेमवर्क
हम अपने वेब इंटरफ़ेस के कुछ हिस्सों में Leptos का उपयोग करते हैं। यह फ्रेमवर्क Rust को ब्राउज़र तक लाता है और हमारे बाकी स्टैक के साथ स्वाभाविक रूप से जुड़ता है।
Leptos के रखरखावकर्ताओं का लोगो। MIT · बिना बदलाव
प्रोग्रामिंग भाषा
सार्वजनिक वेबसाइट के इंटरैक्टिव पेज हम TypeScript में लिखते हैं। टाइप जाँच से कंपोनेंट और उनकी स्थिति एक जैसी बनी रहती है।
TypeScript का आधिकारिक लोगो। TypeScript ब्रांड दिशानिर्देशों के अनुसार उपयोग किया गया है।
वेब फ्रेमवर्क
Vue सार्वजनिक वेबसाइट के नेविगेशन, दस्तावेज़ और अन्य इंटरैक्टिव हिस्सों के कंपोनेंट बनाता है, ताकि इंटरफ़ेस को संभालना और बढ़ाना आसान रहे।
लोगो © Evan You. CC BY-NC-SA 4.0 · बिना बदलाव
Discord के लिए लाइब्रेरी
Discord से जुड़ने के लिए हम Twilight का उपयोग करते हैं। यह लाइब्रेरी Rust में लिखे हमारे बॉट को Discord से जोड़ती है।
Fezhoof का लोगो. CC BY-SA 4.0 · बिना बदलाव
डेटाबेस
Dragonfly Discord इवेंट, शार्ड और अनेक गेटवे कनेक्शन के समन्वय, AutoMod और गतिविधि लॉग के लिए हमारा साझा अस्थायी डेटा स्टोर है।
सॉफ़्टवेयर अतिरिक्त उपयोग अनुमति सहित BSL 1.1 के अंतर्गत।
रिलेशनल डेटाबेस
PostgreSQL संबंधपरक डेटा और संरचनाओं के लिए हमारी डेटा लेयर को पूरा करता है। यह ScyllaDB के साथ हमारी इंफ्रास्ट्रक्चर के एक अलग हिस्से के रूप में चलता है।
डेटाबेस
ScyllaDB, PostgreSQL के साथ हमारी डेटा लेयर का हिस्सा है। Fjord के भीतर दोनों प्रणालियों का उपयोग अलग-अलग कामों के लिए किया जाता है।
ऑब्जेक्ट स्टोरेज
हम S3-संगत ऑब्जेक्ट स्टोरेज के लिए RustFS का उपयोग करते हैं। यह PostgreSQL और ScyllaDB के साथ एक अलग स्टोरेज लेयर जोड़ता है।
सॉफ़्टवेयर लाइसेंस Apache 2.0. RustFS, RustFS, Inc. का ट्रेडमार्क है।