MongoDB-ni Bilməməyin Dəyəri – Giriş

Bu seriyanın əsas məqsədi MongoDB-ni düzgün istifadə etməklə əldə edə biləcəyiniz əhəmiyyətli performans artımlarını və qənaət edə biləcəyiniz xərcləri nümayiş etdirməkdir. Buna ən yaxşı təcrübələrə əməl etmək, tətbiqinizin spesifik ehtiyaclarını öyrənmək və bu məlumatları məlumatlarınızı effektiv modelləşdirmək üçün istifadə etmək daxildir.

Bu potensial qazancları göstərmək üçün nümunə bir tətbiq təqdim edəcəyik. Sonra bu tətbiq üçün müxtəlif MongoDB tətbiqlərini inkişaf etdirəcək və yük testindən keçirəcəyik. Bu tətbiqlər müxtəlif MongoDB təcrübə səviyyələrinə xidmət edəcək: başlanğıc, orta, təcrübəli və heyrətamiz (🤯).

Bu seriyada istifadə olunan bütün kod və əlavə məlumatlar GitHub repozitoriyasında mövcuddur.

Tətbiq: Tranzaksiyalarda Fırıldaqçılıq Davranışının Aşkarlanması

Tətbiqin məqsədi maliyyə tranzaksiya sistemində fırıldaqçılıq davranışını müəyyən etməkdir. Bu, müəyyən bir istifadəçi üçün müəyyən bir zaman dövrü ərzində tranzaksiyaların statusunu təhlil etməklə həyata keçirilir. Mümkün tranzaksiya statusları bunlardır: approved, noFunds, pendingrejected. Hər bir istifadəçi 64 simvollu onaltılıq key dəyəri ilə unikal olaraq müəyyən edilir.

Tətbiq hər bir tranzaksiyanın təfərrüatlarını event sənədi vasitəsilə alır. Hər bir event sənədi bir istifadəçi üçün müəyyən bir gündə bir tranzaksiya haqqında məlumat ehtiva edir. Nəticədə, yalnız mümkün status sahələrindən birini ehtiva edəcək və bu sahənin rəqəmsal dəyəri 1 olacaq. Məsələn, aşağıdakı event sənədi key ...0001 olan istifadəçi üçün date 2022-02-01 tarixində baş vermiş pending tranzaksiyasını təmsil edir:

const event = {
  key: "0000000000000000000000000000000000000000000000000000000000000001",
  date: new Date("2022-02-01"),
  pending: 1,
};

Tranzaksiya statusları bir neçə keçmiş dövr üzrə hər bir statusun ümumi saylarını müqayisə etməklə təhlil edilir: oneYear, threeYears, fiveYears, sevenYearstenYears. Bu cəmlər istifadəçi key və hesabatın son date tarixini təqdim etməklə tələb oluna bilən reports sənədində təqdim olunur.

Aşağıda key ...0001 olan istifadəçi üçün son date tarixi 2022-06-15 olan reports sənədinin nümunəsi verilmişdir:

export const reports = [
  {
    id: "oneYear",
    end: new Date("2022-06-15T00:00:00.000Z"),
    start: new Date("2021-06-15T00:00:00.000Z"),
    totals: { approved: 4, noFunds: 1, pending: 1, rejected: 1 },
  },
  {
    id: "threeYears",
    end: new Date("2022-06-15T00:00:00.000Z"),
    start: new Date("2019-06-15T00:00:00.000Z"),
    totals: { approved: 8, noFunds: 2, pending: 2, rejected: 2 },
  },
  {
    id: "fiveYears",
    end: new Date("2022-06-15T00:00:00.000Z"),
    start: new Date("2017-06-15T00:00:00.000Z"),
    totals: { approved: 12, noFunds: 3, pending: 3, rejected: 3 },
  },
  {
    id: "sevenYears",
    end: new Date("2022-06-15T00:00:00.000Z"),
    start: new Date("2015-06-15T00:00:00.000Z"),
    totals: { approved: 16, noFunds: 4, pending: 4, rejected: 4 },
  },
  {
    id: "tenYears",
    end: new Date("2022-06-15T00:00:00.000Z"),
    start: new Date("2012-06-15T00:00:00.000Z"),
    totals: { approved: 20, noFunds: 5, pending: 5, rejected: 5 },
  },
];

Yük Testi Metodologiyası

Hər bir tətbiq versiyasının performansını qiymətləndirmək üçün yük altında paralel işləmək üçün iki funksiya hazırlanmışdır:

  1. Bulk Upsert: Event sənədlərini daxil edir.
  2. Get Reports: Müəyyən bir istifadəçi keydate üçün reports sənədi yaradır.

Bu funksiyaların paralel icrası worker thread-lər istifadə edilərək həyata keçirilmişdir, hər birinə 20 worker ayrılmışdır. Hər bir tətbiq versiyası 200 dəqiqə ərzində test edilmiş və bu müddət ərzində müxtəlif icra parametrləri tətbiq edilmişdir.

Bulk Upsert Funksiyası

Bulk Upsert funksiyası qeydiyyat üçün 250 event sənədindən ibarət partiyalar alır. Adından göründüyü kimi, bu qeydiyyatlar MongoDB-nin upsert funksionallığından istifadə edilərək həyata keçirilir ki, bu da sənədi yeniləməyə cəhd edir və ya yeniləmə əməliyyatından alınan məlumatlardan istifadə edərək mövcud deyilsə yenisini yaradır. Hər bir Bulk Upsert iterasiyası vaxtlanır və müddəti ikinci dərəcəli verilənlər bazasında qeyd edilir.

Partiya emal sürəti cəmi 200 dəqiqə olmaq üzrə dörd 50 dəqiqəlik fazaya bölünür. Sürət saniyədə bir partiya daxil etməklə başlayır və hər 50 dəqiqədə saniyədə bir partiya daxil etmə artırılır, son nəticədə saniyədə dörd partiya daxil etməyə (saniyədə 1000 event sənədinə ekvivalent) çatır.

Get Reports Funksiyası

Get Reports funksiyası hər icrada bir reports sənədi yaradır. Hər icranın müddəti vaxtlanır və ikinci dərəcəli verilənlər bazasında qeyd edilir.

reports yaratma sürəti dörd Bulk Upsert fazasının hər birində 10 alt-faza olaraq paylanmış 40 fazaya bölünür. Hər Bulk Upsert fazası daxilində Get Reports sürəti saniyədə 25 hesabat sorğusu ilə başlayır və hər beş dəqiqədə saniyədə 25 sorğu artır. Bu, həmin Bulk Upsert fazasının sonunda saniyədə 250 hesabat sorğusuna çatır.

Aşağıdakı qrafik test ssenarisi boyu Bulk UpsertGet Reports üçün hədəf sürətlərini göstərir:

Bulk Upsert və Get Reports üçün istənilən sürətlər

İlkin Ssenari və Məlumat Yaradılması

Tətbiq versiyaları arasında ədalətli müqayisə üçün testlər üçün ilkin məlumat dəsti (işçi dəst) MongoDB serverindəki mövcud yaddaşdan böyük olacaq şəkildə dizayn edilmişdir. Bu yanaşma əhəmiyyətli keş fəaliyyətini təmin edir və bütün işçi dəstinin yaddaşda yerləşməsinin qarşısını alır.

İlkin məlumat dəsti üçün aşağıdakı parametrlər müəyyən edilmişdir:

  • 10 il əhatə edən məlumatlar: 2010-01-01-dən 2020-01-01-ə qədər.
  • İldə 50 milyon event, cəmi 500 milyon event işçi dəsti.
  • İstifadəçi (key) başına ildə orta hesabla 60 event.

İldə 50 milyon event və istifadəçi başına ildə 60 event nəzərə alınanda, unikal istifadəçilərin ümumi sayı təqribən 833,333-dür (50,000,000 / 60). İstifadəçi key generatoru təqribən normal (Gauss) paylanmasına əməl edən açarlar yaratmaq üçün konfiqurasiya edilmişdir. Bu, bəzi istifadəçilərin digərlərindən daha çox event yaratdığı real dünya ssenarisi simulyasiya edir. Aşağıdakı qrafik yaradılmış 50 milyon açarın paylanmasını göstərir:

Açarların Paylanması

Real dünya ssenarisi daha da simulyasiya etmək üçün event statuslarının paylanması aşağıdakı kimi müəyyən edilmişdir:

  • 80% approved
  • 10% noFunds
  • 7.5% pending
  • 2.5% rejected

İlkin Ssenari Kolleksiya Statistikası

Kolleksiya Sənədlər Məlumat Ölçüsü Ort. Sənəd Ölçüsü Saxlama Ölçüsü İndekslər İndeks Ölçüsü
appV1 359,639,622 39.58GB 119B 8.78GB 2 20.06GB
appV2 359,614,536 41.92GB 126B 10.46GB 2 16.66GB
appV3 359,633,376 28.7GB 86B 8.96GB 2 16.37GB
appV4 359,615,279 19.66GB 59B 6.69GB 1 9.5GB
appV5R0 95,350,431 19.19GB 217B 5.06GB 1 2.95GB
appV5R1 33,429,649 15.75GB 506B 4.04GB 1 1.09GB
appV5R2 33,429,649 11.96GB 385B 3.26GB 1 1.16GB
appV5R3 33,429,492 11.96GB 385B 3.24GB 1 1.11GB
appV5R4 33,429,470 12.88GB 414B 3.72GB 1 1.24GB
appV6R0 95,350,319 11.1GB 125B 3.33GB 1 3.13GB
appV6R1 33,429,366 8.19GB 264B 2.34GB 1 1.22GB
appV6R2 33,429,207 9.11GB 293B 2.8GB 1 1.26GB
appV6R3 33,429,694 9.53GB 307B 2.56GB 1 1.19GB
appV6R4 33,429,372 9.53GB 307B 1.47GB 1 1.34GB

İnfrastruktur Konfiqurasiyası

MongoDB Server İnstansiyası

MongoDB serveri 2 vCPU və 4GB yaddaşla təchiz edilmiş AWS EC2 c7a.large instansiyasında işləyirdi. İki disk qoşulmuşdu:

  • Əməliyyat sistemi üçün 15GB GP3 disk.
  • MongoDB məlumat saxlaması üçün 10,000 IOPS ilə 300GB IO2 disk.

İnstansiya test zamanı tam yenilənmiş Ubuntu 22.04 işlədirdi. Mövcud avadanlıqda MongoDB performansını optimallaşdırmaq üçün bütün tövsiyə olunan istehsal parametrləri tətbiq edilmişdi.

Tətbiq Server İnstansiyası

Tətbiq serveri 4 vCPU və 8GB yaddaşla təchiz edilmiş AWS EC2 c6a.xlarge instansiyasında işləyirdi. İki disk qoşulmuşdu:

  • Əməliyyat sistemi üçün 10GB GP3 disk.
  • Yük testi metriklərinin saxlanması üçün istifadə olunan ikinci dərəcəli MongoDB serveri üçün 10GB GP3 disk.

Bu instansiya da tam yenilənmiş Ubuntu 22.04 işlədirdi. Performansını optimallaşdırmaq üçün tövsiyə olunan istehsal parametrləri tətbiq edilmişdi.