Nega Discord loyihasi Go tilida yozilgan servisni Rustda qayta yozib chiqdi

Nega Discord loyihasi Go tilida yozilgan servisni Rustda qayta yozib chiqdi

Nega Discord loyihasi Go tilida yozilgan servisni Rustda qayta yozib chiqdi

Discordni 614 millionga yaqin foydalanuvchi ishlatadi. Ulardan 200 milliontasi aktiv tarzda ishlatadi. Hazillashadigan raqamlar emas.

Xullas shu Discordda har bir foydalanuvchi qaysi kanallarni va qaysi xabarlarni o’qiganini o’zida saqlab turadigan «Read Service» degan servisi bor. Kimdirlar buni microservice deb atashlari mumkin. Bu degani, har safar Discordga kirganingizda, har safar xabar yuborilganda va o’qilganda ishlatiladigan service. Ya’ni eng ko’p ishlatiladigan servicelardan biri. Gap millionlab requestlar haqida ketyapti. Va bu service Go tilida yozilgan ekan.

Boshida hammasi yaxshi bo’lgan, lekin vaqt o’tib har bir necha daqiqada ushbu service qisqa vaqtga sekinlashib qolishni boshlagan: latency va CPUlarda o’sish kuzatilgan. Discord jamoasi bu sekinlashish «Garbage Collection»ni deb bo’layotganini aniqlagan. O’zi Garbage Collection (ahlat tozalash) nima?

Sizning dasturingiz kompyuter xotirasidan foydalanadi. Aytaylik bitta o’zgaruvchi yaratib shu o’zgaruvchida ismingizni saqlasangiz shu ma’lumot xotiraga yoziladi. Dasturingiz bu ma’lumotdan foydalanib bo’lgandan so’ng kompyuter xotirasidan uni o’chirib tashlash kerak. Agar shu tarzda tez-tez tozalanib turmasa xotirada joy qolmaydi va tabiiyki hech nima ishlamay qoladi.

Go tilida bu ish avtomatik tarzda bajariladi. Taxminan har ~2 daqiqada Go tili xotiradagi har bir ma’lumotni tekshirib chiqadi. «Sen hali ham ishlatilyapsanmi?» deb so’raydi. «Ha, men hali ham dasturga kerakman» desa, «Bo’pti, qolaver. Propiskangni uzaytiraman» deydi. «Yo’q, meni ishlatib bo’ldi dastur. 2 daqiqadan beri ishsiz o’tiribman» desa, «Unda senga rahmat, ketaver qishlog’ingga» deb u ma’lumotni o’chirib tashlaydi.

Ana endi eslang. «Read Service» ni millionlab foydalanuvchi ishlatadi va har bir foydalanuvchi uchun ko’plab ma’lumot saqlanadi. Undan tashqari bu service juda ham aktiv, har sekundda millionlab request keladi. Ya’ni, tozalash kerak bo’lishi mumkin bo’lgan ma’lumot juda juda ko’p. Garbage Collector hammasini har 2 daqiqada tekshirib chiqish uchun yaxshigina kuch va vaqt sarflaydi. Natijada dastur sekinlashadi. Garbage Collectionni esa o’chirib qo’yib bo’lmaydi. Unda Go tili ishlamay qolgan bo’lar edi.

Ana endi Rustni eslaymiz. Rust tilida Garbage Collection umuman yo’q. Xotirani u boshqa usulda boshqaradi. Xotiradagi ma’lumot ishlatib bo’lishiga darhol uni o’chirib tashlaydi. 2 daqiqa kutib o’tirmaydi. Natijada tozalash uchun Go kabi ko’p kuch va vaqt sarflamaydi.

Shuning uchun ham Discord «Read Service» ni Rust tilida qayta yozib chiqqan va zo’r natijalarga erishgan. Tezlikdan tashqari, ularning aytishi bo’yicha kodning o’zi ham ancha osonlashgan. Sababi qiyin asinxron kodni Rustda Go tiliga solishtirgan yozish ancha osonroq.

«Go baribir top» deb yozishni boshlaydiganlar uchun eslatib o’tay. Hech kim Rustni Godan ko’ra ustunroq demayapti. Shunchaki Discord uchun va aynan ushbu service uchun Rust ko’proq to’g’ri kelgan.

Manba:

Boshqalar
Nega Discord loyihasi Go tilida yozilgan servisni Rustda qayta yozib chiqdi

Оставьте комментарий