Scaling and benchmarking a critical message bus using a new indexing strategy
🇬🇧 English
Aria is the firm's internal messaging framework and hosted system, processing multiple terabytes of data per day. Clients subscribe to Aria to receive a live stream of messages. As usage has rapidly grown, the Aria team has had to re-architect the system to keep pace with rising data volume and throughput. This summer, intern Theodor Totev focused on a specific use case: making it cheaper for clients to read just a subset of messages. His work using indexing and tree-splitting led to a 30% decrease in CPU usage on production workloads, while maintaining the high standard of correctness that such a critical system requires.
When Aria delivers messages over TCP, it keeps recent messages, known as the stream tip, in an in-memory ring buffer. Clients that fall behind can request recent messages from this buffer to catch up, a process called tip recovery. The challenge is that Aria stores the entire message stream, while clients often need only a small subset. Aria filters the stream by topic, and clients can subscribe to individual topics or to entire topic subtrees. The original approach was a simple linear pass over the stream. It was algorithmically inefficient but fast thanks to CPU cache friendliness. As the number of clients doing tip recovery grew, some servers reached 100% CPU utilization, causing clients to fall off the tip and fail to catch up.
An index for each topic was ruled out, since Aria instances can have almost a million topics. Instead, Theodor created an index for each topic partition, which groups all topics sharing the same two-segment prefix. Each partition's index records the location of its messages in the stream. When a client requests messages, Aria performs an n-way merge of the relevant indexes using a min-heap, reconstructing the in-order stream for only the requested partitions.
Benchmarking was central to the work. Theodor built a profiling tool to test variables such as the number of topic partitions, the degree of interleaving, and the number of readers. Profiling the initial implementation revealed that the min-heap was the biggest bottleneck.
🇸🇦 العربية
توسيع ناقل الرسائل باستراتيجية فهرسة جديدة
Aria هو إطار المراسلة الداخلي للشركة ونظامها المستضاف، ويعالج عدة تيرابايتات من البيانات يوميًا. يشترك العملاء في Aria لتلقي تدفق حي من الرسائل. ومع النمو السريع للاستخدام، اضطر فريق Aria إلى إعادة هيكلة النظام لمواكبة تزايد حجم البيانات والإنتاجية. في هذا الصيف، ركّز المتدرب Theodor Totev على حالة استخدام محددة: جعل قراءة مجموعة فرعية فقط من الرسائل أقل تكلفة للعملاء. وقد أدى عمله باستخدام الفهرسة وتقسيم الأشجار إلى انخفاض بنسبة 30% في استهلاك المعالج على أحمال الإنتاج، مع الحفاظ على المستوى العالي من الدقة الذي يتطلبه نظام بهذه الأهمية.
عندما يسلّم Aria الرسائل عبر TCP، فإنه يحتفظ بالرسائل الحديثة، والمعروفة باسم طرف التدفق، في مخزن حلقي داخل الذاكرة. ويمكن للعملاء المتأخرين طلب الرسائل الحديثة من هذا المخزن للّحاق بالتدفق، وتُسمى هذه العملية استعادة الطرف. التحدي هو أن Aria يخزّن تدفق الرسائل بالكامل، بينما لا يحتاج العملاء غالبًا إلا إلى جزء صغير منه. يقوم Aria بتصفية التدفق حسب الموضوع، ويمكن للعملاء الاشتراك في موضوعات فردية أو في أشجار موضوعات كاملة. كان النهج الأصلي مرورًا خطيًا بسيطًا على التدفق، وهو غير فعّال خوارزميًا لكنه سريع بفضل ملاءمته لذاكرة التخزين المؤقت للمعالج. ومع تزايد عدد العملاء الذين يستعيدون الطرف، بلغت بعض الخوادم 100% من استخدام المعالج، مما أدى إلى خروج العملاء من الطرف وعجزهم عن اللحاق.
تم استبعاد إنشاء فهرس لكل موضوع، إذ قد تحتوي مثيلات Aria على ما يقارب مليون موضوع. وبدلاً من ذلك، أنشأ Theodor فهرسًا لكل قسم موضوعات، وهو مجموعة تضم جميع الموضوعات التي تشترك في البادئة نفسها المكونة من مقطعين. يسجّل فهرس كل قسم مواقع رسائله في التدفق. وعندما يطلب عميل رسائل، ينفّذ Aria دمجًا متعدد الاتجاهات للفهارس ذات الصلة باستخدام كومة دنيا، فيعيد بناء التدفق المرتب للأقسام المطلوبة فقط.
كان القياس المرجعي محوريًا في هذا العمل. فقد بنى Theodor أداة تحليل أداء لاختبار متغيرات مثل عدد أقسام الموضوعات ودرجة التداخل وعدد القرّاء. وكشف تحليل الأداء للتطبيق الأولي أن الكومة الدنيا كانت أكبر عنق زجاجة.
كيف قلّلت استراتيجية الفهرسة الجديدة استهلاك المعالج في Aria؟
من خلال فهرسة كل قسم موضوعات واستخدام دمج متعدد الاتجاهات مع كومة دنيا، يعيد Aria بناء تدفق الرسائل للأقسام المطلوبة فقط بدلًا من مسح التدفق كله خطيًا. وقد خفّض ذلك استهلاك المعالج بنسبة 30% على أحمال الإنتاج.
🇧🇩 বাংলা
নতুন ইন্ডেক্সিং কৌশলে মেসেজ বাস স্কেলিং
Aria হলো কোম্পানির অভ্যন্তরীণ মেসেজিং ফ্রেমওয়ার্ক এবং একটি হোস্টেড সিস্টেম, যা প্রতিদিন একাধিক টেরাবাইট ডেটা প্রক্রিয়া করে। ক্লায়েন্টরা লাইভ মেসেজ স্ট্রিম পাওয়ার জন্য Aria-তে সাবস্ক্রাইব করে। ব্যবহার দ্রুত বাড়ায় Aria দলকে ক্রমবর্ধমান ডেটার পরিমাণ ও থ্রুপুটের সঙ্গে তাল মিলিয়ে সিস্টেমটি পুনর্গঠন করতে হয়েছে। এই গ্রীষ্মে ইন্টার্ন Theodor Totev একটি নির্দিষ্ট ব্যবহারের ক্ষেত্রে কাজ করেছেন: ক্লায়েন্টদের জন্য মেসেজের একটি উপসেট পড়া আরও সাশ্রয়ী করা। ইন্ডেক্সিং ও ট্রি-স্প্লিটিং ব্যবহার করে তাঁর কাজ প্রোডাকশন ওয়ার্কলোডে CPU ব্যবহার 30% কমিয়েছে, এবং এমন একটি গুরুত্বপূর্ণ সিস্টেমের জন্য প্রয়োজনীয় উচ্চ নির্ভুলতার মানও বজায় রেখেছে।
Aria যখন TCP-এর মাধ্যমে মেসেজ পাঠায়, তখন সাম্প্রতিক মেসেজগুলো, যাকে স্ট্রিম টিপ বলা হয়, একটি ইন-মেমরি রিং বাফারে রাখে। যেসব ক্লায়েন্ট পিছিয়ে পড়ে, তারা এই বাফার থেকে সাম্প্রতিক মেসেজ চেয়ে নিয়ে ধরতে পারে, এই প্রক্রিয়াকে টিপ রিকভারি বলা হয়। চ্যালেঞ্জ হলো, Aria পুরো মেসেজ স্ট্রিম সংরক্ষণ করে, অথচ ক্লায়েন্টদের প্রায়ই এর ছোট একটি অংশই দরকার হয়। Aria টপিক অনুযায়ী স্ট্রিম ফিল্টার করে, এবং ক্লায়েন্টরা আলাদা টপিক বা পুরো টপিক সাবট্রিতে সাবস্ক্রাইব করতে পারে। মূল পদ্ধতিটি ছিল স্ট্রিমের একটি সরল রৈখিক পাস। অ্যালগরিদমিকভাবে এটি অদক্ষ ছিল, কিন্তু CPU ক্যাশ-বান্ধব হওয়ায় বেশ দ্রুত ছিল। টিপ রিকভারির ক্লায়েন্ট সংখ্যা বাড়লে কিছু সার্ভার 100% CPU ব্যবহারে পৌঁছায়, ফলে ক্লায়েন্টরা টিপ থেকে ছিটকে পড়ে এবং ধরতে পারেনি।
প্রতিটি টপিকের জন্য ইন্ডেক্স তৈরির পরিকল্পনা বাতিল করা হয়, কারণ Aria ইনস্ট্যান্সে প্রায় দশ লক্ষ টপিক থাকতে পারে। বরং Theodor প্রতিটি টপিক পার্টিশনের জন্য একটি ইন্ডেক্স তৈরি করেন, যা একই দুই-অংশের প্রিফিক্সযুক্ত সব টপিককে একত্র করে। প্রতিটি পার্টিশনের ইন্ডেক্স স্ট্রিমে তার মেসেজের অবস্থান নথিভুক্ত করে। ক্লায়েন্ট মেসেজ চাইলে, Aria একটি মিন-হিপ ব্যবহার করে সংশ্লিষ্ট ইন্ডেক্সগুলোর n-way মার্জ করে, এবং শুধু অনুরোধ করা পার্টিশনগুলোর জন্য ক্রমানুসারে স্ট্রিম পুনর্গঠন করে।
এই কাজে বেঞ্চমার্কিং কেন্দ্রীয় ছিল। Theodor টপিক পার্টিশনের সংখ্যা, ইন্টারলিভিংয়ের মাত্রা ও রিডারের সংখ্যার মতো ভেরিয়েবল পরীক্ষার জন্য একটি প্রোফাইলিং টুল তৈরি করেন। প্রাথমিক বাস্তবায়নের প্রোফাইলিংয়ে দেখা যায় মিন-হিপই সবচেয়ে বড় বাধা।
নতুন ইন্ডেক্সিং কৌশল Aria-তে CPU ব্যবহার কীভাবে কমাল?
প্রতিটি টপিক পার্টিশন ইন্ডেক্স করে এবং মিন-হিপসহ n-way মার্জ ব্যবহার করে, Aria পুরো স্ট্রিম রৈখিকভাবে স্ক্যান না করে শুধু অনুরোধ করা পার্টিশনগুলোর জন্য মেসেজ স্ট্রিম পুনর্গঠন করে। এতে প্রোডাকশন ওয়ার্কলোডে CPU ব্যবহার 30% কমেছে।
🇩🇪 Deutsch
Skalierung eines Nachrichtenbusses mit einer neuen Indexierungsstrategie
Aria ist das interne Messaging-Framework des Unternehmens und ein gehostetes System, das täglich mehrere Terabyte an Daten verarbeitet. Kunden abonnieren Aria, um einen Live-Stream von Nachrichten zu erhalten. Da die Nutzung rasant gewachsen ist, musste das Aria-Team das System neu strukturieren, um mit dem steigenden Datenvolumen und Durchsatz Schritt zu halten. In diesem Sommer konzentrierte sich der Praktikant Theodor Totev auf einen bestimmten Anwendungsfall: Es sollte für Kunden günstiger werden, nur eine Teilmenge der Nachrichten zu lesen. Seine Arbeit mit Indexierung und Baumaufteilung senkte die CPU-Auslastung unter Produktivlasten um 30 %, während das hohe Maß an Korrektheit erhalten blieb, das ein so kritisches System erfordert.
Wenn Aria Nachrichten über TCP zustellt, hält es die aktuellen Nachrichten, den sogenannten Stream-Tip, in einem Ringpuffer im Arbeitsspeicher vor. Kunden, die zurückfallen, können aktuelle Nachrichten aus diesem Puffer anfordern, um aufzuholen. Dieser Vorgang heißt Tip-Recovery. Die Herausforderung besteht darin, dass Aria den gesamten Nachrichtenstrom speichert, Kunden aber oft nur einen kleinen Teil benötigen. Aria filtert den Strom nach Themen, und Kunden können einzelne Themen oder ganze Themenunterbäume abonnieren. Der ursprüngliche Ansatz war ein einfacher linearer Durchlauf durch den Strom. Algorithmisch war er ineffizient, aber dank der guten Eignung für den CPU-Cache dennoch schnell. Mit der wachsenden Zahl der Clients, die eine Tip-Recovery durchführten, erreichten einige Server 100 % CPU-Auslastung, sodass Clients den Anschluss an den Tip verloren und nicht mehr aufholen konnten.
Ein Index für jedes Thema wurde verworfen, da Aria-Instanzen nahezu eine Million Themen haben können. Stattdessen erstellte Theodor einen Index für jede Themenpartition, die alle Themen mit demselben zweisegmentigen Präfix zusammenfasst. Der Index jeder Partition erfasst die Position ihrer Nachrichten im Strom. Fordert ein Client Nachrichten an, führt Aria einen n-Wege-Merge der relevanten Indizes mithilfe eines Min-Heaps aus und rekonstruiert so den geordneten Strom nur für die angefragten Partitionen.
Benchmarking war zentral für diese Arbeit. Theodor entwickelte ein Profiling-Werkzeug, um Variablen wie die Anzahl der Themenpartitionen, den Grad der Verschachtelung und die Anzahl der Leser zu testen. Das Profiling der ersten Implementierung zeigte, dass der Min-Heap der größte Engpass war.
Wie hat die neue Indexierungsstrategie die CPU-Auslastung in Aria gesenkt?
Durch die Indexierung jeder Themenpartition und einen n-Wege-Merge mit einem Min-Heap rekonstruiert Aria den Nachrichtenstrom nur für die angefragten Partitionen, statt den gesamten Strom linear zu durchsuchen. Dadurch sank die CPU-Auslastung unter Produktivlasten um 30 %.
🇪🇸 Español
Escalar un bus de mensajes con una nueva estrategia de indexación
Aria es el marco de mensajería interno de la empresa y un sistema alojado que procesa múltiples terabytes de datos al día. Los clientes se suscriben a Aria para recibir un flujo en vivo de mensajes. Como el uso ha crecido rápidamente, el equipo de Aria ha tenido que rediseñar el sistema para seguir el ritmo del aumento en el volumen de datos y el rendimiento. Este verano, la pasante Theodor Totev se centró en un caso de uso específico: hacer que sea más económico para los clientes leer solo un subconjunto de mensajes. Su trabajo con indexación y división de árboles redujo el uso de CPU en cargas de trabajo de producción en un 30%, manteniendo el alto nivel de exactitud que exige un sistema tan crítico.
Cuando Aria entrega mensajes por TCP, mantiene los mensajes recientes, llamados la punta del flujo, en un búfer circular en memoria. Los clientes que se retrasan pueden solicitar mensajes recientes de este búfer para ponerse al día, un proceso llamado recuperación de la punta. El desafío es que Aria almacena el flujo completo de mensajes, mientras que los clientes a menudo solo necesitan una pequeña parte. Aria filtra el flujo por tema, y los clientes pueden suscribirse a temas individuales o a subárboles completos de temas. El enfoque original era un recorrido lineal simple del flujo. Era algorítmicamente ineficiente, pero rápido gracias a su buena afinidad con la caché de CPU. A medida que crecía el número de clientes que realizaban la recuperación de la punta, algunos servidores alcanzaron un 100% de utilización de CPU, lo que hacía que los clientes se salieran de la punta y no pudieran ponerse al día.
Se descartó crear un índice por cada tema, ya que las instancias de Aria pueden tener casi un millón de temas. En su lugar, Theodor creó un índice por cada partición de temas, que agrupa todos los temas con el mismo prefijo de dos segmentos. El índice de cada partición registra la ubicación de sus mensajes en el flujo. Cuando un cliente solicita mensajes, Aria realiza una fusión de n vías de los índices relevantes usando un montículo mínimo, reconstruyendo el flujo ordenado solo para las particiones solicitadas.
La evaluación comparativa fue central en el trabajo. Theodor creó una herramienta de perfilado para probar variables como el número de particiones de temas, el grado de intercalado y el número de lectores. Al perfilar la implementación inicial, se descubrió que el montículo mínimo era el mayor cuello de botella.
¿Cómo redujo la nueva estrategia de indexación el uso de CPU en Aria?
Al indexar cada partición de temas y usar una fusión de n vías con un montículo mínimo, Aria reconstruye el flujo de mensajes solo para las particiones solicitadas, en lugar de recorrer todo el flujo de forma lineal. Esto redujo el uso de CPU en un 30% en cargas de trabajo de producción.
🇫🇷 Français
Faire évoluer un bus de messages avec une nouvelle stratégie d'indexation
Aria est le cadre de messagerie interne de l'entreprise, un système hébergé qui traite plusieurs téraoctets de données par jour. Les clients s'abonnent à Aria pour recevoir un flux de messages en direct. Comme l'utilisation a fortement augmenté, l'équipe d'Aria a dû repenser le système pour suivre le rythme de la hausse du volume de données et du débit. Cet été, le stagiaire Theodor Totev s'est concentré sur un cas d'usage précis : rendre moins coûteuse la lecture par les clients d'un sous-ensemble de messages. Ses travaux d'indexation et de découpage d'arbres ont entraîné une baisse de 30 % de l'utilisation du CPU sur les charges de production, tout en conservant le haut niveau de fiabilité qu'exige un système aussi critique.
Lorsque Aria transmet des messages via TCP, il conserve les messages récents, appelés la pointe du flux, dans un tampon circulaire en mémoire. Les clients en retard peuvent demander les messages récents à ce tampon pour rattraper leur retard, un processus appelé récupération de la pointe. Le défi tient au fait qu'Aria stocke l'intégralité du flux de messages, alors que les clients n'ont souvent besoin que d'une petite partie. Aria filtre le flux par sujet, et les clients peuvent s'abonner à des sujets individuels ou à des sous-arborescences entières. L'approche initiale consistait en un simple parcours linéaire du flux. Peu efficace sur le plan algorithmique, elle restait rapide grâce à sa compatibilité avec le cache du processeur. Avec l'augmentation du nombre de clients effectuant une récupération de la pointe, certains serveurs ont atteint 100 % d'utilisation du CPU, ce qui faisait décrocher les clients de la pointe, les empêchant de rattraper leur retard.
Un index par sujet a été écarté, car les instances d'Aria peuvent compter près d'un million de sujets. Theodor a donc créé un index par partition de sujets, regroupant tous les sujets partageant le même préfixe à deux segments. L'index de chaque partition enregistre l'emplacement de ses messages dans le flux. Lorsqu'un client demande des messages, Aria effectue une fusion à n voies des index concernés à l'aide d'un tas-min, reconstituant le flux ordonné pour les seules partitions demandées.
Le benchmarking a été au cœur de ce travail. Theodor a développé un outil de profilage pour tester des variables telles que le nombre de partitions de sujets, le degré d'entrelacement et le nombre de lecteurs. Le profilage de la première implémentation a révélé que le tas-min était le principal goulot d'étranglement.
Comment la nouvelle stratégie d'indexation a-t-elle réduit l'utilisation du CPU dans Aria ?
En indexant chaque partition de sujets et en utilisant une fusion à n voies avec un tas-min, Aria ne reconstitue le flux de messages que pour les partitions demandées, au lieu de parcourir linéairement tout le flux. Cela a réduit l'utilisation du CPU de 30 % sur les charges de production.
🇮🇳 हिन्दी
नई इंडेक्सिंग रणनीति के साथ मैसेज बस का स्केलिंग
Aria कंपनी का आंतरिक मैसेजिंग फ्रेमवर्क और होस्टेड सिस्टम है, जो प्रतिदिन कई टेराबाइट डेटा संसाधित करता है। क्लाइंट्स लाइव मैसेज स्ट्रीम प्राप्त करने के लिए Aria की सदस्यता लेते हैं। उपयोग तेजी से बढ़ने के कारण, Aria टीम को बढ़ती डेटा मात्रा और थ्रूपुट के अनुरूप सिस्टम को फिर से डिज़ाइन करना पड़ा। इस गर्मी में इंटर्न Theodor Totev ने एक विशेष उपयोग-मामले पर काम किया: क्लाइंट्स के लिए केवल मैसेज के एक उपसमूह को पढ़ना सस्ता बनाना। इंडेक्सिंग और ट्री-स्प्लिटिंग के उनके काम से प्रोडक्शन वर्कलोड पर CPU उपयोग 30% घटा, जबकि ऐसे महत्वपूर्ण सिस्टम के लिए आवश्यक उच्च सटीकता बनी रही।
जब Aria TCP के माध्यम से मैसेज भेजता है, तो वह हाल के मैसेज, जिन्हें स्ट्रीम टिप कहा जाता है, इन-मेमोरी रिंग बफ़र में रखता है। जो क्लाइंट पीछे रह जाते हैं, वे इस बफ़र से हाल के मैसेज मांगकर पकड़ बना सकते हैं, इस प्रक्रिया को टिप रिकवरी कहते हैं। चुनौती यह है कि Aria पूरी मैसेज स्ट्रीम संग्रहीत करता है, जबकि क्लाइंट्स को अक्सर उसका केवल छोटा हिस्सा चाहिए। Aria स्ट्रीम को टॉपिक के आधार पर फ़िल्टर करता है, और क्लाइंट्स अलग-अलग टॉपिक या पूरे टॉपिक सबट्री की सदस्यता ले सकते हैं। मूल तरीका स्ट्रीम का एक सरल रैखिक पास था। यह एल्गोरिदमिक रूप से अक्षम था, पर CPU कैश-फ्रेंडली होने के कारण तेज़ था। टिप रिकवरी करने वाले क्लाइंट्स की संख्या बढ़ने पर कुछ सर्वर 100% CPU उपयोग तक पहुँच गए, जिससे क्लाइंट्स टिप से छूट गए और पकड़ नहीं बना पाए।
हर टॉपिक के लिए इंडेक्स बनाने का विचार खारिज किया गया, क्योंकि Aria इंस्टेंस में लगभग दस लाख टॉपिक हो सकते हैं। इसके बजाय Theodor ने हर टॉपिक पार्टिशन के लिए इंडेक्स बनाया, जो एक ही दो-खंड उपसर्ग वाले सभी टॉपिक्स को समूहित करता है। हर पार्टिशन का इंडेक्स स्ट्रीम में उसके मैसेज की स्थिति दर्ज करता है। जब क्लाइंट मैसेज मांगता है, तो Aria मिन-हीप का उपयोग करके संबंधित इंडेक्स का n-वे मर्ज करता है और केवल अनुरोधित पार्टिशन के लिए क्रमबद्ध स्ट्रीम पुनर्निर्मित करता है।
इस काम में बेंचमार्किंग केंद्रीय थी। Theodor ने टॉपिक पार्टिशन की संख्या, इंटरलीविंग की मात्रा और रीडर्स की संख्या जैसे चरों की जाँच के लिए प्रोफाइलिंग टूल बनाया। प्रारंभिक कार्यान्वयन की प्रोफाइलिंग में पता चला कि मिन-हीप सबसे बड़ी बाधा थी।
नई इंडेक्सिंग रणनीति ने Aria में CPU उपयोग कैसे घटाया?
हर टॉपिक पार्टिशन को इंडेक्स करके और मिन-हीप के साथ n-वे मर्ज का उपयोग करके, Aria पूरी स्ट्रीम को रैखिक रूप से स्कैन करने के बजाय केवल अनुरोधित पार्टिशन के लिए मैसेज स्ट्रीम पुनर्निर्मित करता है। इससे प्रोडक्शन वर्कलोड पर CPU उपयोग 30% घटा।
🇮🇩 Bahasa Indonesia
Menskalakan Message Bus dengan Strategi Pengindeksan Baru
Aria adalah kerangka kerja pesan internal perusahaan dan sistem hosting yang memproses beberapa terabyte data per hari. Klien berlangganan Aria untuk menerima aliran pesan langsung. Karena penggunaannya tumbuh pesat, tim Aria harus merancang ulang sistem agar mampu mengimbangi peningkatan volume data dan throughput. Musim panas ini, magang Theodor Totev berfokus pada kasus penggunaan tertentu: membuat klien lebih hemat biaya saat hanya membaca sebagian pesan. Pekerjaannya menggunakan pengindeksan dan pemisahan pohon menurunkan penggunaan CPU sebesar 30% pada beban kerja produksi, sembari mempertahankan standar akurasi tinggi yang dibutuhkan sistem sekritis ini.
Ketika Aria mengirimkan pesan melalui TCP, ia menyimpan pesan terbaru, yang disebut ujung aliran, dalam ring buffer di memori. Klien yang tertinggal dapat meminta pesan terbaru dari buffer ini untuk mengejar ketertinggalan, proses yang disebut pemulihan ujung. Tantangannya, Aria menyimpan seluruh aliran pesan, padahal klien sering hanya membutuhkan sebagian kecil. Aria menyaring aliran berdasarkan topik, dan klien dapat berlangganan topik tertentu atau seluruh subpohon topik. Pendekatan awalnya adalah pemindaian linear sederhana pada aliran. Secara algoritmik tidak efisien, tetapi tetap cepat karena ramah terhadap cache CPU. Seiring bertambahnya jumlah klien yang melakukan pemulihan ujung, beberapa server mencapai penggunaan CPU 100%, sehingga klien terlepas dari ujung dan tidak dapat mengejar ketertinggalan.
Indeks untuk setiap topik ditolak karena instans Aria bisa memiliki hampir satu juta topik. Sebagai gantinya, Theodor membuat indeks untuk setiap partisi topik, yaitu kelompok semua topik yang memiliki awalan dua segmen yang sama. Indeks tiap partisi mencatat lokasi pesan-pesannya dalam aliran. Ketika klien meminta pesan, Aria melakukan penggabungan n-arah terhadap indeks yang relevan menggunakan min-heap, lalu merekonstruksi aliran berurutan hanya untuk partisi yang diminta.
Benchmarking menjadi inti dari pekerjaan ini. Theodor membangun alat profiling untuk menguji variabel seperti jumlah partisi topik, tingkat interleaving, dan jumlah pembaca. Profiling terhadap implementasi awal menunjukkan bahwa min-heap adalah hambatan terbesar.
Bagaimana strategi pengindeksan baru mengurangi penggunaan CPU di Aria?
Dengan mengindeks setiap partisi topik dan menggunakan penggabungan n-arah dengan min-heap, Aria hanya merekonstruksi aliran pesan untuk partisi yang diminta, alih-alih memindai seluruh aliran secara linear. Hal ini memangkas penggunaan CPU sebesar 30% pada beban kerja produksi.
🇯🇵 日本語
新しいインデックス戦略によるメッセージバスのスケーリング
Ariaは、当社の社内メッセージングフレームワークであり、1日に数テラバイトのデータを処理するホスト型システムです。クライアントはAriaを購読してメッセージのライブストリームを受け取ります。利用が急速に拡大したため、Ariaチームはデータ量とスループットの増加に対応するためにシステムを再設計する必要がありました。今夏、インターンのTheodor Totevは、クライアントがメッセージの一部だけを読む場合のコストを下げるという具体的なユースケースに取り組みました。インデックスとツリー分割を用いた彼の作業により、本番ワークロードでのCPU使用率は30%削減され、この重要なシステムに求められる高い正確性の基準も維持されました。
AriaはTCP経由でメッセージを配信する際、ストリームの末尾と呼ばれる最近のメッセージをメモリ内のリングバッファに保持します。遅れたクライアントは、このバッファから最近のメッセージを要求して追いつくことができ、この処理はティップリカバリーと呼ばれます。課題は、Ariaがストリーム全体を保存する一方で、クライアントは多くの場合そのごく一部しか必要としないことです。Ariaはトピックごとにストリームをフィルタリングし、クライアントは個別のトピックまたはトピックサブツリー全体を購読できます。当初の方法は、ストリームを単純に線形走査するものでした。アルゴリズム的には非効率でしたが、CPUキャッシュとの相性が良く、比較的高速でした。ティップリカバリーを行うクライアントが増えると、一部のサーバーはCPU使用率が100%に達し、クライアントがティップから外れて追いつけなくなりました。
Ariaのインスタンスはトピックが百万近くになることもあるため、トピックごとにインデックスを作る案は現実的ではないとして退けられました。代わりにTheodorは、同じ2セグメントの接頭辞を共有するすべてのトピックをまとめたトピックパーティションごとにインデックスを作成しました。各パーティションのインデックスは、そのメッセージのストリーム内の位置を記録します。クライアントがメッセージを要求すると、Ariaは最小ヒープを用いて関連するインデックスのn方向マージを行い、要求されたパーティションに限って順序通りのストリームを再構築します。
この作業ではベンチマークが中心的な役割を果たしました。Theodorはトピックパーティションの数、インターリーブの度合い、リーダーの数などの変数をテストするプロファイリングツールを作成しました。初期実装をプロファイリングしたところ、最小ヒープが最大のボトルネックであることがわかりました。
新しいインデックス戦略はAriaのCPU使用率をどのように削減しましたか?
各トピックパーティションにインデックスを作成し、最小ヒープを用いたn方向マージを行うことで、Ariaはストリーム全体を線形に走査するのではなく、要求されたパーティションに対してのみメッセージストリームを再構築します。これにより、本番ワークロードでのCPU使用率が30%削減されました。
🇧🇷 Português
Escalar um barramento de mensagens com uma nova estratégia de indexação
A Aria é o framework interno de mensagens da empresa e um sistema hospedado que processa vários terabytes de dados por dia. Os clientes assinam a Aria para receber um fluxo ao vivo de mensagens. Como o uso cresceu rapidamente, a equipe da Aria precisou reestruturar o sistema para acompanhar o aumento no volume de dados e na taxa de transferência. Neste verão, o estagiário Theodor Totev concentrou-se em um caso de uso específico: tornar mais barato para os clientes ler apenas um subconjunto de mensagens. Seu trabalho com indexação e divisão de árvores reduziu o uso de CPU em cargas de trabalho de produção em 30%, mantendo o alto padrão de precisão exigido por um sistema tão crítico.
Quando a Aria entrega mensagens via TCP, ela mantém as mensagens recentes, conhecidas como a ponta do fluxo, em um buffer circular na memória. Clientes que ficam para trás podem solicitar mensagens recentes desse buffer para se atualizar, processo chamado de recuperação da ponta. O desafio é que a Aria armazena todo o fluxo de mensagens, enquanto os clientes frequentemente precisam de apenas uma pequena parte. A Aria filtra o fluxo por tópico, e os clientes podem assinar tópicos individuais ou subárvores inteiras de tópicos. A abordagem original era uma varredura linear simples do fluxo. Era algoritmicamente ineficiente, mas rápida graças à afinidade com o cache da CPU. À medida que o número de clientes em recuperação da ponta aumentou, alguns servidores atingiram 100% de utilização de CPU, fazendo com que os clientes saíssem da ponta e não conseguissem se atualizar.
Um índice para cada tópico foi descartado, pois instâncias da Aria podem ter quase um milhão de tópicos. Em vez disso, Theodor criou um índice para cada partição de tópicos, que agrupa todos os tópicos com o mesmo prefixo de dois segmentos. O índice de cada partição registra a localização de suas mensagens no fluxo. Quando um cliente solicita mensagens, a Aria realiza uma intercalação de n vias dos índices relevantes usando um min-heap, reconstruindo o fluxo em ordem apenas para as partições solicitadas.
O benchmarking foi central para o trabalho. Theodor desenvolveu uma ferramenta de perfilamento para testar variáveis como o número de partições de tópicos, o grau de intercalação e o número de leitores. O perfilamento da implementação inicial revelou que o min-heap era o maior gargalo.
Como a nova estratégia de indexação reduziu o uso de CPU na Aria?
Ao indexar cada partição de tópicos e usar uma intercalação de n vias com um min-heap, a Aria reconstrói o fluxo de mensagens apenas para as partições solicitadas, em vez de varrer todo o fluxo linearmente. Isso reduziu o uso de CPU em 30% nas cargas de trabalho de produção.
🇷🇺 Русский
Масштабирование шины сообщений с новой стратегией индексации
Aria — это внутренняя система обмена сообщениями компании и размещённая платформа, которая обрабатывает несколько терабайт данных в день. Клиенты подписываются на Aria, чтобы получать живой поток сообщений. По мере стремительного роста использования команде Aria пришлось перестроить систему, чтобы успевать за ростом объёма данных и пропускной способности. Этим летом стажёр Theodor Totev занимался конкретным сценарием: сделать так, чтобы клиентам было дешевле читать лишь подмножество сообщений. Его работа с индексацией и разбиением деревьев снизила загрузку CPU на рабочих нагрузках в продакшене на 30% при сохранении высокого уровня корректности, необходимого для такой критически важной системы.
Когда Aria доставляет сообщения по TCP, она хранит недавние сообщения, так называемый хвост потока, в кольцевом буфере в оперативной памяти. Клиенты, которые отстали, могут запросить недавние сообщения из этого буфера, чтобы нагнать поток, — этот процесс называется восстановлением хвоста. Сложность в том, что Aria хранит весь поток сообщений, тогда как клиентам часто нужна лишь небольшая его часть. Aria фильтрует поток по темам, а клиенты могут подписываться как на отдельные темы, так и на целые поддеревья тем. Исходный подход представлял собой простой линейный проход по потоку. Он был алгоритмически неэффективен, но быстр благодаря дружелюбности к кэшу процессора. По мере роста числа клиентов, восстанавливающих хвост, некоторые серверы достигали загрузки CPU в 100%, из-за чего клиенты выпадали из хвоста и не могли нагнать поток.
Индекс для каждой темы отвергли, поскольку в экземплярах Aria может быть почти миллион тем. Вместо этого Theodor создал индекс для каждой партиции тем, которая объединяет все темы с одинаковым двухсегментным префиксом. Индекс каждой партиции фиксирует расположение её сообщений в потоке. Когда клиент запрашивает сообщения, Aria выполняет n-way слияние соответствующих индексов с помощью мин-кучи, восстанавливая упорядоченный поток только для запрошенных партиций.
Бенчмаркинг был центральным элементом работы. Theodor разработал инструмент профилирования для проверки таких параметров, как количество партиций тем, степень чередования и количество читателей. Профилирование первоначальной реализации показало, что самым большим узким местом была мин-куча.
Как новая стратегия индексации снизила загрузку CPU в Aria?
Индексируя каждую партицию тем и используя n-way слияние с мин-кучей, Aria восстанавливает поток сообщений только для запрошенных партиций, вместо линейного сканирования всего потока. Это снизило загрузку CPU на рабочих нагрузках в продакшене на 30%.
🇨🇳 简体中文
使用新的索引策略扩展消息总线
Aria 是公司的内部消息传递框架和托管系统,每天处理数TB的数据。客户端订阅 Aria 以接收实时消息流。随着使用量迅速增长,Aria 团队不得不重新架构该系统,以跟上不断增长的数据量和吞吐量。今年夏天,实习生 Theodor Totev 专注于一个具体用例:让客户端更经济地只读取消息的一个子集。他利用索引和树分割的工作,使生产工作负载上的 CPU 使用率降低了 30%,同时保持了此类关键系统所需的高标准正确性。
当 Aria 通过 TCP 投递消息时,它会将最近的消息(称为流尾部)保存在内存中的环形缓冲区里。落后的客户端可以从该缓冲区请求最近的消息以赶上进度,这一过程称为尾部恢复。挑战在于,Aria 存储的是完整的消息流,而客户端通常只需要其中很小的一部分。Aria 按主题过滤消息流,客户端可以订阅单个主题,也可以订阅整个主题子树。最初的方法是对消息流进行简单的线性遍历。它在算法上效率低下,但得益于 CPU 缓存友好性,速度较快。随着进行尾部恢复的客户端数量增加,一些服务器的 CPU 利用率达到了 100%,导致客户端脱离尾部,无法追赶上进度。
为每个主题建立索引的方案被否决了,因为 Aria 实例可能拥有近百万个主题。取而代之,Theodor 为每个主题分区建立了索引,主题分区将共享相同两段前缀的所有主题归为一组。每个分区的索引记录其消息在消息流中的位置。当客户端请求消息时,Aria 使用最小堆对相关索引执行 n 路归并,仅为所请求的分区按顺序重建消息流。
基准测试是这项工作的核心。Theodor 构建了一个性能分析工具,用于测试主题分区数量、交错程度和读取者数量等变量。对初始实现进行性能分析后发现,最小堆是最大的瓶颈。
新的索引策略如何降低 Aria 的 CPU 使用率?
通过为每个主题分区建立索引,并使用基于最小堆的 n 路归并,Aria 只需为所请求的分区重建消息流,而不必线性扫描整个消息流。这使生产工作负载上的 CPU 使用率降低了 30%。