Müşteri beklentileri ve uygulamalara ilişkin talepler hiç bu kadar yüksek olmamıştı. Kullanıcılar uygulamaların hızlı, güvenilir ve kullanılabilir olmasını bekler. Dahası, veriler kraldır ve kullanıcılar, içgörü bulmak için toplu verileri gerektiği gibi parçalara ayırabilmek ister. Kullanıcılar, veri mühendislerinin yeni dizinler sağlamasını veya yeni ETL zincirleri oluşturmasını beklemek istemez. Mevcut en güncel verilere sınırsız erişim istiyorlar. Ancak tüm uygulama ihtiyaçlarınızın karşılanması, tek bir veritabanı için zorlu bir iştir. Veritabanı açısından, bireysel kayıtlar üzerinde sık, düşük gecikme süreli işlemler için optimizasyon yapmak, daha az sıklıkta toplamalar veya birçok kayıtta yoğun filtreleme için optimizasyon yapmaktan farklıdır. Çoğu zaman, her iki modeli de aynı veritabanıyla ele almaya çalışıyoruz ve uygulama ölçeklerimizde tutarsız performansla başa çıkıyoruz. Minimum çaba veya maliyet için optimizasyon yaptığımızı düşünüyoruz, ancak aslında tam tersini yapıyoruz. Analitikleri bir OLTP veritabanı üzerinde çalıştırmak genellikle trafikteki zirveleri hesaba katmak için bir veritabanına aşırı tedarik yapmamızı gerektirir. Bu, çok fazla paraya mal olur ve genellikle hoş bir son kullanıcı deneyimi sağlamada başarısız olur. Bu izlenecek kılavuzda, bu erişim modellerinin her ikisiyle de kullanıcıların yüksek taleplerini nasıl karşılayacağımızı göreceğiz. Kullanıcıların işlemleri kaydettiği ve son işlemleri görüntülediği, aynı zamanda geçmiş işlemlerine ilişkin karmaşık filtreleme veya toplamaların da istendiği bir finansal uygulama oluşturacağız. Hibrit Bir Yaklaşım Uygulama ihtiyaçlarımızı karşılamak için ile birlikte kullanacağız. DynamoDB, temel işlem erişim kalıplarımızı yönetecek; işlemleri kaydedecek ve kullanıcıların göz atması için son işlemlerin özet akışını sunacak. Rockset, veri ağırlıklı, "keyifli" erişim modellerimizi yönetmek için DynamoDB'yi destekleyecektir. İlgili işlemleri bulmak için kullanıcılarımıza zamana, satıcıya, kategoriye veya diğer alanlara göre filtreleme yapma veya zaman içindeki harcama eğilimlerini görüntülemek için güçlü toplamalar yapma olanağı vereceğiz. Amazon DynamoDB'yi Rockset Bu modeller üzerinde çalışırken, bu sistemlerin her birinin elimizdeki işe ne kadar uygun olduğunu göreceğiz. DynamoDB, tek bir öğeyi okuma veya yazma ya da bilinen filtrelere dayalı olarak bir dizi sıralı öğeyi getirme gibi temel OLTP işlemlerinde üstün performans gösterir. Verileri birincil anahtara göre bölümlendirme yöntemi nedeniyle DynamoDB, bu tür sorgular için her ölçekte tutarlı performans sağlayabilir. Bunun tersine, Rockset, yüksek düzeyde seçici filtreleme, gerçek zamanlı veya sorgu zamanlı toplamalar ve DynamoDB'nin kolayca yönetemeyeceği diğer kalıpları sağlamak için büyük miktarlarda veriyi sürekli olarak alma ve bu veriler üzerinde birden fazla indeksleme stratejisi kullanma konusunda üstündür. Bu örnek üzerinde çalışırken, hem iki sistemin altında yatan temel kavramları hem de hedeflerimize ulaşmaya yönelik pratik adımları öğreneceğiz. kullanarak uygulamayı takip edebilirsiniz. GitHub deposunu DynamoDB ile Temel Özellikleri Uygulama Bu izlenecek yolu uygulamamızın temel özelliklerini uygulayarak başlatacağız. Bireysel kayıtları yönetme ve bir dizi ilgili kaydı listeleme yeteneği sağlamak için standart "CRUDL" işlemlerini oluşturduğunuzda, bu herhangi bir uygulama için ortak bir başlangıç noktasıdır. Bir e-ticaret uygulaması için bu, sipariş verme ve önceki siparişleri görüntüleme işlevi olacaktır. Bir sosyal medya uygulaması için bu, gönderi oluşturmak, arkadaş eklemek veya takip ettiğiniz kişileri görüntülemek olabilir. Bu işlevsellik genellikle az sayıda satıra karşı birçok eşzamanlı işlemi vurgulayan iş akışlarında uzmanlaşmış veritabanları tarafından uygulanır. çevrimiçi işlemsel işleme (OLTP) Bu örnekte, kullanıcının ödeme yapıp alabileceği ve işlemlerinin geçmişini görüntüleyebileceği bir işletme finansmanı uygulaması geliştiriyoruz. Örnek, bu izlenecek yol için kasıtlı olarak basitleştirilecektir, ancak uygulamamız için üç temel erişim modelini düşünebilirsiniz: İşletme tarafından yapılan veya alınan bir ödemenin kaydını saklayacak olan ; kayıt işlemi Kullanıcıların bir işletme tarafından yapılan ve alınan en son ödemeleri görmesine olanak tanıyan ; Ve işlemleri tarih aralığına göre görüntüleyin Kullanıcının tek bir işlemin ayrıntılarını ayrıntılı olarak incelemesine olanak tanıyan . bireysel işlemi görüntüleyin Bu erişim modellerinin her biri kritik, yüksek hacimli bir erişim modelidir. Kullanıcılar için işlemleri sürekli kaydedeceğiz ve uygulamayı açtıklarında ilk görüntü işlem akışı olacak. Ayrıca bu erişim modellerinin her biri, ilgili kayıt(lar)ı getirmek için bilinen, tutarlı parametreleri kullanacaktır. Bu erişim düzenlerini yönetmek için DynamoDB'yi kullanacağız. DynamoDB, AWS tarafından sağlanan bir NoSQL veritabanıdır. Tamamen yönetilen bir veritabanıdır ve hem yüksek ölçekli uygulamalarda hem de sunucusuz uygulamalarda giderek artan popülerliğe sahiptir. DynamoDB'nin en benzersiz özelliklerinden biri, her ölçekte tutarlı performans sağlamasıdır. Tablonuz ister 1 megabayt ister 1 petabayt olsun işlemlerinizde aynı yanıt süresini görmelisiniz. Bu, burada uyguladığımız gibi temel OLTP kullanım senaryoları için arzu edilen bir kalitedir. Bu büyük ve değerli bir mühendislik başarısıdır, ancak bunun iyi performans gösterecek sorgu türleri konusunda seçici davranılarak başarıldığını anlamak önemlidir. DynamoDB bu tutarlı performansı iki temel tasarım kararıyla sağlayabilmektedir. Öncelikle DynamoDB tablonuzdaki her kaydın bir birincil anahtar içermesi gerekir. Bu birincil anahtar, bir bölüm anahtarının yanı sıra isteğe bağlı bir sıralama anahtarından oluşur. DynamoDB için ikinci temel tasarım kararı, API'nin birincil anahtarın kullanımını yoğun bir şekilde zorunlu kılmasıdır; bu konuya daha sonra değineceğiz. Aşağıdaki görselde FinTech uygulamamızdaki bazı örnek işlem verilerini görüyoruz. Tablomuz, uygulamamızdaki kuruluş adının bir bölüm anahtarını ve ayrıca bir UUID'nin benzersizlik özelliklerini ve ayrıca zamana dayalı sorgular yapmamıza olanak tanıyan oluşturma zamanına göre sıralanabilirliği sağlayan tabanlı bir sıralama anahtarını kullanır. ULID Tablomuzdaki kayıtlar, uygulamamızda yararlı olan ancak DynamoDB'nin temel mimarisi açısından o kadar kritik olmayan satıcı adı, kategori ve tutar gibi diğer özellikleri içerir. Önemli kısım birincil anahtarda ve özellikle bölüm anahtarındadır. DynamoDB, temelde verilerinizi her biri tablonuzdaki verilerin bir alt kümesini içeren birden fazla depolama bölümüne böler. DynamoDB, belirli bir kaydı belirli bir depolama bölümüne atamak için birincil anahtarın bölüm anahtarı öğesini kullanır. Tablonuzdaki veri miktarı veya tablonuzdaki trafik arttıkça DynamoDB, veritabanınızı yatay olarak ölçeklendirmenin bir yolu olarak bölümler ekleyecektir. Yukarıda bahsedildiği gibi DynamoDB için ikinci temel tasarım kararı, API'nin birincil anahtarın kullanımını yoğun bir şekilde zorunlu kılmasıdır. DynamoDB'deki hemen hemen tüm API eylemleri, en azından birincil anahtarınızın bölüm anahtarını gerektirir. Bu nedenle DynamoDB, bölüm sayısı ve tablonun toplam boyutu ne olursa olsun, herhangi bir isteği hızlı bir şekilde uygun depolama bölümüne yönlendirebilir. Bu iki tercih arasında DynamoDB'yi kullanma şeklinizde zorunlu olarak sınırlamalar vardır. Birincil anahtarınızın erişim modellerinize dahil olması gerektiğinden, erişim modellerinizi önceden dikkatlice planlamalı ve tasarlamalısınız. Erişim modellerinizi daha sonra değiştirmek zor olabilir ve bazı manuel geçiş adımları gerektirebilir. Kullanım senaryolarınız DynamoDB'nin temel yetkinlikleri kapsamına girdiğinde avantajlardan yararlanacaksınız. Ölçek ne olursa olsun tutarlı, öngörülebilir performans elde edeceksiniz ve uygulamanızda zaman içinde uzun vadeli bir bozulma görmeyeceksiniz. Ayrıca, düşük operasyonel yüke sahip, tam olarak yönetilen bir deneyim elde edecek ve işiniz için önemli olan konulara odaklanmanıza olanak tanıyacaksınız. Örneğimizdeki temel işlemler bu modele mükemmel bir şekilde uymaktadır. Bir kuruluş için işlem akışını alırken, aynı bölüm anahtarıyla bitişik bir kayıt kümesini getirmek için DynamoDB işlemini kullanmamıza olanak tanıyan kuruluş kimliğini uygulamamızda kullanacağız. Belirli bir işlemle ilgili ek ayrıntıları almak için, istenen öğeyi getirmek amacıyla DynamoDB isteğinde bulunmak için hem kuruluş kimliğine hem de işlem kimliğine sahip olacağız. Sorgu GetItem uygulamayla bu işlemleri çalışırken görebilirsiniz. Uygulamayı dağıtmak ve örnek verilerle tohumlamak için talimatları izleyin. Daha sonra, bireysel kullanıcılar için işlem akışını getirmek üzere dağıtılan hizmete HTTP istekleri yapın. Bu işlemler, eşzamanlı isteklerin sayısından veya DynamoDB tablonuzun boyutundan bağımsız olarak hızlı ve verimli işlemler olacaktır. Örnek DynamoDB'yi Rockset ile desteklemek Şu ana kadar temel erişim kalıplarımızı yönetmek için DynamoDB'yi kullandık. Anahtar tabanlı bölümlemesi her ölçekte tutarlı performans sağlayacağından DynamoDB bu modeller için idealdir. Ancak DynamoDB diğer erişim modellerini yönetme konusunda pek iyi değil. DynamoDB, birincil anahtar dışındaki niteliklere göre verimli bir şekilde sorgulama yapmanıza izin vermez. Verilerinizi ek niteliklere göre yeniden indekslemek için kullanabilirsiniz, ancak verilerinizi indekslemek için kullanılabilecek birçok farklı niteliğiniz varsa bu yine de sorunlu olabilir. DynamoDB'nin ikincil indekslerini Ayrıca DynamoDB, kullanıma hazır herhangi bir toplama işlevi sunmaz. DynamoDB'yi kullanarak kendi toplamalarınızı hesaplayabilirsiniz, ancak önceden toplama için tasarım yapan bir çözümle karşılaştırıldığında bu, daha az esneklikle veya optimize edilmemiş okuma tüketimiyle olabilir. Bu kalıpları ele almak için . DynamoDB'yi Rockset ile destekleyeceğiz Rockset'i verileriniz üzerinde ikincil bir dizin kümesi olarak düşünmek en iyisidir. Rockset, sorgulama sırasında yalnızca bu dizinleri kullanır ve okuma sırasında DynamoDB'ye herhangi bir yük yansıtmaz. Rockset, uygulama istemcilerinizden gelen bireysel, işlemsel güncellemeler yerine, birincil veri deponuzdan sürekli, akışlı alım için tasarlanmıştır. DynamoDB, MongoDB, Kafka ve birçok ilişkisel veritabanı dahil olmak üzere bir dizi birincil veri deposu için doğrudan bağlayıcılara sahiptir. Rockset, birincil veritabanınızdan verileri alırken, verilerinizi bir Satır dizini, ters çevrilmiş dizin ve sütunlu dizin kavramlarından ödünç alan Dizinde dizine ekler. Aralık, tür ve coğrafi konum gibi ek dizinler, alınan veri türlerine göre otomatik olarak oluşturulur. Aşağıda bu dizinlerin özelliklerini tartışacağız ancak bu Yakınsanmış Dizin, verileriniz üzerinde daha esnek erişim modellerine olanak tanır. Yakınsanmış Rockset'in arkasındaki temel kavram budur; birincil veri deponuzdan tam olarak yönetilen, neredeyse gerçek zamanlı bir besleme hattını kullanan verileriniz üzerinde ikincil bir dizindir. Ekipler, ek kullanım durumlarını ele almak üzere uzun süredir DynamoDB'den veri alıp başka bir sisteme eklemeye çalışıyor. Rockset'in tablonuzdan verileri nasıl aldığının ayrıntılarına geçmeden önce Rockset'in bu alandaki diğer seçeneklerden nasıl farklılaştığını kısaca tartışalım. Rockset ile diğer yaklaşımlar arasında birkaç temel farklılık vardır. Öncelikle Rockset tamamen yönetiliyor. Sadece veritabanı altyapısını yönetmeniz gerekmiyor, aynı zamanda Rockset'e veri çıkarmak, dönüştürmek ve yüklemek için boru hattını korumanıza da gerek yok. Diğer birçok çözümde, sistemleriniz arasındaki "tutkal" kodundan siz sorumlusunuz. Veri yapısındaki herhangi bir değişikliğe karşı savunmacı bir şekilde korunmanız gerektiğinden, bu sistemler kritik öneme sahiptir ancak hataya açıktır. Yukarı yöndeki değişiklikler, bu sistemleri koruyanlar için aşağı yönde acıya neden olabilir. İkinci olarak Rockset, gerçek zamanlı verileri değiştirilebilir bir şekilde işleyebilir. Diğer birçok sistemden birini veya diğerini alırsınız. Verilerinizi periyodik olarak dışa aktarmayı ve toplu yüklemeyi gerçekleştirmeyi seçebilirsiniz ancak bu, yüklemeler arasında verilerin eskimesine neden olur. Alternatif olarak, veri ambarınıza salt ekleme yöntemiyle veri akışı gerçekleştirebilirsiniz ancak değişen veriler üzerinde yerinde güncelleme yapamazsınız. Rockset, yeni verileri eklerken mevcut öğelerdeki güncellemeleri de hızlı ve verimli bir şekilde yönetebilir ve böylece değişen verilerinize gerçek zamanlı bir bakış sunabilir. Üçüncüsü, Rockset indekslerini otomatik olarak oluşturur. Diğer 'tamamen yönetilen' çözümler, dizinleri yeni sorguları desteklemek için ihtiyaç duyduğunuz şekilde yapılandırmanızı gerektirir. Rockset'in sorgu motoru, tüm sorguları desteklemek için tek bir dizin kümesi kullanacak şekilde tasarlanmıştır. Sisteminize giderek daha fazla sorgu ekledikçe, daha fazla yer ve hesaplama kaynağı kaplayan ek dizinler eklemenize gerek kalmaz. Bu aynı zamanda özel sorguların dizinlerden tam olarak yararlanabileceği ve yöneticinin bunları desteklemek için özel bir dizin eklemesini beklemeden hızlı hale getirebileceği anlamına gelir. Rockset, DynamoDB'den Verileri Nasıl Alır? Artık Rockset'in ne olduğuna ve bize nasıl yardımcı olduğuna dair temel bilgileri bildiğimize göre, DynamoDB tablomuzu Rockset'e bağlayalım. Bunu yaparken Rockset alım sürecinin nasıl çalıştığını ve diğer seçeneklerden nasıl farklılaştığını öğreneceğiz. Rockset, bir dizi veri kaynağı için amaca yönelik olarak oluşturulmuş konektörlere sahiptir ve spesifik konektör uygulaması, yukarı akış veri kaynağının özelliklerine bağlıdır. DynamoDB ile bağlantı kurmak için Rockset, güveniyor. DynamoDB Streams, DynamoDB'nin bir DynamoDB tablosuna karşı her yazma işleminin ayrıntılarının akışa kaydedildiği bir değişiklik verisi yakalama özelliğidir. Akışın tüketicileri, aşağı akış sistemlerini güncellemek için bu değişiklikleri tabloda meydana geldikleri sırayla işleyebilir. DynamoDB Streams'e DynamoDB Akışı, Rockset'in bir DynamoDB tablosuyla neredeyse gerçek zamanlı olarak güncel kalması için harikadır, ancak hikayenin tamamı bu değildir. DynamoDB Akışı yalnızca Akışın tabloda etkinleştirilmesinden sonra gerçekleşen yazma işlemlerinin kayıtlarını içerir. Ayrıca . Akış etkinleştirilmeden önce veya 24 saatten daha uzun bir süre önce gerçekleştirilen işlemler akışta mevcut olmayacaktır. DynamoDB Stream, kayıtları yalnızca 24 saat boyunca saklar Ancak Rockset'in sorularınıza doğru yanıt verebilmesi için yalnızca en güncel verilere değil, veritabanınızdaki tüm verilere ihtiyacı var. Bunu gerçekleştirmek için, tablonuzun başlangıç durumunu yakalamak üzere ilk toplu dışa aktarma (tablo boyutunuza bağlı olarak DynamoDB Taraması veya kullanarak) gerçekleştirir. S3'e aktarım Dolayısıyla Rockset'in DynamoDB bağlantı süreci iki bölümden oluşur: Tablonuzun tamamını Rockset'e aktarılmak üzere dışa aktarmak için bir başlangıç işlemi; önyükleme DynamoDB Stream'inizdeki güncellemeleri tüketmek ve Rockset'teki verileri güncellemek için takip eden, bir süreç. sürekli Bu süreçlerin her ikisinin de tamamen Rockset tarafından yönetildiğine ve kullanıcı olarak size şeffaf olduğuna dikkat edin. Bu hatların bakımından ve bir hata olması durumunda uyarılara yanıt vermekten sorumlu olmayacaksınız. Ayrıca, ilk alım işlemi için S3 dışa aktarma yöntemini seçerseniz Rockset alım süreçlerinin hiçbiri ana tablonuzdan okuma kapasitesi birimlerini tüketmez. Böylece Rockset, uygulamanızın kullanım durumlarından tüketim almaz veya üretim kullanılabilirliğini etkilemez. Uygulama: DynamoDB'yi Rockset'e Bağlama Rockset'i uygulamamızda kullanmaya geçmeden önce Rockset'i DynamoDB tablomuza bağlayalım. Öncelikle Rockset ile masamız arasında yeni bir entegrasyon oluşturmamız gerekiyor. Aşağıda üst düzey adımları inceleyeceğiz ancak gerekirse bulabilirsiniz. uygulama deposunda daha ayrıntılı adım adım talimatlar Bu işlemi başlatmak için Rockset konsolunda gidin. yeni entegrasyon sihirbazına Entegrasyon sihirbazında entegrasyon türünüz olarak seçin. Daha sonra bir sonraki adıma geçmek için tıklayın. Amazon DynamoDB'yi Başlat'a DynamoDB entegrasyon sihirbazı, Rockset'in DynamoDB tablonuza erişmesine yetki vermek için adım adım talimatlar içerir. Bu, tablo dışa aktarımınız için bir IAM politikası, bir IAM rolü ve bir S3 klasörü oluşturmayı gerektirir. İsterseniz kaynakları manuel olarak oluşturmak için bu talimatları takip edebilirsiniz. Sunucusuz dünyada, mümkün olduğunca aracılığıyla bir şeyler oluşturmayı tercih ediyoruz ve buna bu destekleyici kaynaklar da dahil. kod olarak altyapı Örnek depo, Rockset entegrasyon kaynaklarını oluşturmak için gerekli olan kod olarak altyapıyı içerir. Bunları kullanmak için öncelikle Rockset entegrasyon sihirbazının alt kısmında Rockset Hesap Kimliği ve Harici Kimlik değerlerini bulun. Bu değerleri kopyalayıp, serverless.yml dosyasının yapıştırın. Daha sonra, bu kaynakları oluşturmak için . custom bloğunun ilgili bölümlerine serverless.yml dosyasının 71 ila 122. satırlarındaki kaynakların açıklamalarını kaldırın Bu yeni kaynakları oluşturmak için uygulamanızı yeniden dağıtın. Dağıtımın çıktılarında, S3 klasör adını ve IAM rolü ARN'sini kopyalayıp Rockset konsolundaki uygun yerlere yapıştırın. Daha sonra entegrasyonunuzu kaydetmek için Entegrasyonu Kaydet butonuna tıklayın. Entegrasyonunuzu oluşturduktan sonra entegrasyondan oluşturmanız gerekecektir. Rockset konsolundaki gidin ve bir koleksiyon oluşturmak için entegrasyonunuzu kullanmak için adımları izleyin. Uygulama deposunda da bulabilirsiniz. Rockset koleksiyonu koleksiyon oluşturma sihirbazına koleksiyon oluşturmaya yönelik adım adım talimatları Bu bağlantıyı tamamladıktan sonra, genellikle uygun boyuttaki bir örnek kümesinde, DynamoDB'deki verilere yapılan eklemeler, güncellemeler veya silmeler Rockset'in dizinine yansıtılacak ve 2 saniyeden daha kısa bir sürede sorgulamaya hazır hale gelecektir. Karmaşık Filtreleme için Rockset Kullanımı Artık Rockset'i DynamoDB tablomuza bağladığımıza göre, Rockset'in mevcut verilerimiz üzerinde yeni erişim kalıplarını nasıl etkinleştirebileceğini görelim. Temel özellikler bölümümüzden DynamoDB'nin ağırlıklı olarak birincil anahtarlarınıza odaklandığını hatırlayın. Verilerinize verimli bir şekilde erişmek için birincil anahtarınızı kullanmanız gerekir. Buna göre tablomuzu birincil anahtarlarımızda kuruluş adını ve işlem zamanını kullanacak şekilde yapılandırdık. Bu yapı, temel erişim modellerimiz için işe yarar ancak kullanıcıların işlemlerine göz atmaları için daha esnek bir yol sağlamak isteyebiliriz. Filtrelemede yararlı olabilecek bir dizi yararlı özellik (kategori, satıcı adı, tutar vb.) vardır. Daha fazla öznitelik üzerinde filtrelemeyi etkinleştirmek için DynamoDB'nin ikincil dizinlerini kullanabiliriz, ancak bu yine de buraya pek uygun değil. DynamoDB'nin birincil anahtar yapısı, birçok isteğe bağlı özelliğin birleşimini içeren esnek sorgulamaya kolaylıkla izin vermez. Satıcı adına ve tarihe göre filtreleme yapmak için ikincil bir dizine sahip olabilirsiniz ancak satıcı adına, tarihe ve tutara göre filtrelemeye izin vermek istiyorsanız başka bir ikincil dizine ihtiyacınız olacaktır. Kategoriye göre filtreleyen bir erişim modeli, üçüncü bir ikincil dizin gerektirir. Bu karmaşıklıkla uğraşmak yerine burada Rockset'e güveneceğiz. Rockset'in verilerinizi birden fazla şekilde indekslemek için Yakınsanmış İndeks kullandığını daha önce görmüştük. Bu yollardan biri ters çevrilmiş indekstir. Tersine çevrilmiş bir indeksle Rockset, her özelliği doğrudan indeksler. Bu endeksin nasıl düzenlendiğine dikkat edin. Her bir öznitelik adı ve değeri, dizinin anahtarı olarak kullanılır ve değer, karşılık gelen öznitelik adını ve değerini içeren belge kimliklerinin bir listesidir. Anahtarlar, doğal sıralama düzenlerinin aralık sorgularını verimli bir şekilde destekleyebileceği şekilde oluşturulmuştur. Tersine çevrilmiş bir dizin, seçici filtre koşullarına sahip sorgular için mükemmeldir. Kullanıcılarımızın belirli kriterlere uyan işlemleri bulmak için işlemlerini filtrelemelerine izin vermek istediğimizi düşünün. Vandelay Industries organizasyonundan biri yakın zamanda kaç kez Chipotle siparişi verdiğiyle ilgileniyor. Bunu aşağıdaki gibi bir sorguyla bulabilirsiniz: SELECT * FROM transactions WHERE organization = 'Vandelay Industries' AND merchant_name = 'Chipotle' Müşteri ve satıcı adına seçici filtreler uyguladığımız için, eşleşen belgeleri hızlı bir şekilde bulmak için ters dizini kullanabiliriz. Rockset, eşleşen belgelerin listesini bulmak için ters çevrilmiş indekste hem nitelik adı hem de değer çiftlerini arayacaktır. Bu iki listeye sahip olduğunda, her iki koşul kümesiyle eşleşen kayıt kümesini bulmak için bunları birleştirebilir ve sonuçları istemciye geri gönderebilir. DynamoDB'nin bölüm tabanlı indekslemesinin bölüm anahtarını kullanan işlemler için verimli olması gibi, Rockset'in ters çevrilmiş dizini de veri kümenizdeki herhangi bir alanda, hatta gömülü nesnelerin niteliklerinde veya gömülü dizilerin içindeki değerlerde bile verimli aramalar yapmanızı sağlar. Uygulama: Uygulamanızda Rockset API'yi kullanma Artık Rockset'in veri kümemizde seçici sorguları nasıl verimli bir şekilde yürütebildiğini bildiğimize göre, Rockset sorgularını uygulamamıza entegre etmenin pratik yönlerini inceleyelim. Rockset, bir yetkilendirme belirteci tarafından korunan RESTful hizmetlerini kullanıma sunar. Popüler programlama dilleri için SDK'lar da mevcuttur. Bu, veritabanınıza erişmek için karmaşık özel ağ yapılandırması ayarlamanıza gerek olmadığından, sunucusuz uygulamalarla entegrasyon için mükemmel bir seçimdir. Uygulamamızda Rockset API ile etkileşim kurabilmek için Rockset API anahtarına ihtiyacımız olacak. Rockset konsolunun bir tane oluşturabilirsiniz. Bunu yaptıktan sonra değerini serverless.yml dosyanıza kopyalayın ve uygulamanızda kullanılabilir hale getirmek için yeniden konuşlandırın. API anahtarları bölümünde Yan not: Kolaylık olması açısından bu API anahtarını bir ortam değişkeni olarak kullanıyoruz. Gerçek bir uygulamada sırrınızı saklamak ve ortam değişkenlerinden kaçınmak için veya gibi bir şey kullanmalısınız. Parameter Store AWS Secrets Manager Rockset API ile nasıl etkileşim kurduğumuzu görmek için bakın. Sınıfın başlatılması, Rockset'e çağrı yapmak için kullanılacak bir Rockset istemci nesnesini alır. TransactionService sınıfımıza Rockset ile etkileşim kurmak için aşağıdaki sorguya sahibiz: Hizmet sınıfımızın filterTransactions yönteminde const response = await this._rocksetClient.queries.query({ sql: { query: ` SELECT * FROM Transactions WHERE organization = :organization AND category = :category AND amount BETWEEN :minAmount AND :maxAmount ORDER BY transactionTime DESC LIMIT 20`, parameters: [ { name: "organization", type: "string", value: organization, }, { name: "category", type: "string", value: category, }, { name: "minAmount", type: "float", value: minAmount, }, { name: "maxAmount", type: "float", value: maxAmount, }, ], }, }); Bu etkileşimde dikkat edilmesi gereken iki şey var. İlk olarak, kullanıcılardan gelen girdileri işlerken sorgumuzda adlandırılmış parametreleri kullanıyoruz. Bu, SQL enjeksiyon saldırılarını önlemek için SQL veritabanlarında yaygın bir uygulamadır. İkincisi, SQL kodu uygulama kodumuzla karışmıştır ve zaman içinde takip edilmesi zor olabilir. Bu işe yarasa da daha iyi bir yol var. Bir sonraki kullanım örneğimizi uygularken Rockset Query Lambdas'ı uygulamamızda nasıl kullanacağımıza bakacağız. Toplama için Rockset'i Kullanma Bu noktaya kadar, veritabanının belirli bir filtre koşuluyla eşleşen bireysel bir kaydı veya kayıt kümesini nasıl bulabileceğini tartışırken DynamoDB ve Rockset'in indeksleme stratejilerini inceledik. Örneğin, DynamoDB'nin sizi bir kaydı bulmak için birincil anahtar kullanmaya ittiğini, oysa Rockset'in ters çevrilmiş endeksinin yüksek düzeyde seçici filtre koşulları kullanarak kayıtları verimli bir şekilde bulabileceğini gördük. Bu son bölümde, doğrudan indeksleme yerine veri düzenine odaklanmak için vitesi biraz değiştireceğiz. Veri düzeni hakkında düşünürken iki yaklaşımı karşılaştıracağız: satır tabanlı ve sütun tabanlı. Satır tabanlı veritabanları, adından da anlaşılacağı gibi, diskteki verilerini satırlar halinde düzenler. PostgreSQL ve MySQL gibi ilişkisel veritabanlarının çoğu satır tabanlı veritabanlarıdır. Kayıtları ilişkisel veritabanı anlamında teknik olarak "satırlar" olmasa bile DynamoDB gibi birçok NoSQL veritabanı da öyle. Satır tabanlı veritabanları şu ana kadar incelediğimiz erişim modelleri için harikadır. Bireysel bir işlemi kimliğine göre veya bazı filtre koşullarına göre bir dizi işlem getirirken, genellikle her işlem için tüm alanların geri gelmesini isteriz. Kaydın tüm alanları bir arada saklandığından, kaydın döndürülmesi genellikle tek bir okuma alır. (Not: Bu konuda biraz nüanslar gelecek). Toplama tamamen farklı bir hikaye. Toplama sorgularıyla, bir toplam hesaplamak istiyoruz: tüm işlemlerin sayısı, işlem toplamlarının toplamı veya bir dizi işlem için ay bazında ortalama harcama. Vandelay Industries organizasyonundan kullanıcıya dönersek, son üç aya bakmak ve her ay için kategoriye göre toplam harcamayı bulmak istediklerini hayal edin. Bu sorgunun basitleştirilmiş bir versiyonu aşağıdaki gibi görünecektir: SELECT category, EXTRACT(month FROM transactionTime) AS month, sum(amount) AS amount FROM transactions WHERE organization = 'Vandelay Industries' AND transactionTime > CURRENT_TIMESTAMP() - INTERVAL 3 MONTH GROUP BY category, month ORDER BY category, month DESC Bu sorgu için sonucu hesaplamak için okunması gereken çok sayıda kayıt olabilir. Ancak kayıtlarımızın her biri için çok fazla alana ihtiyacımız olmadığına dikkat edin. Bu sonucu belirlemek için yalnızca dört tanesine (kategori, işlemZamanı, organizasyon ve miktar) ihtiyacımız var. Bu nedenle, bu sorguyu karşılamak için yalnızca çok daha fazla kayıt okumamız gerekmeyecek, aynı zamanda satır tabanlı düzenimiz de sonucumuz için gereksiz olan bir grup alanı okuyacaktır. Bunun tersine, sütun tabanlı bir düzen, verileri diskte sütunlar halinde depolar. Rockset'in Yakınsanmış Dizini, verileri sütun tabanlı bir düzende depolamak için sütunlu bir dizin kullanır. Sütun tabanlı düzende veriler sütunlarla birlikte depolanır. Bireysel bir kayıt, indekslenmek üzere kendisini oluşturan sütunlara bölünür. Sorgumun çok sayıda kayıt için "miktar" özelliğini toplamak üzere bir toplama yapması gerekiyorsa, Rockset bunu sütunlu endeksin "miktar" kısmını basitçe tarayarak yapabilir. Bu, satır tabanlı düzenlere kıyasla okunan ve işlenen veri miktarını büyük ölçüde azaltır. Rockset'in sütunlu indeksinin varsayılan olarak bir sütun içindeki nitelikleri sıralamayacağını unutmayın. Belirli bir müşterinin verileri üzerinde çalışacak, kullanıcıya dönük kullanım durumlarımız olduğundan, sütunlu dizini kullanırken taranacak veri miktarını azaltmak için sütunlu dizini müşteriye göre düzenlemeyi tercih ederiz. Rockset, buna yardımcı olmak için sağlar. Kümeleme ile sütunlu dizinimizin "organizasyon" özelliğine göre kümelenmesini istediğimizi belirtebiliriz. Bu, tüm sütun değerlerini sütunlu dizinler içinde kuruluşa göre gruplayacaktır. Böylece, Vandelay Industries verileri üzerinde bir toplama yaparken Rockset'in sorgu işlemcisi diğer müşteriler için sütunlu endeksin bölümlerini atlayabilir. sütunlu dizininizde veri kümeleme Rockset'in Satır Tabanlı Dizini İşlemeye Nasıl Yardımcı Olur? Uygulamamızda sütunlu indeks kullanımına geçmeden önce Rockset Converged Index'in bir başka yönünden bahsetmek istiyorum. Daha önce tam kayıtların alınmasında satır tabanlı düzenlerin kullanıldığından bahsetmiş ve hem DynamoDB'nin hem de Rockset ters dizin sorgularımızın bu düzenleri kullandığını belirtmiştim. Bu yalnızca kısmen doğrudur. Ters çevrilmiş dizin, herhangi bir özniteliğe göre verimli aramalar için sütun adlarını ve değerlerini bir arada sakladığından, sütun tabanlı dizinle bazı benzerliklere sahiptir. Her dizin girişi, verilen sütun adını ve değer birleşimini içeren kayıtların kimliklerine yönelik bir işaretçi içerir. İlgili ID veya ID'ler ters çevrilmiş indeksten keşfedildikten sonra Rockset, satır indeksini kullanarak tüm kaydı alabilir. Rockset, veri depolama boyutunu en aza indirmek için sözlük kodlamayı ve diğer gelişmiş sıkıştırma tekniklerini kullanır. Böylece Rockset'in Yakınsanmış Endeksi'nin nasıl birbirine uyduğunu gördük: belirli bir sütundaki çok sayıda değeri toplama amacıyla hızlı bir şekilde taramak için kullanılır; Sütun tabanlı dizin, herhangi bir sütun adı ve değerindeki seçici filtreler için kullanılır; Tersine çevrilmiş dizin, projeksiyon cümlesinde başvurulabilecek ek nitelikleri getirmek için kullanılır. Satır tabanlı dizin, Rockset'in güçlü indeksleme ve sorgulama motoru, verilerinizin istatistiklerini takip ediyor ve sorgunuzu verimli bir şekilde yürütmek için en uygun planları üretiyor. Uygulama: Uygulamanızda Rockset Query Lambda'ları kullanma Sütunlu dizini kullanan Rockset toplama sorgumuzu uygulayalım. Bir önceki sorgumuz için SQL sorgumuzu doğrudan Rockset API'sine yazmıştık. Bu, son derece özelleştirilebilir bazı kullanıcı arayüzlerinde yapılacak doğru şey olsa da, SQL kodunun daha statik olduğu durumlarda daha iyi bir seçenek vardır. Dağınık SQL kodumuzu uygulama mantığımızın ortasında tutmaktan kaçınmak istiyoruz. Buna yardımcı olmak için Rockset'in Sorgu Lambdaları adı verilen bir özelliği vardır. Sorgu Lambdaları, Rockset konsolunda kayıtlı, adlandırılmış, sürümü belirlenmiş, parametrelendirilmiş sorgulardır. Rockset'te bir Sorgu Lambdası yapılandırdıktan sonra, Rockset tarafından yürütülecek parametrelerinizle çağırabileceğiniz Sorgu Lambdası için tam olarak yönetilen, ölçeklenebilir bir uç nokta alacaksınız. Dahası, her bir Sorgu Lambda'sı için izleme istatistikleri bile alacaksınız, böylece siz değişiklik yaparken Sorgu Lambda'nızın nasıl performans gösterdiğini takip edebileceksiniz. edinebilirsiniz, ancak toplama sorgumuzu işlemek için ilk Sorgu Lambdamızı ayarlayalım. . Burada Sorgu Lambdaları hakkında daha fazla bilgi Uygulama deposunda tam bir izlenecek yol bulunabilir Rockset konsolunun gidin. Aşağıdaki sorguyu düzenleyiciye yapıştırın: Sorgu Düzenleyicisi bölümüne SELECT category, EXTRACT( month FROM transactionTime ) as month, EXTRACT( year FROM transactionTime ) as year, TRUNCATE(sum(amount), 2) AS amount FROM Transactions WHERE organization = :organization AND transactionTime > CURRENT_TIMESTAMP() - INTERVAL 3 MONTH GROUP BY category, month, year ORDER BY category, month, year DESC Bu sorgu, belirli bir kuruluş için son üç aydaki işlemleri, verilen kategoriye ve işlemin yapıldığı aya göre gruplar halinde gruplandırır. Daha sonra, her ay harcanan toplam tutarı bulmak için kategoriye ait değerleri aya göre toplar. Sorgudaki ":organizasyon" sözdiziminde belirtildiği gibi, "organizasyon" özelliği için bir parametre içerdiğine dikkat edin. Bu, sorguyu yürütmek için bir kuruluş değerinin aktarılması gerektiğini belirtir. Sorguyu Rockset konsolunda Query Lambda olarak kaydedin. Ardından bakın. Sorgu Lambda'yı ismine göre çağırır ve kullanıcı tarafından verilen "organizasyon" özelliğini aktarır. TransactionService sınıfımızdaki fetchTransactionsByCategoryAndMonth koduna Bu, uygulamamızda işlenmesi çok daha basit bir koddur. Ayrıca Rockset, her Query Lambda için sürüm kontrolü ve sorguya özel izleme sağlar. Bu, sorgularınızı zaman içinde korumanızı ve sorgu söz dizimindeki değişikliklerin performansı nasıl etkilediğini anlamanızı kolaylaştırır. Çözüm Bu yazıda kullanıcılarımıza hızlı ve keyifli bir uygulama deneyimi oluşturmak için DynamoDB ve Rockset'i nasıl birlikte kullanabileceğimizi gördük. Bunu yaparken hem kavramsal temelleri hem de uygulamamızı hayata geçirmenin pratik adımlarını öğrendik. İlk olarak uygulamamızın temel işlevlerini yerine getirmek için DynamoDB'yi kullandık. Bu, belirli bir müşteri için işlem akışının alınması veya bireysel bir işlemin görüntülenmesi gibi erişim modellerini içerir. DynamoDB'nin birincil anahtar tabanlı bölümleme stratejisi sayesinde her ölçekte tutarlı performans sağlayabilmektedir. Ancak DynamoDB'nin tasarımı aynı zamanda esnekliğini de sınırlıyor. Çok sayıda kayıttaki rastgele alanlar veya toplamalar üzerindeki seçmeli sorguları işleyemez. Bu kalıpları ele almak için Rockset'i kullandık. Rockset, veri ağırlıklı uygulamalara güç sağlamak için tam olarak yönetilen bir ikincil dizin sağlar. Rockset'in, verilerinizi ters çevrilmiş, sütunlu ve satır indekslemeyi birleştiren Yakınsanmış Dizinde indeksleyen birincil veri deponuzdan sürekli bir alım hattını nasıl koruduğunu gördük. Kalıplarımızı incelerken, Rockset'in indeksleme tekniklerinin her birinin, keyifli kullanıcı deneyimlerini yönetmek için birlikte nasıl çalıştığını gördük. Son olarak Rockset'i DynamoDB tablomuza bağlamak ve uygulamamızda Rockset ile etkileşime geçmek için pratik adımları inceledik. Ayrıca görünür. burada