Katta miqyosdagi onlayn ilovalar oldingi yigirma yil ichida uzoq yo'lni bosib o'tdi. Ushbu yangiliklar bizning dasturiy ta'minotni ishlab chiqish haqidagi tasavvurimizni o'zgartirdi. Masalan, Facebook, Instagram va Twitter keng ko'lamli platformalardir.
Ushbu tizimlar katta hajmdagi trafik va ma'lumotlarni boshqarish uchun qurilgan bo'lishi kerak, chunki butun dunyo bo'ylab milliardlab odamlar bir vaqtning o'zida ulardan foydalanadilar. Bu qachon tizim dizayni rasmga kiradi.
Muayyan mezonlarga javob beradigan tizim uchun arxitektura, interfeyslar va ma'lumotlarni yaratish jarayoni tizim dizayni deb nomlanadi. Birlashgan va samarali tizimlar orqali tizim dizayni sizning biznesingiz yoki tashkilotingiz talablarini qondiradi.
Sizning kompaniyangiz yoki tashkilotingiz o'z mezonlarini aniqlagandan so'ng, siz ularni iste'molchilar talablariga javob beradigan jismoniy tizim dizayniga qo'shishni boshlashingiz mumkin.
Siz buyurtmachi ishlab chiqish, tijorat yechimlari yoki ikkalasining kombinatsiyasidan foydalanishni tanlaysizmi, tizimingizni qanday loyihalashtirganingiz uni qanday qurishingizni aniqlaydi.
Biz ushbu postda Twitter xronologiyasining tizim dizaynini batafsil ko'rib chiqamiz, o'quv qo'llanma. Qani boshladik.
1-qadam: Foydalanish holatlari va cheklovlarni belgilang
Foydalanish holati
- Foydalanuvchi tvit yuklaydi.
- Xizmat tvitlar izdoshlariga push-bildirishnomalar va elektron pochta xabarlarini yuboradi.
- Foydalanuvchining vaqt jadvali ko'riladi (foydalanuvchining faoliyati)
- Foydalanuvchi uy vaqt jadvaliga qaraydi (foydalanuvchi kuzatayotgan odamlar faoliyati)
- Kalit so'zlar foydalanuvchi tomonidan qidiriladi.
- Xizmat haqiqatan ham mavjud.
Qo'llash doirasi tashqarisida
- Tvitlar ushbu xizmat yordamida Twitter Firehose va boshqa oqimlarga yuboriladi.
- Xizmat foydalanuvchining ko‘rinish sozlamalari asosida tvitlarni olib tashlaydi.
- Agar foydalanuvchi ham javob berilayotgan shaxsni kuzatmasa, javobni yashiring.
- "Retvitlarni yashirish" variantiga rioya qiling.
- Tahlillar
Cheklovlar va taxminlar
Davlat taxminlari
- Trafik teng taqsimlanmagan.
- Tvit yuborish oson bo'lishi kerak.
- Agar millionlab izdoshlaringiz bo'lmasa, barcha izdoshlaringizga tvit yuborish tez bo'lishi kerak.
- 100 million faol foydalanuvchi mavjud.
- Har oyda 15 milliard tvit yoki har kuni 500 million tvit
- Har bir tvitda o'rtacha 10 ta etkazib berish fanouti mavjud.
- Fanout har kuni 5 milliard tvit yuboradi.
- Fanout har oy 150 milliard tvit yuboradi.
- 250 milliard oylik o'qish so'rovlari
- 10 milliard oylik qidiruvlar
Timeline
- Vaqt jadvalini boshqarish oson bo'lishi kerak.
- Twitter yozishdan ko'ra ko'proq o'qish haqida.
- Tvitlarni tez o'qish uchun optimallashtiring
- Tvitlarni iste'mol qilish ko'p vaqt talab etadi.
Qidirish
- Qidiruv jarayoni tez bo'lishi kerak.
- Qidirish ko'p vaqt talab etadi.
Foydalanishni hisoblang
Har bir tvit hajmi:
- 8 bayt tvit identifikatori
- 32 bayt foydalanuvchi identifikatori
- 140 bayt matn
- media - o'rtacha 10 KB
- Jami: ~10 KB
Har oyda 150 TB yangi tvit kontenti yaratiladi.
- * Har kuni 500 million tvit * Oyiga 30 kun * Har bir tvit uchun 10 KB
- Uch yil ichida 5.4 PB yangi tvit kontenti mavjud edi.
Har soniyada 100,000 XNUMX ta o'qish so'rovlari mavjud.
- * (soniyada 400 ta so'rov / oyiga 1 milliard so'rov) har oyda 250 milliard o'qish so'rovi
Har soniyada 6,000 ta tvit bor.
- * (soniyada 400 ta so'rov / oyiga 1 milliard so'rov) har oyda 15 milliard tvit
Fanoutda har soniyada 60 ming tvit yuboriladi.
- Fanout har oy 150 milliard tvit yuboradi* (soniyada 400 ta soʻrov / oyiga 1 milliard soʻrov).
Har soniyada 4,000 ta ma'lumot so'rovi
- * (soniyada 400 ta so'rov / oyiga 1 milliard so'rov) har oyda 10 milliard qidiruv
Ba'zi foydali konvertatsiya
- Har oyda 2.5 million soniya o'tadi.
- Bir soniyada 2.5 ta so'rovda oyiga 1 million so'rov
- Oyiga 100 million so'rov x soniyasiga 40 ta so'rov
- Oyiga 1 milliard so'rov = soniyada 400 ta so'rov
2-qadam: Yuqori darajadagi diagramma
3-qadam: Asosiy komponentlarni tushuntirish
Agar ular tvit yuborsa, foydalanuvchi vaqt jadvalini (foydalanuvchining faoliyati) relyatsion ma'lumotlar bazasida to'ldirish uchun foydalanuvchining o'z tvitlarini saqlashimiz mumkin. Tvitlarni yuborish va asosiy vaqt jadvalini ishlab chiqish qiyinroq (foydalanuvchi kuzatadigan shaxslar faoliyati).
Oddiy relyatsion ma'lumotlar bazasi barcha izdoshlar uchun tvitlarni tarqatish orqali to'lib-toshgan bo'lardi (har soniyada 60 ming tvit yuboriladi). Biz, ehtimol, NoSQL ma'lumotlar bazasi yoki xotira keshi kabi tez yoziladigan ma'lumotlarni saqlashni xohlaymiz.
Xotiradan ketma-ket 1 MB o'qish taxminan 250 mikrosekundni oladi, lekin SSD-dan o'qish 4 baravar, diskdan o'qish esa 80 baravar ko'proq vaqt oladi.
Ob'ektlar do'koni tasvirlar va videolar kabi ma'lumotlarni saqlash uchun ishlatilishi mumkin.
- Teskari proksi-server vazifasini bajaruvchi veb-server mijozdan tvit oladi.
- So'rov Write API serveriga veb-server tomonidan yuboriladi.
- Write API tvitni foydalanuvchining vaqt jadvalidagi SQL ma'lumotlar bazasiga saqlaydi.
Fan-Out xizmati Write API orqali bog'lanadi va u quyidagi vazifalarni bajaradi.
- Foydalanuvchi grafigi xizmatiga so'rov yuborish orqali foydalanuvchi izdoshlarini Xotira keshida topadi.
- Xotira keshida tvit foydalanuvchi izdoshlarining uy xronologiyasida saqlanadi.
- 1,000 ta izdosh = 1,000 ta qidiruv va qoʻshimchalar = O(n) operatsiyasi.
- Tvit tez qidirish uchun Qidiruv indeksi xizmatida saqlanadi.
- Ob'ektlar do'koni media saqlash uchun ishlatiladi.
- Bildirishnoma xizmati orqali obunachilarga push ogohlantirishlarni yuboradi.
- Ogohlantirishlarni asinxron yuborish uchun u Navbatdan foydalanadi.
Xotira keshi Redis bo'lsa, biz quyidagi tuzilishga ega mahalliy Redis ro'yxatidan foydalanishimiz mumkin:
Foydalanuvchining uy vaqt jadvali Xotira keshida saqlanadigan yangi tvit bilan yangilanadi. Biz quyidagi umumiy REST API dan foydalanamiz:
Foydalanuvchi vaqt jadvali foydalanuvchi tomonidan ko'riladi.
- Veb-server mijozdan foydalanuvchining vaqt jadvali so'rovini oladi.
- So'rov veb-server tomonidan Read API serveriga yuboriladi.
- Read API foydalanuvchi vaqt oralig'i uchun SQL ma'lumotlar bazasini so'raydi.
REST API uy vaqt jadvaliga o'xshash ishlaydi, bundan mustasno, barcha tvitlar ular kuzatadigan odamlardan emas, balki foydalanuvchidan kelib chiqadi.
Foydalanuvchi kalit so'zlarni qidiradi:
- Veb-server mijozdan qidiruv so'rovini oladi.
- So'rov veb-server tomonidan Search API serveriga yuboriladi.
4-qadam: Twitter xronologiyasi
Vaqt jadvalini yaratish qiyin ish. Veb yoki dastur serverlariga havola qiluvchi vaqt jadvalini yaratuvchi server talab qilinadi.
Foydalanuvchi har safar tizimga kirganida, vaqt jadvali xizmati foydalanuvchilarning eng yangi tvitlarini kuzatuvchilar jadvalidagi kuzatib boradi va foydalanuvchi vaqt jadvalini yangilaydi yoki yangilaydi.
Biz bu yerda hech qanday reyting tizimini qo'llamaymiz; Buning o'rniga, foydalanuvchi izdoshlarining eng yaxshi 5 tvitlari yaratilish vaqti bo'yicha xronologiyada taqdim etilgan deb taxmin qilamiz. Biz 50 tvitli yangilanishni saqlab qolishimiz mumkin. Bu chegaraga yetgandan keyin ham foydalanuvchi sahifani yangilamaguncha yangilash yoki vaqt jadvalini tuzishni to‘xtatamiz.
Yuqori kechikish va unumdorlik bilan bog'liq muammolar jonli foydalanuvchi tasmasini yaratishdan kelib chiqadi. Buning o'rniga, bir zumda taqdim etilishi mumkin bo'lgan oflayn oqim yaratish unumdorlikni oshirishning eng yaxshi usuli hisoblanadi. Tasmani yaratilgan vaqtga qarab yangilash uchun dastur serveriga muntazam ravishda ping yuboradigan maxsus vaqt jadvali serverlarini ishga tushiring.
Reyting algoritmi muhim signallarni hisobga olishi va foydalanuvchining vaqt jadvalida ular kuzatib boradigan bir yoki bir nechta hisobdagi materiallar ustunlik qilmasligini kafolatlash uchun og'irlikni ta'minlashi kerak.
Aniqrog‘i, biz yoqtirishlar, sharhlar, baham ko‘rishlar soni va yangilanish vaqti kabi har qanday tasmaning dolzarbligiga oid xususiyatlarni tanlashimiz mumkin. Ushbu mezonlarning har biri tvitni baholash uchun ishlatilishi kerak, keyin esa bu daraja vaqt jadvalidagi tvitlarni ko'rsatish uchun ishlatilishi kerak.
Yangiliklar tasmasi uchun yangi kontent mavjud bo'lganda foydalanuvchilarni doimiy ravishda ogohlantirishimiz kerakmi? Foydalanuvchilar yangi ma'lumotlar paydo bo'lganda ogohlantirishni foydali deb bilishlari mumkin. Biroq, mobil qurilmalarda ma'lumotlardan foydalanish juda qimmat bo'lsa, u o'tkazish qobiliyatini yo'qotishi mumkin.
Natijada, biz ma'lumotlarni mobil qurilmalarga o'tkazmaslikni tanlashimiz mumkin va buning o'rniga foydalanuvchilarga yangi e'lonlar uchun "Yangilanish uchun tortib olish" imkonini beradi.
5-qadam: masshtab dizayni
Mumkin bo'lgan to'siq Fanout xizmatidir. Millionlab obunachilarga ega Twitter foydalanuvchilari o'zlarining tvitlari paydo bo'lishi uchun bir necha daqiqa kutishlari kerak bo'ladi. Bu tvitga javoblar bilan poygaga olib kelishi mumkin, biz tvitlarni xizmat vaqtida qayta tartiblash orqali oldini olishimiz mumkin.
Bundan tashqari, ko'p sonli izdoshlari bo'lgan odamlarning tvitlari tarqalishining oldini olishimiz mumkin. Buning o'rniga, biz ko'p kuzatilgan shaxslarning tvitlarini qidirishimiz, qidiruv natijalarini foydalanuvchining uy xronologiyasi natijalari bilan birlashtirishimiz va keyin tvitlarni xizmat vaqtida qayta tartiblashimiz mumkin.
Qo'shimcha yaxshilanishlarga quyidagilar kiradi:
- Har bir uy vaqt jadvali uchun Xotira keshida faqat bir necha yuz tvit saqlang.
- Xotira keshida faqat faol foydalanuvchilarning uy vaqt jadvali ma'lumotlari saqlanadi.
- Agar foydalanuvchi oldingi 30 kun ichida faol bo'lmagan bo'lsa, biz SQL ma'lumotlar bazasidan xronologiyani qayta qurishimiz mumkin.
- Foydalanuvchining kimligini bilish uchun foydalanuvchi grafik xizmatidan foydalaning.
- Tvitlarni SQL ma'lumotlar bazasidan olish orqali xotira keshiga qo'shing.
- Tweet Info xizmati faqat bir oylik tvitlarni saqlashi mumkin.
- Foydalanuvchi haqida ma'lumot xizmatida faqat faol foydalanuvchilar saqlanadi.
- Kechikishni past darajada ushlab turish uchun Qidiruv klasteri tvitlarni xotirada saqlashi kerak.
Xulosa
Twitter yirik tashkilot bo'lsa-da, u yaxshiroq tizim dizaynini tushunish. Men sizga Twitter xronologiyasining yuqori darajadagi umumiy ko'rinishini taqdim etish uchun qo'limdan kelganini qildim.
Umid qilamanki, siz undan foydali ma'lumotlarga ega bo'ldingiz va undan yaxshi foydalana olasiz.
Leave a Reply