Discord qanday qilib milliardlab xabarlarni saqlay oladi?

Discord qanday qilib milliardlab xabarlarni saqlay oladi?

Discord qanday qilib milliardlab xabarlarni saqlay oladi?

Discordning birinchi versiyasi 2015chi yili 2 oyda ishlab chiqilgan va ular o’sha paytda MongoDBdan foydalanishgan. Sababi MongoDB tezda nimadir qurish/qilish uchun juda ham qulay. Lekin o’sha yilning oxiriga kelganda va taxminan 100 millionga yaqin xabar MongoDBda saqlanganda, tezlik sekinlashishni boshlagan. Boshqa databasega ko’chish vaqti kelgan.

Bu yerda PostgreSQL yoki MySQL kabi relational ma’lumotlar bazasi haqida gap bo’lishi mumkin emas. Gap millionlab xabarlar haqida ketyapti va bu millionlab xabarlarni 1 sekund emas, bir necha millisekundda olib chiqib berish kerak. Relational databaselar shunchaki bunaqa darajada ishlay olmaydi. Ular JOIN qilganicha bir necha sekund o’tib ketadi. Shuning uchun Discord faqat NoSQL ma’lumotlar bazasiga ko’cha oladi xolos, xuddi MongoDB kabi.

NoSQL bazalarning yaxshi tomoni shundaki, ular juda tez ishlaydi. Yomon tarafi shundaki, ular tez ishlashi uchun, ishlatishdan oldin siz qanday ishlatishingizni aniq bilishingiz kerak. Qanaqa querylar bo’ladi, bazadan o’qish qanaqa bo’ladi, yozish qanaqa bo’ladi va hokazo. Faqatgina shunda NoSQL bazalarni qiynalmasdan ishlata olasiz. Agar siz bu narsalarni bilmasangiz va ma’lumotlar bazangizni noto’g’ri dizayn qilib qo’ysangiz, ancha-muncha qiynalib qolasiz. Chunki hamma narsani bemalol JOIN qila olmaysiz relational databaselarga o’xshab. Oldindan JOIN qilingan design qilgan bo’lishingiz kerak.

Discordda esa bunday muammo bo’lmagan. Ularda tajriba katta, 100 millionga yaqin xabarlarni boshlaridan o’tkazishgan. Ular qanday read/write patternlar borligini aniq bilishgan:

— Read va write querylar soni deyarli teng: 50/50.

— Voice chat aktiv bo’lgan serverlarda deyarli xabar yuborilmaydi.

— Shaxsiy serverlarda yiliga 100 mingdan 1 milliongacha xabarlar yuboriladi. Lekin bunday serverlarda foydalanuvchilar soni 100 dan past bo’lgani uchun yuborilgan xabarlarni hadeb ham o’qilavermaydi. Bu degani xabarlar cachedan chiqib ketadi. Ularni qayta o’qish uchun databasega murojaat qilish kerak bo’ladi.

— Katta public serverlarda tonnalab xabar yuboriladi. Ularda minglab foydalanuvchilar mavjud va ular odatda oxirgi soatda jo’natilgan xabarlarga qiziqadi xolos. Bu degani o’sha xabarlar odatda cacheda bo’ladi degani.

Undan tashqari Discordda «open source bo’lishi kerak», «sinovdan o’tgan bo’lishi kerak», «maintain qilish oson bo’lishi kerak», «birorta qismi yiqilib tushsa avtomatik tarzda o’zini o’zi tuzata olishi kerak» kabi talablar bo’lgan.

Shularni hisobga olib, ular Cassandra da to’xtashgan. Bu databaseni Netflix va Apple ham juda aktiv tarzda ishlatganlari uchun Discord qo’rqmasdan bu qarorni qabul qilgan.

Shunday qilib, millionlab xabarlar va boshqa ma’lumotlarni MongoDBdan Cassandraga ko’chirib o’tishgan.

Bunday katta loyihalarda bunaqa katta o’zgarishni shunchaki qilib bo’lmaydi. Chunki sinovdan o’tmaganda. Shuning uchun ham Discord yangi databaseni «shadow mode» da ishga tushirgan. Bu degani ham eski MongiDB ishlab turadi, ham yangi Cassandra ishlaydi. Ha, bir vaqtning o’zida. Agar yaxshi ishlasa eski MongoDBni o’chirib qo’yadi.

Yaxshi ham shadow modeda ishga tushirishgan ekan. Chunki ularni yaxshigina muammolar kutib turgan ekan.

Qolganini keyingi postda davom ettiraman.

Manba:

Ma‘lumotlar Ombori
Discord qanday qilib milliardlab xabarlarni saqlay oladi?