DynamoDB taramam yalnızca 1 sağlanan okuma kapasitesi birimiyle neden bu kadar hızlı?

Aug 19 2020

Her bir öğenin boyutu 4 KB'tan küçük olan 1346 öğeden oluşan bir masa yaptım. 1 okuma kapasitesi birimi sağladım, bu nedenle saniyede ortalama 1 öğe okunmasını bekliyorum. Ancak, 1346 öğenin tümünün basit bir taraması neredeyse anında geri döner.

Burada neyi özlüyorum?

Yanıtlar

4 ChrisWilliams Aug 19 2020 at 14:24

Bu, büyük olasılıkla ani işlemler için kullanmak üzere 300 saniyelik bir süre içinde kapasitenizi kazandığınız patlama kapasitesine bağlıdır (tüm tabloyu tarama gibi).

Bu, tüm bu kredileri kullanırsanız, yeterli kapasiteye sahip olmadıkları için diğer etkileşimlerin zarar göreceği anlamına gelir.

Tüketilen WCU / RCU miktarını CloudWatch ölçümleri aracılığıyla veya DynamoDB arayüzünün kendisinde (Metrics sekmesi aracılığıyla) görebilirsiniz.

2 Charles Aug 19 2020 at 22:43

Girişleriniz için "her bir öğenin 4KB'den küçük olması" dışında bir boyut vermiyorsunuz. Ne kadar az?

1 RCU, 4KB'ye kadar olan öğelerin saniyede 2 tutarlı okumasını destekleyecektir.

Başka bir deyişle, 1 RCU ve nihayetinde tutarlı okumalar ile saniyede 8 KB veri okuyabilirsiniz.

Kayıtlarınız 4KB ise, 2 kayıt / sn
1KB, 8 / sn
512B, 16 / sn
256B, 32 / sn alıyorsunuz

Bu nedenle, daha önce bahsedilen "patlama" özelliği, 55 RCU kullanmanıza izin verdi. Ancak kayıtlarınızın küçük boyutu, 55 RCU'nun verileri "neredeyse anında" döndürmesine izin verdi.

1 NadavHar'El Aug 20 2020 at 18:01

Burada sizin lehinize çalışan iki şey var - birincisi, bir Scanoperasyonun küçük eşyalar için düşündüğünüzden çok daha az RCU gerektirmesidir. Diğeri de "patlama kapasitesi" dir. İkisini de açıklamaya çalışacağım:

DynamoDB fiyatlandırma sayfası "boyutunda 4 KB öğeler için bir RCU saniyede iki sonunda tutarlı okuma isteklerini gerçekleştirebilir." Diyor. Bu, öğenin boyutu 10 bayt olsa bile, nihai tutarlılıkla onu okumanın yarım RCU'ya mal olduğunu gösterir. Ancak, bunu hiçbir yerde belirtmeseler de, bu maliyet yalnızca bir GetItemişlemin tek bir öğeyi alması için geçerlidir . Bir Scanveya Querysatırında, her bir öğe için ayrı ayrı ödeme yapmadığınız ortaya çıkıyor. Bunun yerine, bu işlemler diskte depolanan verileri sırayla tarar ve bu şekilde okunan veri miktarı için ödeme yaparsınız. 1000 küçücük ürün ve varsa toplam DynamoDB diskten okumak zorunda boyutu 80KB, sen 80KB / 4KB'dir / 2 ya da 10 rcus ödeyecek değil 500 rcus.

Bu, neden 1346 öğe okuduğunuzu ve 1346/2 = 673 değil, yalnızca 55 RCU ölçtüğünüzü açıklıyor.

Sizin lehinize çalışan ikinci şey, DynamoDB'nin burada açıklanan "patlama kapasitesi" özelliğine sahip olmasıdır :

DynamoDB şu anda 5 dakikaya (300 saniye) kadar kullanılmayan okuma ve yazma kapasitesini koruyor. Ara sıra gerçekleşen bir okuma veya yazma etkinliği patlaması sırasında, bu ekstra kapasite birimleri hızlı bir şekilde, hatta tablonuz için tanımladığınız saniye başına sağlanan iş hacmi kapasitesinden daha hızlı tüketilebilir.

Dolayısıyla, veritabanınız isteğinizden 5 dakika önce mevcutsa, DynamoDB sizin için 300 RCU kaydetti ve bunu çok hızlı bir şekilde kullanabilirsiniz. 300 RCU, taramanız için ihtiyaç duyduğunuzdan çok daha fazla olduğu için (55), taramanız çok hızlı bir şekilde, kısılmadan gerçekleşti.

1 SudhirJonathan Aug 24 2020 at 13:45

Bir sorgu yaptığınızda, RCU sayısı, okunan öğelerin sayısı dikkate alınmadan okunan veri miktarına uygulanır . Dolayısıyla, öğeleriniz küçükse, her biri birkaç bayt diyelim, tek bir 4KB RCU'da kolayca sorgulanabilir.

Bu, özellikle DynamoDB'den birçok öğe okurken kullanışlıdır. Pek çok küçük öğeyi sorgulamanın, BatchGetting'den çok daha ucuz ve daha verimli olduğu hemen belli değil.