.NET Core-də DynamoDB ilə işə başlamaq - Lider lövhəsini necə qurmaq olar

İllərlə əlaqəli verilənlər bazası ilə işləmisinizsə, Amazon-un DynamoDB ilə başlamağınız sizi qorxuducu hiss edə bilər. Ənənəvi relyasiya məlumat bazaları saxlama üçün optimallaşdırıldı; DynamoDB performans üçün optimallaşdırılmışdır. Masalar müstəqil olaraq mövcuddur; Bir anda birdən çox cədvəldəki qeydləri sorğu etmək üçün 'Qoşulun' maddəsi yoxdur. Normallaşma (cüt məlumatları saxlamamaq) kimi anlayışlar artıq kritik deyildir; əslində bəzən məlumat modeliniz, performansını yaxşılaşdırmaq üçün açıq şəkildə məlumatları kopyalayacaqdır.

Bu yazının məqsədi DynamoDB-nin əsaslarını düzgün şəkildə dalğıc və istifadə edərək öyrənməkdir. Bir çox oyunda bir çox istifadəçi üçün yüksək bal izləmək üçün DynamoDB sxemini hazırlayacağıq. Bazamızı doldurmaq və sınamaq üçün .NET Core konsol tətbiqetməsini də istifadə edəcəyik.

Qurmaq

DB sxeminə və mənbə koduna birbaşa dalış etmək istəsəniz, sizə lazım olan hər şey bu GitHub repolarındadır. Bitmiş DynamoDB cədvəl sxemimizi izah edən Terraform faylını tapacaqsınız. Daha əvvəl Terraform istifadə etməmisinizsə, infrastrukturunuzu kod kimi yazmağa imkan verən fantastik bir vasitədir.

Terraform-dan istifadə etmək üçün tələb olunan yeganə şərt, maşınınızda saxlanan AWS etimadnaməsini paylaşmağınızdır (əvvəllər AWS CLI istifadə etmisinizsə, yaxşısınız.) Sonra Terraform-u yükləyin və yolunuza əlavə edin. 'Profilini' öz AWS profilinizin adına dəyişdirmək üçün example.tf faylını düzəldin. Sonra .tf faylı olan qovluqda bir əmr sorğusunu açın və aşağıdakı iki əmri işə salın:

Terraform, infrastrukturunuzu yaratmaq üçün tələb olunan bütün AWS API-lərini icra edəcəkdir. Terraform faylınıza dəyişiklik etsəniz, yeniləmələri həyata keçirmək üçün yenidən "terraform tətbiq" edə bilərsiniz. Onu istifadə etdiyiniz zaman 'terraform məhv' əmrini yerinə yetirmək AWS mühitinizdən bütün dəyişikliklərinizi siləcəkdir.

Daxil olan. NET Cole konsol tətbiqetməmiz, DynamoDB cədvəlimizə qoşulmaq, təsadüfi məlumatlarla doldurmaq və ona qarşı sorğuları yerinə yetirmək üçün AWS SDK istifadə edir.

DinamoDB

DynamoDB-ni uğurla həyata keçirmək üçün əvvəlcə istədiyiniz giriş nümunəsini başa düşməlisiniz. Hansı problemləri həll etməyə çalışırıq? Tətbiqlərimiz verilənlər bazamızı necə sorğu edəcək?

  • Bütün oyunlarda bir istifadəçi üçün ən yüksək nələr var?
  • Müəyyən bir oyun üçün istifadəçi üçün ən yüksək bal nədir?
  • Bir istifadəçinin qazandığı ən yüksək yüksək nəticə nədir?
  • Bir oyun_id üçün ümumi yüksək nəticə nədir və hansı hesabı istifadəçi əldə etdi?

Cədvəlimizdə dörd atributu izləyəcəyik:

  • İstifadəçi adı (simli)
  • Oyun (simli)
  • TopScore (sayı)
  • Zaman nişanı (simli)

Sorğu vs Scan

Şemaya başlamazdan əvvəl, verilənlər bazamızla adətən qarşılıqlı olduğumuz iki yolu başa düşmək vacibdir. Bir cədvəl skan edə bilərik, yəni bu qeydin tətbiq etdiyimiz filtrə uyğun olub olmadığını müəyyən etmək üçün hər bir sətirlə tanış olur. Və ya yalnız kiçik bir sıra araşdırmaq üçün indekslərdən istifadə edən bir cədvəl soruşa bilərik (aşağıda müzakirə edəcəyik). Verilənlər bazamızı tərtib edərkən məqsəd ümumiyyətlə ən kiçik cədvəllərdən başqa heç bir şeyin taramasından çəkinməkdir, çünki onlar çox yavaş ola bilər və hətta qısa müddət ərzində bütün cədvəlinizin oxu qabiliyyətindən istifadə edə bilər (digər istəklərin uğursuz olmasına səbəb olur.)

Ilkin açar

Hər DynamoDB cədvəlində İbtidai Açar tələb olunur və bu açar cədvəl daxilində unikal olmalıdır. İlkin Açar Partition Açarı və ya Bir bölmə açarı və çeşidləmə açarının birləşməsi ola bilər. İstifadə şərtlərimizi araşdırarkən aşağıda göstərilən şərtlərin hər birini təyin edəcəyik.

Bölmə açarı

DynamoDB paylanmış məlumat anbarıdır. Bu, cədvəlimizdəki məlumatların bir yerdəki diskdə, hətta tək bir diskdə saxlanmadığı anlamına gəlir. Məlumatların təşkili yolu bölmə düyməsinə əsaslanır (hash düyməsi kimi də tanınır). Pərdə arxasında DynamoDB, masanıza bir sıra bölmələr təyin edir. Hər dəfə yeni bir qeyd daxil olunduqda, yeni yazının hansı hissədə saxlanılacağını müəyyən etmək üçün bölmə açarı hash funksiyası vasitəsilə göndərilir.

İdeal bir bölmə açarı girişlərin genişliyinə və randomizə edilmiş bir giriş nümunəsinə sahib olacaqdır. Qeydlərimizin çoxunun eyni hissəyə keçməsini istəmirik, çünki sorğularımızın performansı yavaşlayacaq (məlumatları skan etmək üçün çox) və istifadəçilərimizin əksər sorğuları eyni bölməyə dəyəcəkdir (paylanmış təbiətin faydalarını itirməklə) DynamoDB.) Məlumatların bərabər paylanmasına və müştəri sorğularının arakəsmələr arasında bərabər miqdarda paylanmasına imkan verən bir bölmə açarı üçün hədəf alın.

Nümunəmizdə, İstifadəçi adı yaxşı bir bölmə açarı düzəldəcəkdir, çünki fərqli bir sıra unikal giriş təmin edir. Ancaq hər bir istifadəçi adı və oyun birləşməsi üçün yüksək bir bal toplamaq istədiyimizdən, istifadəçi adı masamızda unikal olmayacaq və bu əsas açarın tələblərini təmin etməyəcəkdir. Çeşidləmə açarına ehtiyacımız olacaq.

Bölmə açarı ilə sorğu

Sırala açarı

Bir Sort Açarı göstərərək, Cədvəlin İçki Açarı Partition Açarı və Sort Açarının tərkib hissəsinə çevrilir. Hər bölüm içərisində qeydlər indi sıralanmış qaydada saxlanılır. Bu daha mürəkkəb sorğuların cədvələ qarşı yerinə yetirilməsinə imkan verir.

Məsələn, sıralama açarı üçün müəyyən bir dəyərə, bir dəyərdən böyük və ya az olan əşyalara və ya bir sıra dəyərlərdəki maddələrə uyğun nəticələr tələb edə bilərik.

Oyun çeşidləmə açarımız kimi istifadə etmək birinci və ikinci istifadə vəziyyətimizi həll edir. İndi unikal bir əsas açarımız var (İstifadəçi adı və oyunun tərkib hissəsi) və müəyyən bir istifadəçi üçün ən yüksək balların hər birini tapmaq üçün yalnız bölmə düyməsini soruşa bilərik. Xüsusi bir istifadəçi adı və oyun birləşməsi üçün yüksək bal soruşa bilərik.

Bölmə açarı və çeşidləmə açarı ilə sorğu

Yerli orta indeks

Növbəti istifadə vəziyyətimiz üçün istifadəçinin əldə etdiyi ən yüksək hesabın nə olduğunu bilmək istəyirik. Ancaq Sırala Açar Oyunumuz olduğundan, nəticələri vaxt damğası ilə süzməyin səmərəli yolu yoxdur. Bir Sorgun yerinə Scan istifadə edə bilərik, ancaq bu, cədvəlin hər girişinə baxıb filtri tətbiq etmək deməkdir. Bu yavaşdır və cədvəlin ölçüsünə görə potensial olaraq bütün verilən oxumaq qabiliyyətinizdən istifadə edə bilərsiniz.

Əsasən başqa bir növ açara ehtiyacımız var - xoşbəxtlikdən, DynamoDB bunu Yerli Orta İndeks şəklində təmin edir. LSI-lər, bir sözlə, yalnız masanın yaradılması zamanı müəyyən edilə bilər; sonra əlavə edilə bilməz. Bir LSI, əvvəlcədən müəyyən edilmiş, lakin yeni çeşidləmə açarı seçməyə imkan verən eyni bölmə açarından istifadə edir. Ssenarimizdə TimSampampı LSI'nin sıralama açarı olaraq istifadə edəcəyik. İndi ən son yüksək nəticəni qaytarmaq üçün yeni indeksimizə qarşı sorğu edə bilərik. Nəzərinizə çatdırırıq ki, ScanIndexForward = saxta nəticələri azalan qaydada çeşidləmək üçün istifadə edirik və Limit = 1, bir nəticəni qaytarmaq üçün istifadə edirik.

Yerli Orta İndeksə qarşı sorğu

Qlobal orta indeks

İndi bir problemimiz var - hər hansı bir istifadəçi tərəfindən müəyyən bir oyun üçün qeydə alınan yüksək hesabı tapın. İstifadəçi adı bölüm açarı olduğumuz üçün fərqli istifadəçilər üçün yüksək bal müxtəlif yerlərdə saxlanılır və bu, qlobal yüksək hesabı səmərəli şəkildə axtarmağımızı çətinləşdirir. Hər bölümdən ən yaxşı balları toplamalı və hamısını bir siyahıya salmalıyıq - bahalı bir əməliyyat.

Buna yaxınlaşmağın daha yaxşı bir yolu Qlobal Orta İndeksdən (və ya GSI.) İstifadə etməkdir. Cədvəl yaratdıqdan sonra da hər zaman yeni bir bölmə açarı və istenmeyen bir sıralama açarı göstərərək yarada bilərsiniz. Bu açarların hər ikisi əvvəlcə masa yaratmaq üçün istifadə olunanlardan fərqlənə bilər. Cədvəlimizin dublikat versiyasını effektiv şəkildə yaradırıq, lakin məlumatları fərqli şəkildə təşkil edirik. Açarlarla yanaşı, cədvəlin digər yeni atributlarının bu yeni indeksə daxil olmasını seçə bilərik. Saxlama və oxumaq / yazma qabiliyyətini azaltmaq üçün bu atributlar yalnız istifadə vəziyyətiniz üçün lazım olanlarla məhdudlaşmalıdır.

Bir oyun üçün qlobal yüksək bal tapmaq üçün bütün puanların eyni hissədə olmasına ehtiyac duyuruq. Beləliklə, Oyun bölümünün açarı və çeşidləmə açarı kimi TopScore olaraq bir GSI yaradacağıq.

Qlobal Orta İndeksə qarşı sorğu

Recap

DynamodDB hər istifadə üçün uyğun deyildir, ancaq açar dəyər axtarmağa ehtiyac duyduğu və ya kiçik bir sıra qeydlərdə sorğu etmək üçün arakəsmələrdən yararlana biləcəyi vəziyyətlərdən üstündür. İdarə edilən, serversiz AWS təklifinin olması, onu inkişaf etdiricilər üçün cəlbedici edir. Ayrıca AWS Lambda ilə gözəl birləşir; əslində bu iki xidmət tez-tez bir Alexa Bacarıqının arxa ucunu təşkil edir.

DynamoDB, burada müzakirə etmədiyimiz bir xüsusiyyət olan Axınları da dəstəkləyir. Axınlar masanızdakı dəyişikliklərin başqa bir xidmət tərəfindən istehlak üçün tutulmasına imkan verir. Məsələn, yeni bir yüksək nəticə əldə etdikdə bir istifadəçiyə bir e-poçt göndərə bilərsiniz. Bir axın qurmağı və Lambda'ya necə qoşulacağını araşdırmaq üçün növbəti məqaləmə baxın.

Bu nümunələr üçün kod və terraform GitHub-da mövcuddur. Zəhmət olmasa rəy və suallarınızı şərhlərdə paylaşın. Təşəkkür edirəm!